[metacat-cvs] metacat/lib/spatial/openlayers/tools README.txt jsmin.c jsmin.py mergejs.py shrinksafe.py toposort.py

Mathew Perry perry at ecoinformatics.org
Thu Aug 31 16:14:46 PDT 2006


perry       06/08/31 16:14:45

  Added:       lib/spatial kml.jsp map.jsp metacat_spatialresolver.jsp
                        wfs.jsp wfs.xsl
               lib/spatial/WEB-INF taglibs-xtags.tld web.xml.combined
               lib/spatial/WEB-INF/lib dom4j-1.6.1.jar
               lib/spatial/geoserver style.css
               lib/spatial/geoserver/META-INF MANIFEST.MF
               lib/spatial/geoserver/META-INF/maven/org.geoserver/web
                        pom.properties pom.xml
               lib/spatial/geoserver/WEB-INF action-servlet.xml catalog.xml
                        catalog.xml.dist dispatcher-servlet.xml
                        log4j.properties
                        org.openplans.geoserver-servlet.xml services.xml
                        struts-bean.tld struts-config.xml struts-html.tld
                        struts-logic.tld struts-nested.tld
                        struts-template.tld struts-tiles.tld tiles-defs.xml
                        validation.xml validator-rules.xml web.xml
               lib/spatial/geoserver/WEB-INF/classes
                        ApplicationResources.properties
                        ApplicationResources_es.properties
                        ApplicationResources_fr.properties
                        ApplicationResources_ja.properties
                        applicationContext.xml commons-logging.properties
               lib/spatial/geoserver/WEB-INF/classes/org/geoserver/request
                        Dispatcher.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action
                        AdminIndexAction.class ConfigAction.class
                        DemoAction.class DemoRequestAction.class
                        FreeLocksAction.class FreeMemoryAction.class
                        GeoServerAction.class HTMLEncoder.class
                        LoadXMLAction.class LoginAction.class
                        LoginEditAction.class LogoutAction.class
                        MapPreviewAction.class SaveXMLAction.class
                        SrsHelpAction.class UpdateGSAction.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data
                        CalculateBoundingBoxAction.class
                        DataDataStoresEditorAction.class
                        DataDataStoresNewAction.class
                        DataDataStoresSelectAction.class
                        DataFeatureTypesNewAction.class
                        DataFeatureTypesSelectAction.class
                        DataNamespacesEditorAction.class
                        DataNamespacesNewAction.class
                        DataNamespacesSelectAction.class
                        SLDWizardAction.class StylesEditorAction.class
                        StylesNewAction.class StylesSelectAction.class
                        TypesEditorAction.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/global
                        GeoServerConfigurationSubmit.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation
                        TestValidationResults.class
                        ValidationRunnable.class ValidationTestDoIt.class
                        ValidationTestEditorAction.class
                        ValidationTestNewAction.class
                        ValidationTestSelectAction.class
                        ValidationTestSuiteNewAction.class
                        ValidationTestSuiteSelectAction.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/wfs
                        WFSContentAction.class WFSDescriptionAction.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/wms
                        WMSContentAction.class WMSDescriptionAction.class
                        WMSRenderingAction.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form
                        DemoForm.class DemoRequestForm.class
                        LoginForm.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data
                        AttributeDisplay.class AttributeForm.class
                        DataDataStoresEditorForm.class
                        DataDataStoresNewForm.class
                        DataDataStoresSelectForm.class
                        DataFeatureTypesEditorForm.class
                        DataFeatureTypesNewForm.class
                        DataFeatureTypesSelectForm.class
                        DataNamespacesEditorForm.class
                        DataNamespacesNewForm.class
                        DataNamespacesSelectForm.class SLDWizardForm.class
                        StylesEditorForm.class StylesNewForm.class
                        StylesSelectForm.class TypesEditorForm.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/global
                        GeoServerConfigurationForm.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/validation
                        ValidationTestEditorForm.class
                        ValidationTestNewForm.class
                        ValidationTestSelectForm.class
                        ValidationTestSuiteNewForm.class
                        ValidationTestSuiteSelectForm.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/wfs
                        WFSContentForm.class WFSDescriptionForm.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/wms
                        WMSContentForm.class WMSDescriptionForm.class
                        WMSRenderingForm.class
               lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/global
                        ApplicationState.class
               lib/spatial/geoserver/WEB-INF/images colorpicker.jpg
                        delete.png deleteRed.png down.png gs.gif gs.ico
                        up.png
               lib/spatial/geoserver/WEB-INF/jsp include.jsp
               lib/spatial/geoserver/WEB-INF/lib antlr-2.7.2.jar
                        aopalliance-1.0.jar batik-awt-util-1.6.jar
                        batik-svggen-1.6.jar batik-transcoder-1.5.jar
                        batik-util-1.6.jar commons-beanutils-1.7.0.jar
                        commons-collections-2.1.jar
                        commons-digester-1.7.jar commons-fileupload-1.0.jar
                        commons-httpclient-2.0.jar commons-lang-2.1.jar
                        commons-logging-1.0.3.jar
                        commons-validator-1.1.4.jar concurrent-1.3.4.jar
                        data-1.4.0-M1.jar geoapi-2.0.jar gt2-api-2.2.0.jar
                        gt2-coverage-2.2.0.jar gt2-demo-property-2.2.0.jar
                        gt2-epsg-wkt-2.2.0.jar gt2-graph-2.2.0.jar
                        gt2-main-2.2.0.jar gt2-postgis-2.2.0.jar
                        gt2-referencing-2.2.0.jar gt2-render-2.2.0.jar
                        gt2-shapefile-2.2.0.jar gt2-validation-2.2.0.jar
                        itext-1.3.jar jai-core-1.1.3-alpha.jar
                        jai_codec-1.1.3-alpha.jar jai_imageio-1.1-alpha.jar
                        jdom-1.0.jar jsr108-0.01.jar jstl-1.0.jar
                        jts-1.7.1.jar junit-3.8.1.jar log4j-1.2.9.jar
                        lucene-1.4.3.jar main-1.4.0-M1.jar oro-2.0.8.jar
                        platform-1.4.0-M1.jar postgis-driver-1.0.jar
                        postgresql-8.1-407.jdbc3.jar spring-aop-1.2.5.jar
                        spring-beans-1.2.5.jar spring-context-1.2.5.jar
                        spring-core-1.2.5.jar spring-web-1.2.5.jar
                        spring-webmvc-1.2.5.jar standard-1.0.6.jar
                        struts-1.2.9.jar validation-1.4.0-M1.jar
                        vecmath-1.3.1.jar wfs-1.4.0-M1.jar
                        wkb4j-1.0-RC1-modified.jar wms-1.4.0-M1.jar
                        xalan-2.7.0.jar xercesImpl-2.4.0.jar
                        xml-apis-1.0.b2.jar
               lib/spatial/geoserver/WEB-INF/pages Administration.jsp
                        Configuration.jsp ContactInformation.jsp Demo.jsp
                        GeoServerConfiguration.jsp Login.jsp SLDWizard.jsp
                        SystemConfigMenu.jsp Welcome.jsp actionator.jsp
                        blank.jsp configActions.jsp demoRequest.jsp
                        index.jsp locator.jsp loginEditor.jsp
                        mainPreview.html mainPreviewData.html
                        mapPreview.jsp menuator.jsp messages.jsp
                        schemaErrors.jsp srsList.jsp status.jsp
                        styleClassic.css styleNew.css
               lib/spatial/geoserver/WEB-INF/pages/data
                        DataConfigDataStoresEditor.jsp
                        DataConfigDataStoresNew.jsp
                        DataConfigDataStoresSelect.jsp DataConfigStyles.jsp
                        DataMenu.jsp status.jsp
               lib/spatial/geoserver/WEB-INF/pages/data/featureTypes
                        Editor.jsp New.jsp Select.jsp
                        featureTypeActions.jsp
               lib/spatial/geoserver/WEB-INF/pages/data/featureTypes/attributeTypes
                        Editor.jsp New.jsp Select.jsp
               lib/spatial/geoserver/WEB-INF/pages/data/namespaces
                        Editor.jsp New.jsp Select.jsp
               lib/spatial/geoserver/WEB-INF/pages/data/styles Editor.jsp
                        New.jsp Select.jsp
               lib/spatial/geoserver/WEB-INF/pages/errors Exception.jsp
               lib/spatial/geoserver/WEB-INF/pages/layouts
                        featureTypesLayout.jsp mainLayout.jsp
               lib/spatial/geoserver/WEB-INF/pages/validation
                        SelectTest.jsp SelectTestSuite.jsp TestEditor.jsp
                        displayResults.jsp
               lib/spatial/geoserver/WEB-INF/pages/wfs WFSConfigContent.jsp
                        WFSConfigDescription.jsp WFSConfigMenu.jsp
                        serviceName.jsp status.jsp
               lib/spatial/geoserver/WEB-INF/pages/wms WMSConfigContent.jsp
                        WMSConfigDescription.jsp WMSConfigMenu.jsp
                        WMSConfigRendering.jsp serviceName.jsp status.jsp
               lib/spatial/geoserver/WEB-INF/tld spring.tld
               lib/spatial/geoserver/data/demo WFS_describeFeatureType.xml
                        WFS_getCapabilities.xml WFS_getFeature.xml
                        WFS_getFeatureBBOX.xml WFS_getFeatureBetween.xml
                        WFS_getFeatureIntersects.xml WFS_mathGetFeature.xml
                        WFS_transactionDelete.xml WFS_transactionInsert.xml
                        WFS_transactionUpdate.xml
                        WFS_transactionUpdateGeom.xml
                        WMS_GetLegendGraphic-SLD.url
                        WMS_GetLegendGraphic-SLD_BODY.url
                        WMS_GetLegendGraphic.url WMS_describeLayer.url
                        WMS_featureInfo.url WMS_getCapabilities.url
                        WMS_getMap.url WMS_getMap_SLD_BODY_LiteralMode.url
                        WMS_getMap_SVG.url
               lib/spatial/geoserver/data/featureTypes/Data_Bounds_data_bounds
                        info.xml
               lib/spatial/geoserver/data/featureTypes/Data_Points_data_points
                        info.xml
               lib/spatial/geoserver/data/featureTypes/countries_world_borders
                        info.xml
               lib/spatial/geoserver/data/featureTypes/kruger_bizunits_BNDRY_BUSINESSUNITS
                        info.xml
               lib/spatial/geoserver/data/featureTypes/kruger_boundary_BNDRY_KRUGERNP
                        info.xml
               lib/spatial/geoserver/data/featureTypes/kruger_roads_INFRA_ROADSPUBLIC_VIEW
                        info.xml
               lib/spatial/geoserver/data/featureTypes/kruger_soils_SOILS_VENTER
                        info.xml
               lib/spatial/geoserver/data/featureTypes/states info.xml
               lib/spatial/geoserver/data/metacat_shps data_bounds.dbf
                        data_bounds.prj data_bounds.shp data_bounds.shx
                        data_points.dbf data_points.prj data_points.shp
                        data_points.shx metacat_testdata.dbf
                        metacat_testdata.shp metacat_testdata.shx
               lib/spatial/geoserver/data/plugIns AddressGap.xml
                        AddressOverlap.xml AngleSize.xml Attribute.xml
                        Constraint.xml ContainsIntegrity.xml
                        CrossesIntegrity.xml DisjointIntegrity.xml
                        Domain.xml Equality.xml GazetteerName.xml
                        IntersectsIntegrity.xml IsValidGeometry.xml
                        LineCoveredByFeatureLine.xml
                        LineCoveredByPolygon.xml
                        LineCoveredByPolygonBoundary.xml
                        LineEndPointCoveredByLine.xml
                        LineIntersectsLineWithNode.xml
                        LineMustBeASinglePart.xml LineNoDangles.xml
                        LineNoPseudoNode.xml LineNoSelfIntersect.xml
                        LineNoSelfOverlapping.xml
                        LineNotTouchingPolygonInterior.xml
                        LinesNotIntersect.xml LinesNotOverlap.xml
                        NameExists.xml NameInList.xml NullZero.xml
                        OverlapsIntegrity.xml
                        PointCoveredByEndPointOfLine.xml
                        PointCoveredByLine.xml PointCoveredByPolygon.xml
                        PointCoveredByPolygonBoundary.xml
                        PointInsidePolygon.xml
                        PolygonBoundaryCoveredByPolygon.xml
                        PolygonCoveredByFeaturePolygon.xml
                        PolygonCoveredByPolygon.xml PolygonNoGaps.xml
                        PolygonNotCoveredByPolygon.xml
                        PolygonNotOverlappingLine.xml
                        PolygonNotOverlappingPolygon.xml Range.xml
                        RelateIntegrity.xml SQL.xml SingleValue.xml
                        StarNode.xml TouchesIntegrity.xml UniqueFID.xml
                        Uniquity.xml WithinIntegrity.xml
               lib/spatial/geoserver/data/shp BNDRY_BUSINESSUNITS.dbf
                        BNDRY_BUSINESSUNITS.prj BNDRY_BUSINESSUNITS.sbn
                        BNDRY_BUSINESSUNITS.sbx BNDRY_BUSINESSUNITS.shp
                        BNDRY_BUSINESSUNITS.shp.xml BNDRY_BUSINESSUNITS.shx
                        BNDRY_KRUGERNP.dbf BNDRY_KRUGERNP.prj
                        BNDRY_KRUGERNP.sbn BNDRY_KRUGERNP.sbx
                        BNDRY_KRUGERNP.shp BNDRY_KRUGERNP.shp.xml
                        BNDRY_KRUGERNP.shx INFRA_ROADSPUBLIC_VIEW.dbf
                        INFRA_ROADSPUBLIC_VIEW.prj
                        INFRA_ROADSPUBLIC_VIEW.sbn
                        INFRA_ROADSPUBLIC_VIEW.sbx
                        INFRA_ROADSPUBLIC_VIEW.shp
                        INFRA_ROADSPUBLIC_VIEW.shp.xml
                        INFRA_ROADSPUBLIC_VIEW.shx SOILS_VENTER.dbf
                        SOILS_VENTER.prj SOILS_VENTER.sbn SOILS_VENTER.sbx
                        SOILS_VENTER.shp SOILS_VENTER.shp.xml
                        SOILS_VENTER.shx kruger_bnd.ZIP states.dbf
                        states.prj states.shp states.shx world_borders.dbf
                        world_borders.prj world_borders.shp
                        world_borders.shx
               lib/spatial/geoserver/data/styles Lakes.sld NamedPlaces.sld
                        capitals.sld data_bounds_style.sld
                        data_points_style.sld default_line.sld
                        default_line2.sld default_point.sld
                        default_polygon.sld giant_polygon.sld
                        grass_fill.png grass_poly.sld green.sld poi.sld
                        poly_landmarks.sld popshade.sld simpleRoads.sld
                        tiger_roads.sld
               lib/spatial/geoserver/data/validation FeatureCheck.xml
                        IntegrityCheck.xml
               lib/spatial/geoserver/schemas/filter/1.0.0 expr.xsd
                        filter.xsd filterCapabilities.xsd
               lib/spatial/geoserver/schemas/gml/2.1.2 feature.xsd
                        geometry.xsd xlinks.xsd
               lib/spatial/geoserver/schemas/sld GetMap.xsd
                        StyledLayerDescriptor.xsd expr.xsd feature.xsd
                        filter.xsd geometry.xsd xlinks.xsd
               lib/spatial/geoserver/schemas/validate pluginSchema.xsd
                        testSuiteSchema.xsd
               lib/spatial/geoserver/schemas/wfs/1.0.0 OGC-exception.xsd
                        WFS-basic.xsd WFS-capabilities.xsd
                        WFS-transaction.xsd
               lib/spatial/geoserver/schemas/wms/1.1.1 OGC-exception.xsd
                        WMS_DescribeLayerResponse.dtd
                        WMS_MS_Capabilities.dtd WMS_exception_1_1_1.dtd
               lib/spatial/mapbuilder CHANGES LGPL LICENSE
                        MapbuilderProxy.jsp README index.html wfs.jsp
               lib/spatial/mapbuilder/demo index.html
               lib/spatial/mapbuilder/demo/Demis BlueMarble.xml
                        CollectionList.xsl DemisWorldMap.xml USAMap.xml
                        atlasWorld.xml config.xml index.html
                        mapCollection.xml
               lib/spatial/mapbuilder/demo/australian_weather config.xml
                        context.xml index.html
               lib/spatial/mapbuilder/demo/basic config.xml index.html
               lib/spatial/mapbuilder/demo/complete complete.jsp
                        completeConfig.xml index.html
               lib/spatial/mapbuilder/demo/contextEditor
                        OWSCatResourceFilter.xml OWSCatResultList.xsl
                        OWSCatSearchForm.js contextEditor.css
                        contextEditor.xml contextEditor_1.xml index.html
                        owsCatSearchForm.xsl searchConfig.xml tabList.css
               lib/spatial/mapbuilder/demo/data/context DM_Canada.xml
                        SLDParamExample.xml atlasWorld.xml boston.xml
                        cded.xml cite.xml cite_deegree.xml
                        demisWorldMap.xml demoCollection.xml local.xml
                        locatorCanada.xml locatorMap.xml lsat7Ortho.xml
                        mars.xml modisWorld.xml radarsatMosaic.xml
               lib/spatial/mapbuilder/demo/data/gml NTSLookup.xml Test.xml
                        defaultAddLine.xml defaultAddPoint.xml roads.xml
                        states.xml topp_cities.xml
               lib/spatial/mapbuilder/demo/data/locations Canada-42304.xml
                        Canada.xml Global.xml
               lib/spatial/mapbuilder/demo/forms forms.xml index.html
               lib/spatial/mapbuilder/demo/geoRSS GeoRSSListing.xsl
                        GeoRSSListing2.xsl build.xml cambridge.xml
                        config.xml config2.xml geoRSS.xml index.html
                        index2.html
               lib/spatial/mapbuilder/demo/geoRSSPlus FeatureFactory.js
                        FeaturePointFactory.js GeoRSSListing.xsl
                        GeoRSSListing2.xsl GmlPointRenderer.js
                        Mapbuilder.js Popup.js build.xml cambridge.xml
                        config.xml config2.xml geoRSS.xml index.html
                        index2.html popup.xsl
               lib/spatial/mapbuilder/demo/metacat index.jsp
               lib/spatial/mapbuilder/demo/metacat/locations
                        Canada-42304.xml Canada.xml Global.xml
               lib/spatial/mapbuilder/demo/metacat/templates basic.html
                        basic.xml basic_layers.html basic_layers.xml
                        default.html default.xml
               lib/spatial/mapbuilder/demo/metacat/wmc demisWorldMap.xml
                        knp.xml modisWorld.xml world.xml
               lib/spatial/mapbuilder/demo/metacat_knp africa_frame.html
                        africa_frame_config.xml africa_frame_model.xml
                        available_layers.html available_layers_config.xml
                        available_layers_model.xml config-bak.xml
                        config.xml config.xml.new hide_map.gif index.html
                        kruger_frame.html kruger_frame_config.xml
                        kruger_frame_model.xml left_arrow.gif metacat.xml
                        metacat_query.html metacat_query_config.xml
                        metacat_query_model.xml pma.html pma2.html
                        pma3.html pma4.html right_arrow.gif show_map.gif
                        template_cities.xml template_metacat.xml
                        template_metacat_query.xml template_road.xml
                        world_frame.html world_frame_config.xml
                        world_frame_model.xml
               lib/spatial/mapbuilder/demo/metacat_knp/knb/style/common
                        branding.js
               lib/spatial/mapbuilder/demo/metacat_knp/knb/style/skins/knb
                        knb.css knb.js
               lib/spatial/mapbuilder/demo/owsContext cite.xml index.html
                        locatorBoston.xml ocClass4.xml oc_0_0_13r1.xml
                        owsContext.xml tasmania.xml
               lib/spatial/mapbuilder/demo/simple config.xml index.html
               lib/spatial/mapbuilder/demo/timeSeries Abstract.xsl
                        index.html timeSeriesCollection.xml
                        tsAfricaFires.xml tsChinaDustStorm.xml tsConfig.xml
                        tsEstPrecip.xml tsEstPrecip10Day.xml tsGeocomp.xml
                        tsIFGITemp.xml tsOzoneMLS.xml tsPrecipAnomaly.xml
                        tsWorldTemp.xml tsYellowstoneFires.xml
               lib/spatial/mapbuilder/demo/wfs-t config.xml index.html
                        install.html tasmania.xml template_cities.xml
                        template_road.xml
               lib/spatial/mapbuilder/demo/wpsIE ExecuteRequest.xml
                        ExecuteRequestResponse.xml IFGITemp.xml
                        ModelUrlInput.xsl PCIwpsCaps.xml
                        PCIwpsExecuteResponse.xml PCIwpsProcessDesc.xml
                        ProcessArgumentsForm.js ProcessArgumentsForm.xsl
                        ResourceDropDown.js ResourceDropDown.xsl
                        SelectProcess.xsl ShowProcessResult.js
                        ShowProcessResult.xsl eastOntBirds.xml index.html
                        tabList.css wpsCapabilities.xml wpsDemoConfig.xml
                        wpsDescribeProcess.xml wpsStyle.css
               lib/spatial/mapbuilder/docs arrow.gif footer.html intro.html
                        mapSources.html reference.html sidebar.html
                        userGuide.css userGuideServlet.jsp
                        userGuideServletStatic.jsp
               lib/spatial/mapbuilder/docs/config config.html extend.html
                        listeners.html mvc.html opvRule.html patterns.html
                        skins.html
               lib/spatial/mapbuilder/docs/developersguide README
                        entities.ent generconfig.xml index.html release.xml
               lib/spatial/mapbuilder/docs/help IEActiveXSettings.png
                        IESetup.html IETrusted.png
               lib/spatial/mapbuilder/docs/presentations
                        OSG05TechSession.ppt StateOfPlay.xml
                        TimeSeriesEOGEO05.ppt
               lib/spatial/mapbuilder/docs/register ObjectDetails.xsl
                        ObjectList.js ObjectList.xsl components.xml
                        config.xml index.html register.xsl
                        registerConfig.xml registerStyle.css
               lib/spatial/mapbuilder/docs/register/context atlasWorld.xml
               lib/spatial/mapbuilder/docs/samples demoCollection.xml
                        intro.html tutorial1.html tutorial1.xml
                        tutorial2.html tutorial2.xml tutorial3.html
                        tutorial3.xml tutorial4.html tutorial4.xml
                        tutorial5.html tutorial5.xml
               lib/spatial/mapbuilder/docs/start apache.html browsers.html
                        geoserver.html install.html server.html start.html
                        tomcat.html troubleshoot.html
               lib/spatial/mapbuilder/lib LoadScripts.xsl Mapbuilder.js
                        MapbuilderServerLoad.js
               lib/spatial/mapbuilder/lib/model Config.js Context.js
                        ContextCollection.js FeatureCollection.js
                        FeatureTypeSchema.js GeoRSS.js GetMap.js Logger.js
                        Model.js ModelBase.js OwsCatResources.js
                        OwsContext.js Proj.js Transaction.js
                        WfsCapabilities.js WmsCapabilities.js
                        WpsCapabilities.js WpsDescribeProcess.js
               lib/spatial/mapbuilder/lib/schemas config.xsd context.xsd
                        locations.xsd
               lib/spatial/mapbuilder/lib/skin/blue button.css
                        docsStyle.css mapStyle.css scalebar-fancy.css
                        scalebar-fat.css scalebar-thin.css tabList.css
               lib/spatial/mapbuilder/lib/skin/blue/en widgetText.xml
               lib/spatial/mapbuilder/lib/skin/blue/fr widgetText.xml
               lib/spatial/mapbuilder/lib/skin/blue/images
                        ButtonTemplateDisable.png ButtonTemplateEnable.png
                        DeleteFeatureDisable.png DeleteLayer.png Dot.gif
                        EditLineDisable.png EditLineEnable.png
                        EditPointDisable.png EditPointEnable.png
                        EditPolygonDisable.png EditPolygonEnable.png
                        Icon.gif LayerMoveDownDisable.png
                        LayerMoveUpDisable.png LayerRemoveDisable.png
                        Loading.gif MarkerA.gif MarkerB.gif
                        MoveLayerDown.png MoveLayerUp.png PanDisable.png
                        PanEnable.png PauseDisable.png PauseEnable.png
                        PlayDisable.png PlayEnable.png QueryDisable.png
                        QueryEnable.png RedoDisable.png
                        ResetExtentDisable.png ResetExtentEnable.png
                        RewindDisable.png RewindEnable.png SaveDisable.png
                        SetAoiDisable.png SetAoiEnable.png Spacer.gif
                        StepBack.png StepForward.png StopDisable.png
                        StopEnable.png UndoDisable.png ZoomInDisable.png
                        ZoomInEnable.png ZoomOutDisable.png
                        ZoomOutEnable.png eye.gif id.gif yellow_bullet.gif
               lib/spatial/mapbuilder/lib/skin/default button.css
                        docsStyle.css mapStyle.css scalebar-fancy.css
                        scalebar-fat.css scalebar-thin.css tabList.css
               lib/spatial/mapbuilder/lib/skin/default/en widgetText.xml
               lib/spatial/mapbuilder/lib/skin/default/fr widgetText.xml
               lib/spatial/mapbuilder/lib/skin/default/images
                        ButtonTemplateDisable.gif ButtonTemplateEnable.gif
                        DeleteDisable.png DeleteEnable.png
                        DeleteFeatureDisable.gif DeleteLayer.gif Dot.gif
                        EditLineDisable.gif EditLineDisable.png
                        EditLineEnable.gif EditLineEnable.png
                        EditPointDisable.gif EditPointDisable.png
                        EditPointEnable.gif EditPointEnable.png
                        EditPolygonDisable.gif EditPolygonDisable.png
                        EditPolygonEnable.gif EditPolygonEnable.png
                        GeocoderDisable.png GeocoderEnable.png
                        HelpDisable.png HelpEnable.png Icon.gif
                        LayerAddDisable.png LayerAddEnable.png
                        LayerMoveDownDisable.png LayerMoveDownEnable.png
                        LayerMoveUpDisable.png LayerMoveUpEnable.png
                        LayerRemoveDisable.png LayerRemoveEnable.png
                        LegendDisable.png LegendEnable.png Loading.gif
                        MarkerA.gif MarkerB.gif MeasureDisable.png
                        MeasureEnable.png MeasurePause.png
                        MoveLayerDown.gif MoveLayerUp.gif PanDisable.gif
                        PanDisable.png PanEnable.gif PanEnable.png
                        PauseDisable.gif PauseDisable.png PauseEnable.gif
                        PauseEnable.png PlayDisable.gif PlayDisable.png
                        PlayEnable.gif PlayEnable.png QueryDisable.gif
                        QueryDisable.png QueryEnable.gif QueryEnable.png
                        README.txt RedoDisable.png RedoEnable.png
                        ResetExtentDisable.gif ResetExtentDisable.png
                        ResetExtentEnable.gif ResetExtentEnable.png
                        RewindDisable.gif RewindDisabled.png
                        RewindEnable.gif RewindEnabled.png SaveDisable.gif
                        SaveDisable.png SaveEnable.png SetAoiDisable.gif
                        SetAoiDisable.png SetAoiEnable.gif SetAoiEnable.png
                        Spacer.gif StepBack.gif StepBackwardDisable.png
                        StepBackwardEnable.png StepForward.gif
                        StepForwardDisable.png StepForwardEnable.png
                        StopDisable.gif StopDisable.png StopEnable.gif
                        StopEnable.png Template.xcf TemplateNew.xcf
                        UndoDisable.png UndoEnable.png ZoomInDisable.gif
                        ZoomInDisable.png ZoomInEnable.gif ZoomInEnable.png
                        ZoomOutDisable.gif ZoomOutDisable.png
                        ZoomOutEnable.gif ZoomOutEnable.png eye.gif id.gif
               lib/spatial/mapbuilder/lib/tool AoiMouseHandler.js
                        Caps2Context.js DragPanHandler.js EditContext.js
                        Extent.js GetFeatureInfo.xsl History.js
                        MouseClickHandler.js MovieLoop.js ToolBase.js
                        WebServiceRequest.js ZoomToAoi.js
               lib/spatial/mapbuilder/lib/tool/xsl Caps2Context.xsl
                        GetMap.xsl wcs_GetCoverage.xsl wfs_Delete.xsl
                        wfs_DescribeFeatureType.xsl wfs_GetFeature.xsl
                        wfs_Insert.xsl wfs_Transaction.xsl wfs_Update.xsl
                        wmc_AddResource.xsl wms_GetFeatureInfo.xsl
                        wms_GetMap.xsl wps_DescribeProcess.xsl
                        wps_Execute.xsl
               lib/spatial/mapbuilder/lib/util Listener.js MGRS.js Util.js
               lib/spatial/mapbuilder/lib/util/overlib overlib.js
                        overlib_anchor.js overlib_centerpopup.js
                        overlib_crossframe.js overlib_cssstyle.js
                        overlib_debug.js overlib_exclusive.js
                        overlib_followscroll.js overlib_hideform.js
                        overlib_setonoff.js overlib_shadow.js
               lib/spatial/mapbuilder/lib/util/overlib/Mini
                        overlib_anchor_mini.js overlib_centerpopup_mini.js
                        overlib_crossframe_mini.js overlib_csstyle_mini.js
                        overlib_debug_mini.js overlib_exclusive_mini.js
                        overlib_followscroll_mini.js
                        overlib_hideform_mini.js overlib_mini.js
                        overlib_setonoff_mini.js overlib_shadow_mini.js
               lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble
                        overlib_bubble.js
               lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images
                        cornerBL.gif cornerBR.gif cornerTL.gif cornerTR.gif
                        edgeB.gif edgeL.gif edgeR.gif edgeT.gif flower.gif
                        oval.gif pushpin.gif quotation.gif square.gif
               lib/spatial/mapbuilder/lib/util/sarissa Sarissa.js
                        sarissa_dhtml.js sarissa_ieemu_xpath.js
                        sarissa_ieemu_xslt.js
               lib/spatial/mapbuilder/lib/util/scalebar fancy-bar-alt.gif
                        fancy-bar.gif license.txt scalebar-fancy.css
                        scalebar-fat.css scalebar-thin.css scalebar.js
               lib/spatial/mapbuilder/lib/util/wz_jsgraphics
                        wz_jsgraphics.js
               lib/spatial/mapbuilder/lib/widget Abstract.xsl AoiBox2.js
                        AoiBoxDHTML.js AoiBoxWZ.js AoiForm.js AoiForm.xsl
                        AoiMetacatQuery.js AoiWFSQuery.js Back.js Button.js
                        Button.xsl ButtonBase.js CatSearchForm.js
                        CatSearchForm.xsl CdnWatershedForm.xsl
                        CollectionList.js CollectionList.xsl CursorTrack.js
                        CursorTrack.xsl DeleteFeature.js DragPan.js
                        EditButtonBase.js EditLine.js EditLine_1.js
                        EditPoint.js EditPoint_1.js EditPolygon.js
                        EventLog.xsl FeatureInfo.js FeatureInfo.xsl
                        FeatureList.js FeatureList.xsl FilterAttributes.js
                        FilterAttributes.xsl Forward.js GetFeatureInfo.js
                        Gml2ScreenCoords.xsl GmlCooordinates2Coord.xsl
                        GmlPointRenderer.js GmlRenderer.js GmlRenderer.xsl
                        GmlRendererSVG.js GmlRendererSVG.xsl
                        GmlRendererTest.js GmlRendererTest.xsl
                        GmlRendererWKT.js GmlRendererWKT.xsl
                        GmlRendererWZ.js GmlRendererWZ.xsl InsertFeature.js
                        LayerControl.js LayerControl.xsl Legend.js
                        Legend.xsl Loading.js Loading.xsl Loading2.js
                        Locations.js Locations.xsl MapContainerBase.js
                        MapImage.js MapImage.xsl MapPane.js MapPane.xsl
                        MapScaleBar.js MapScaleText.js MapScaleText.xsl
                        MapTitle.xsl ModelStatus.js ModelStatus.xsl
                        ModelSwitcher.js ModelUrlInput.js ModelUrlInput.xsl
                        NtsForm.xsl Null.xsl Reset.js Save.js SaveModel.js
                        SaveModel.xsl SearchForm.xsl SelectAllMapLayers.xsl
                        SelectFeatureType.xsl SelectMapLayers.xsl
                        SelectTimeFrame.js SelectTimeFrame.xsl
                        ServiceRegistryList.js ServiceRegistryList.xsl
                        SetAoi.js TabbedContent.js TabbedContent.xsl
                        TimeSeries.js Timestamp.js Timestamp.xsl
                        TransactionResponse.js TransactionResponse.xsl
                        Version.xsl WebServiceForm.js WfsGetFeature.js
                        Widget.js WidgetBase.js WidgetBase.js.txt
                        WidgetBaseWZ.js WidgetBaseXSL.js WktParser.js
                        WmsCapabilitiesImport.js WmsCapabilitiesImport.xsl
                        XmlForm.xsl XmlSchemaForm.xsl ZoomIn.js ZoomOut.js
                        owsMapPane.xsl
               lib/spatial/openlayers license.txt news.txt readme.txt
               lib/spatial/openlayers/art arrows.svg
                        layer-switcher-maximize.svg
                        layer-switcher-minimize.svg marker.svg
                        measuring-stick-off.svg measuring-stick-on.svg
                        panning-hand-off.svg panning-hand-on.svg slider.svg
                        zoom-world.svg zoombar.svg
               lib/spatial/openlayers/build OpenLayers.js README.txt
                        build.sh docs.sh library.cfg license.txt
               lib/spatial/openlayers/doc Ajax.txt Bounds.txt
                        Control.LayerSwitcher.txt Control.MouseDefaults.txt
                        Control.MouseToolbar.txt Control.PanZoom.txt
                        Control.PanZoomBar.txt Control.Permalink.txt
                        Control.Scale.txt Control.txt Icon.txt
                        Layer.Boxes.txt Layer.EventPane.txt
                        Layer.GeoRSS.txt Layer.Google.txt Layer.Grid.txt
                        Layer.HTTPRequest.txt Layer.KaMap.txt
                        Layer.Markers.txt Layer.Text.txt
                        Layer.VirtualEarth.txt Layer.WMS.txt Layer.txt
                        LonLat.txt Map.txt Marker.Box.txt Marker.txt
                        Pixel.txt Size.txt Tile.Image.txt Tile.WFS.txt
                        Tile.txt authors.txt reference.html
               lib/spatial/openlayers/examples BaseLayers.html
                        LayerSwitcher.html boxes.html ciesin.html
                        click.html controls.html doubleSetCenter.html
                        example.html freemap.html georss.html georss.xml
                        google.html kamap.html kamap.txt markerResize.html
                        markers.html markersTextLayer.html mvs.html
                        notile.html openstreetmap.html popups.html
                        proxy.cgi setextent.html test.html textfile.txt
                        tiger.html urban.html ve.html wfs.html wms.html
                        wmst.html worldwind.html xhtml.html yahoo.html
                        zoomLevels.html
               lib/spatial/openlayers/img blank.gif drag-rectangle-off.png
                        drag-rectangle-on.png east-mini.png
                        layer-switcher-maximize.png
                        layer-switcher-minimize.png marker.png
                        measuring-stick-off.png measuring-stick-on.png
                        north-mini.png panning-hand-off.png
                        panning-hand-on.png slider.png south-mini.png
                        west-mini.png zoom-minus-mini.png
                        zoom-plus-mini.png zoom-world-mini.png zoombar.png
               lib/spatial/openlayers/lib OpenLayers.js Prototype.js
               lib/spatial/openlayers/lib/OpenLayers Ajax.js BaseTypes.js
                        Control.js Events.js Feature.js Icon.js Layer.js
                        Map.js Marker.js Popup.js SingleFile.js Tile.js
                        Util.js
               lib/spatial/openlayers/lib/OpenLayers/Control
                        KeyboardDefaults.js LayerSwitcher.js LayerTabs.js
                        MouseDefaults.js MouseToolbar.js PanZoom.js
                        PanZoomBar.js Permalink.js Scale.js
               lib/spatial/openlayers/lib/OpenLayers/Feature WFS.js
               lib/spatial/openlayers/lib/OpenLayers/Layer Boxes.js
                        EventPane.js GeoRSS.js Google.js Grid.js
                        HTTPRequest.js KaMap.js Markers.js Text.js
                        VirtualEarth.js WFS.js WMS.js WorldWind.js Yahoo.js
               lib/spatial/openlayers/lib/OpenLayers/Layer/WMS Untiled.js
               lib/spatial/openlayers/lib/OpenLayers/Marker Box.js
               lib/spatial/openlayers/lib/OpenLayers/Popup Anchored.js
                        AnchoredBubble.js
               lib/spatial/openlayers/lib/OpenLayers/Tile Image.js WFS.js
               lib/spatial/openlayers/lib/Rico Color.js Corner.js
               lib/spatial/openlayers/tests README.txt
                        data_Layer_Text_textfile.txt georss.txt
                        list-tests.html run-tests.html test_Bounds.html
                        test_Control.html test_Control_LayerSwitcher.html
                        test_Control_MouseToolbar.html
                        test_Control_PanZoom.html
                        test_Control_PanZoomBar.html
                        test_Control_Permalink.html test_Events.html
                        test_Feature.html test_Icon.html test_Layer.html
                        test_Layer_EventPane.html test_Layer_GeoRSS.html
                        test_Layer_Google.html test_Layer_Grid.html
                        test_Layer_HTTPRequest.html test_Layer_KaMap.html
                        test_Layer_Markers.html test_Layer_Text.html
                        test_Layer_WMS.html test_LonLat.html test_Map.html
                        test_Marker.html test_Pixel.html test_Popup.html
                        test_Size.html test_Tile.html test_Tile_Image.html
                        test_Util.html throws.js
               lib/spatial/openlayers/tools README.txt jsmin.c jsmin.py
                        mergejs.py shrinksafe.py toposort.py
  Log:
  initial import of spatial libs, try2
  
  Revision  Changes    Path
  1.1                  metacat/lib/spatial/kml.jsp
  
  Index: kml.jsp
  ===================================================================
  <%@ page import="edu.ucsb.nceas.metacat.MetaCatUtil" %>
  <%
  
  String url = MetaCatUtil.getOption("baseUrl");
  String layerName = "metacat:data_bounds";
  
  String redirectURL = url + "/wms?service=WMS&request=GetMap&format=application/vnd.google-earth.kml+XML&width=1024&height=1024&srs=EPSG:4326&layers=" + layerName + "&styles=&bbox=-180,-90,180,90";
  
  response.sendRedirect(redirectURL);
  %>
  
  
  
  1.1                  metacat/lib/spatial/map.jsp
  
  Index: map.jsp
  ===================================================================
  <%
  	String map = request.getParameter("map");
      if (map == null) 
  	    map = "demisWorldMap";
  	 
  	String template = request.getParameter("template");
      if (template == null) 
  	    template = "default";
  
  	// Currently "mapbuilder" and "openlayers" are supported
  	String client = request.getParameter("template");
      if (client != "mapbuilder" || client != "openlayers" || client == null) 
  	    client = "mapbuilder";
  	
  	if (client == "mapbuilder") {
  	    String mapbuilderURL = "@systemidserver@/@context@/spatial/mapbuilder/demo/metacat/index.jsp" +
  	                           "?map=" + map +
  	                           "&template=" + template;                        
  	    response.sendRedirect(mapbuilderURL);
  	} 
  %>
  
  
  
  1.1                  metacat/lib/spatial/metacat_spatialresolver.jsp
  
  Index: metacat_spatialresolver.jsp
  ===================================================================
  <%
  /**
  <!--
    *   '$RCSfile$'
    *   '$Author$'
    *   '$Date$'
    *   '$Revision$'
    *
    *
    * This program is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License as published by
    * the Free Software Foundation; either version 2 of the License, or
    * (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  -->
    */
  %>
  <%@ page import="org.apache.tools.mail.MailMessage" %>
  <%@ page import="java.io.PrintStream" %>
  <%@ page import="java.io.BufferedReader" %>
  <%@ page import="java.util.StringTokenizer" %>
  <%@ page import="java.io.InputStreamReader" %>
  <%@ page import="java.io.PrintWriter" %>
  <%@ page import="java.net.URLConnection" %>
  <%@ page import="java.net.URL" %>
  <%@ page import="edu.ucsb.nceas.metacat.spatial.XSLTransform" %>
  <%
  	System.out.println("********************************************************");
  	System.out.println("********************************************************");
  	System.out.println("**************** metacat_spatialresolver.jsp*****************\n");
  
  
  	String _request = request.getParameter("REQUEST");
  	_request = (_request!=null)? _request.trim() : "";
  
  	System.out.println("request param: >>" + _request);
  	System.out.println("uri: >>" + request.getRequestURI());
  	System.out.println("request string: >>" + request.getQueryString()+" \n");
  					   
  	// connect to the metacat spatial option, request the info using the wms getFeatureId call
  	// parse the response for the url to the metacat document and then redirect there. The query 
  	// should look like
  	// VERSION=1.1.1&REQUEST=GetFeatureInfo&SRS=EPSG:4326&BBOX=-143.09099999999998,19.856,-96.79899999999999,43.002&WIDTH=600&HEIGHT=300&LAYERS=topp:RIVERS&FORMAT=text/html&FEATURE_COUNT=1&QUERY_LAYERS=topp:RIVERS&X=328&Y=218
  
  	if (_request.toLowerCase().equals("aoimetacatquery")) {
  		// bounded box
  		System.out.println("handling AoiMetacatQuery");
  		String urlString = "http://dataknp.sanparks.org:8080/knp/metacat?action=spatial_query&"+ request.getQueryString();
  		
  		System.out.println("redirecting to: " + urlString);
  		response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
  		response.setHeader("Location",urlString);
  		
  		
  		/***********
  		URL url = new URL(urlString);
  		URLConnection c = url.openConnection();
  		BufferedReader in = new BufferedReader(
  				new InputStreamReader(c.getInputStream()));
  		String inputLine;
  		//StringBuffer xmlResults = new StringBuffer(4096);
  		try {
  		PrintWriter _out = response.getWriter();
  			while ((inputLine = in.readLine()) != null) {
  				//	xmlResults.append(inputLine);
  				//System.out.println(inputLine);
  				out.println(inputLine);
  			} 
  		} catch (Exception e) { e.printStackTrace(); }
  
  		***/
  		
  		
  		// transform xml into html
  		//String xslPath = "/tmp/spatial_results.xsl";
  		//XSLTransform.transform(xmlResults.toString(), xslPath, response.getWriter(), null);
  
  
  		/*
  		System.out.println("redirecting to: " + urlString);
  		response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
  		response.setHeader("Location",urlString);
  		*/
  	} else {
  		// feature info
  		if ( request.getQueryString().indexOf("metacat_testdata") > -1 ) {
  
  			URL url = new URL("http://dataknp.sanparks.org:8080/geoserver/wms?"+request.getQueryString());
  			URLConnection c = url.openConnection();
  			BufferedReader in = new BufferedReader(
  			new InputStreamReader(
  			c.getInputStream()));
  			String inputLine;
  
  			while ((inputLine = in.readLine()) != null) {
  				if ( inputLine.startsWith("url") ) {
  
  					StringTokenizer _st = new StringTokenizer(inputLine, " ");
  					_st.nextToken(); // url string
  					_st.nextToken(); // equals sign
  					String _redirectTo = _st.nextToken();
  					System.out.println("redirecting to: " + _redirectTo); 
  					response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
  					String newLocn = _redirectTo;
  					response.setHeader("Location",newLocn);
  				}
  			}
  			in.close();
  
  		} else {
  			System.out.println(" -- not a metacat query");
  			String urlString = "/geoserver/wms?"+ request.getQueryString();
  
  			System.out.println("redirecting to: " + urlString);
  			response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
  			response.setHeader("Location",urlString);
  		}
  	}
  
  if (false) {
  %><!--html>
  <head>
  <title>Metacat Spatial Resolver</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <link href="styles.css" rel="stylesheet" type="text/css">
  </head>
  
  <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" background="images/blue_pixel_bg.jpg">
  <table width="100%" border="0" cellspacing="0" cellpadding="0">
    <!--DWLayoutTable-->
    <tr>
            <td  width="700" height="20" background="images/blue_pixel_bg.jpg"></td>
  
    </tr>
      
   
    
    
    <tr> 
      <td bgcolor="#6699CC"> <table width="700" border="0" cellspacing="0" cellpadding="0">
          <tr> 
            <td>&nbsp;</td>
            <td><td>&nbsp;</td>
          </tr>
        </table>
    </tr>
  </table>
  </body>
  </html-->
  <% } %>
  
  
  
  1.1                  metacat/lib/spatial/wfs.jsp
  
  Index: wfs.jsp
  ===================================================================
  <%@ taglib uri="/WEB-INF/taglibs-xtags.tld" prefix="xtags" %>
  <%
      /* Get the WFS GetFeature request and the XSL Stylesheet
       * If not specified, use the defaults
       */
       String xml = request.getParameter("wfsurl");
       if (xml == null)
       {
           xml = "wfs.xml";
       }
  
       String xsl = request.getParameter("xsl");
       if (xsl == null) 
       {
           xsl = "wfs.xsl";
       }
  
  %>
  
  <html>
  <head>
  <title> Map Query </title>
  <link href="../style/skins/default/default.css" rel="stylesheet" type="text/css">
  <style>
     ul     { font-size: 12pt; list-style-type: none; padding:1px; padding-left:16px; }
     a      { color: darkblue }
     .title { font-size: 16pt; width:100%; color:darkblue; 
              text-align:center; padding: 1px; }
     .content { border:1px black solid; width:750px; background-color:white}
  </style>
  </head>
  <body align="center">
  
  <!-- WFS URL :
       <%=xml%> 
   -->
  
    <table width="750px" align="center" cellspacing="0" cellpadding="0" >
      <tr> 
        <td width="10" align="right" valign="top">
          <img src="../style/skins/default/images/panelhead_bg_lcorner.gif" 
            width="10" height="21">
        </td>
        <td class="sectionheader">
          Map Query Results
        </td>
        <td width="10" align="left" valign="top"> 
          <img src="../style/skins/default/images/panelhead_bg_rcorner.gif" 
            width="10" height="21">
        </td>
      </tr>
      <tr><td colspan="3">
  <div class="content">
    <xtags:style xml="<%=xml%>" xsl="<%=xsl%>"/>
  </div>
       </tr></td>
      </table>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/wfs.xsl
  
  Index: wfs.xsl
  ===================================================================
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
             xmlns:wfs="http://www.opengis.net/wfs"
             xmlns:gml="http://www.opengis.net/gml"
             xmlns:metacat="http://knb.ecoinformatics.org/metacat"
             version="1.0">
       
  <xsl:template match="/">
      <ul>
          <xsl:apply-templates select="wfs:FeatureCollection/gml:featureMember" />
      </ul>
  </xsl:template>
  
  
  <xsl:template match="metacat:data_points">
       <xsl:variable name="url" select="./metacat:url"/>
       <li>
        <a href='{$url}'>
           <xsl:value-of select="./metacat:title" />
           ( <xsl:value-of select="./metacat:docid" /> )
        </a>
       </li>
  </xsl:template>
  
  <xsl:template match="metacat:data_bounds">
       <xsl:variable name="url" select="./metacat:url"/>
       <li>
        <a href='{$url}'>
           <xsl:value-of select="./metacat:title" />
           ( <xsl:value-of select="./metacat:docid" /> )
        </a>
       </li>
  </xsl:template>
  
  <xsl:template match="metacat:metacat_testdata">
       <xsl:variable name="url" select="./metacat:url"/>
       <li>
        <a href='{$url}'>
           <xsl:value-of select="./metacat:docid" />
        </a>
       </li>
  </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/WEB-INF/taglibs-xtags.tld
  
  Index: taglibs-xtags.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
    <tlibversion>1.0</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>xtags</shortname>
    <uri>http://jakarta.apache.org/taglibs/xtags-1.0</uri>
    <info>XTags is a JSP tag library for working with XSLT and XPath.
      XTags lets you navigate, process and style XML documents directly in JSP.
    XTags makes heavy use of the XPath expression language.
        For a good tutorial on XPath you could try the either the 
        Zvon tutorial or the 
        specification.
    XTags is currently built on top of dom4j the 
      flexible open source XML framework for the Java platform.
      Though increasingly XTags will use a pluggable XPath engine to support
      the travesal of DOM and Java Beans too.
    To begin with you need to parse an XML document from somewhere.
      You can parse a variety of sources of XML documents from local resources,
      the output of JSP or external web services.
    You can parse the body of the tag
    
      &lt;xtags:parse&gt;
          &lt;root&gt;
              &lt;child/&gt;
          &lt;/root&gt;
      &lt;/xtags:parse&gt;
  Or parse an absolute URL via the "url" attribute
    
      &lt;xtags:parse url="http://something.com"/&gt;
  You can parse a web app resource using an absolute URI relative to the web-app
    context using the "uri" attribute
    
      &lt;xtags:parse uri="/data/foo.xml"/&gt;
  Or you can use a URI relative to the the current JSP file
    
      &lt;xtags:parse uri="foo.xml"/&gt;
  Then for more complex
    requirements such as parsing the output of a piece of JSP, you can do the following (provided you are using a JSP 1.2 container)
    
      &lt;xtags:parse&gt;
          &lt;jsp:include page="foo.jsp"/&gt;
      &lt;/xtags:parse&gt;
  Until then you can use the IO tag library to make these requests such as
    
      &lt;xtags:parse&gt;
          &lt;io:request url="/foo.jsp"/&gt;
      &lt;/xtags:parse&gt;
  Though the above would result in a seperate HTTP request which would loose 
    all page, request and session scope state. 
    So if it must be in the same request the following should work
    though care should be taken to avoid scripting variable clashes
    
      &lt;xtags:parse&gt;
          &lt;%@ include file="/foo.jsp" %&gt;
      &lt;/xtags:parse&gt;
  To parse the output of an XML-RPC (or SOAP) call, using the IO taglib
    you could do the following.
    
      &lt;xtags:parse&gt;
          &lt;io:xmlrpc url="/xmlrpc_echo.jsp"&gt;
           &lt;io:pipe&gt;
            &lt;methodCall&gt;
               &lt;methodName&gt;examples.getStateName&lt;/methodName&gt;
               &lt;params&gt;
                  &lt;param&gt;
                     &lt;value&gt;&lt;i4&gt;41&lt;/i4&gt;&lt;/value&gt;
                     &lt;/param&gt;
                  &lt;/params&gt;
               &lt;/methodCall&gt;
           &lt;/io:pipe&gt;
          &lt;/io:xmlrpc&gt;
  
      &lt;/xtags:parse&gt;
  Once you have a document parsed you can navigate around its structure using XPath
      expressions in a similar manner to that used in XSLT.Loops are as follows (an optional variable id can be specified to define a
    scriptlet expression inside the loop):-
    
    &lt;xtags:forEach select="expression"&gt;
      ...
    &lt;/xtags:forEach&gt;
  Simple conditional branching is:-
    
    &lt;xtags:if test="booeanExpression"&gt;
      ...
    &lt;/xtags:if&gt;
  More complex conditional branching is:-
    
    &lt;xtags:choose&gt;
      &lt;xtags:when test="booeanExpression"&gt;
        ...
      &lt;/xtags:when&gt;
      &lt;xtags:when test="booeanExpression2"&gt;
        ...
      &lt;/xtags:when&gt;
      &lt;xtags:otherwise&gt;
        ...
      &lt;/xtags:otherwise&gt;
    &lt;/xtags:choose&gt;
  Expression evaluation
    
    &lt;xtags:valueOf select="expression"/&gt;
  Defining scriptlet variables
    
    &lt;xtags:variable id="variableName" select="expression"/&gt;
  All these tags are very similar to their XSLT equivalents, so anyone who's
    done XSLT before should find them familiar.
    There's also an &lt;xtags:style&gt; tag which performs complete XSL transform 
    in one tag.
    Accessing JSP scopes from XPathXPath expressions can use variables with the syntax $foo.
    XTags binds these variables to either page/request/session/application scope
    attributes or request parameters which allows xtags to be used as a
    conditional logic scripting language too - even without the existence of XML
    documents.
    A prefix can be used to denote the exact JSP scope from which a variable comes
      from such as $request:foo to denote request scope.
      There now follows a full breakdown of all the current JSP scopes
    $foomaps to pageContext.findAttribute("foo")$page:foomaps to page scope$request:foomaps to request scope$session:foomaps to session scope$app:foomaps to application scope$param:foomaps to request.getParameter("foo")$initParam:foomaps to request.getInitParameter("foo")$cookie:foomaps to the cookie's value for name foo$header:foomaps to request.getHeader("foo") For example, the following JSP would branch logically based on the value of
    the (say) request parameter "param":-
    
    &lt;xtags:choose&gt;
      &lt;xtags:when test="$param='a'"&gt;
        current param is 'a'
      &lt;/xtags:when&gt;
      &lt;xtags:when test="$param='b'"&gt;
        current param is 'b'
      &lt;/xtags:when&gt;
      &lt;xtags:otherwise&gt;
        no valid param selected
      &lt;/xtags:otherwise&gt;
    &lt;/xtags:choose&gt;
  
    XTags even supports the &lt;xtags:stylesheet&gt; &lt;xtags:template&gt; and
    &lt;xtags:applyTemplates&gt; tags from XSLT too though the body of a template must
    be an Action object or a seperate JSP file.
    </info>
    <tag>
      <name>style</name>
      <tagclass>org.apache.taglibs.xtags.xslt.StyleTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>document</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>xml</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>xmlReader</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>xmlSource</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>xsl</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>xslReader</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>xslSource</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>result</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>writer</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>outputMethod</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>param</name>
      <tagclass>org.apache.taglibs.xtags.xslt.ParamTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>value</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>parse</name>
      <tagclass>org.apache.taglibs.xtags.xpath.ParseTag</tagclass>
      <teiclass>org.apache.taglibs.xtags.xpath.ParseTagExtraInfo</teiclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>id</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>uri</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>url</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>reader</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>validate</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>valueOf</name>
      <tagclass>org.apache.taglibs.xtags.xpath.ValueOfTag</tagclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>select</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>forEach</name>
      <tagclass>org.apache.taglibs.xtags.xpath.ForEachTag</tagclass>
      <teiclass>org.apache.taglibs.xtags.xpath.ForEachTagExtraInfo</teiclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>select</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>sort</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>distinct</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>ascending</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>id</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>type</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>choose</name>
      <tagclass>org.apache.taglibs.xtags.xpath.ChooseTag</tagclass>
      <bodycontent>JSP</bodycontent>
    </tag>
    <tag>
      <name>when</name>
      <tagclass>org.apache.taglibs.xtags.xpath.WhenTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>otherwise</name>
      <tagclass>org.apache.taglibs.xtags.xpath.OtherwiseTag</tagclass>
      <bodycontent>JSP</bodycontent>
    </tag>
    <tag>
      <name>break</name>
      <tagclass>org.apache.taglibs.xtags.xpath.BreakTag</tagclass>
      <bodycontent>empty</bodycontent>
    </tag>
    <tag>
      <name>if</name>
      <tagclass>org.apache.taglibs.xtags.xpath.IfTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>variable</name>
      <tagclass>org.apache.taglibs.xtags.xpath.VariableTag</tagclass>
      <teiclass>org.apache.taglibs.xtags.xpath.VariableTagExtraInfo</teiclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>id</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>type</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
      </attribute>
      <attribute>
        <name>select</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>stylesheet</name>
      <tagclass>org.apache.taglibs.xtags.xpath.StylesheetTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>template</name>
      <tagclass>org.apache.taglibs.xtags.xpath.TemplateTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>match</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>mode</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>avt</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>action</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>applyTemplates</name>
      <tagclass>org.apache.taglibs.xtags.xpath.ApplyTemplatesTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>select</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>mode</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>element</name>
      <tagclass>org.apache.taglibs.xtags.xpath.ElementTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>attribute</name>
      <tagclass>org.apache.taglibs.xtags.xpath.AttributeTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>name</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>output</name>
      <tagclass>org.apache.taglibs.xtags.xpath.OutputTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>method</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>indent</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>omitXmlDeclaration</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>copy</name>
      <tagclass>org.apache.taglibs.xtags.xpath.CopyTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>select</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>copyOf</name>
      <tagclass>org.apache.taglibs.xtags.xpath.CopyOfTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>select</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>context</name>
      <tagclass>org.apache.taglibs.xtags.xpath.ContextTag</tagclass>
      <bodycontent>JSP</bodycontent>
      <attribute>
        <name>select</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>context</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>remove</name>
      <tagclass>org.apache.taglibs.xtags.xpath.RemoveTag</tagclass>
      <bodycontent>empty</bodycontent>
      <attribute>
        <name>select</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>add</name>
      <tagclass>org.apache.taglibs.xtags.xpath.AddTag</tagclass>
      <bodycontent>jsp</bodycontent>
      <attribute>
        <name>before</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
        <name>after</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
    <tag>
      <name>replace</name>
      <tagclass>org.apache.taglibs.xtags.xpath.ReplaceTag</tagclass>
      <bodycontent>jsp</bodycontent>
    </tag>
  </taglib>
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/WEB-INF/web.xml.combined
  
  Index: web.xml.combined
  ===================================================================
  <!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
          "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
  
  <web-app>
  
   <display-name>Metacat</display-name>
  
      <context-param>
        <param-name>jones</param-name>
        <param-value>jones at nceas.ucsb.edu</param-value>
        <description>
        </description>
      </context-param>
      
        
    <context-param>
      <param-name>serviceStratagy</param-name>
      <!-- Meaning of the different values :
      	 
      	 PARTIAL-BUFFER
      	 - Partially buffers the first xKb to disk. Once that has buffered, the the 
      	   result is streamed to the user. This will allow for most errors to be caught
      	   early.
      	   
           BUFFER
           - stores the entire response in memory first, before sending it off to
             the user (may run out of memory)
  
           SPEED
           - outputs directly to the response (and cannot recover in the case of an
             error)
  
           FILE
           - outputs to the local filesystem first, before sending it off to the user
        -->
      <param-value>PARTIAL-BUFFER</param-value>
    </context-param>
    <context-param>
  	<param-name>PARTIAL_BUFFER_STRATEGY_SIZE</param-name>
  	<param-value>50</param-value>
    </context-param>
    
  
          <!-- pick up all spring application contexts -->
          <context-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath*:/applicationContext.xml</param-value>
          </context-param>
  
     
   <filter>
      <filter-name>Set Character Encoding</filter-name>
      <filter-class>org.vfny.geoserver.filters.SetCharacterEncodingFilter</filter-class>
      <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
    </filter>
  
    <filter-mapping>
      <filter-name>Set Character Encoding</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
  
  
  
    <!-- MPTODO testing  leave out for geoserver 1.4 and use a spring/geoserver plugin instead??
     
   <filter>
      <filter-name>WmsFilter</filter-name>
      <filter-class>edu.ucsb.nceas.metacat.spatial.WmsFilter</filter-class>
   </filter>
  
    <filter-mapping>
      <filter-name>WmsFilter</filter-name>
      <url-pattern>/metacatwms/*</url-pattern>
      <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    -->
  
  
  
  
    <!-- spring dispatcher servlet, dispatches incoming requests to controllers -->
    <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
       
     <!-- Struts config needs to load before all the other servlets... except spring-->
     <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/struts-config.xml</param-value>
      </init-param>
      <init-param>
        <param-name>debug</param-name>
        <param-value>2</param-value>
      </init-param>
      <init-param>
        <param-name>detail</param-name>
        <param-value>2</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet> 
   
    <servlet>
     <servlet-name>TestWfsPost</servlet-name>
     <servlet-class>org.vfny.geoserver.wfs.servlets.TestWfsPost</servlet-class>
    </servlet>
  
  
  
    <!-- MPTODO testing -->
    <servlet>
      <servlet-name>SldFactory</servlet-name>
      <servlet-class>edu.ucsb.nceas.metacat.spatial.SldFactory</servlet-class>
    </servlet>
  
  
  
      <servlet>
        <servlet-name>metacat</servlet-name>
        <servlet-class>edu.ucsb.nceas.metacat.MetaCatServlet</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>1</param-value>
        </init-param>
        <init-param>
          <param-name>listings</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
      </servlet>
      
       <servlet>
        <servlet-name>replication</servlet-name>
        <servlet-class>edu.ucsb.nceas.metacat.MetacatReplication</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>1</param-value>
        </init-param>
        <init-param>
          <param-name>listings</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
      </servlet>
  
      <servlet>
        <servlet-name>HarvesterRegistrationLogin</servlet-name>
        <servlet-class>edu.ucsb.nceas.metacat.harvesterClient.HarvesterRegistrationLogin</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>1</param-value>
        </init-param>
        <init-param>
          <param-name>listings</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
      </servlet>
  
      <servlet>
        <servlet-name>HarvesterRegistration</servlet-name>
        <servlet-class>edu.ucsb.nceas.metacat.harvesterClient.HarvesterRegistration</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>1</param-value>
        </init-param>
        <init-param>
          <param-name>listings</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
      </servlet>
  
      <servlet>
          <servlet-name>AdvancedSearchServlet</servlet-name>
          <servlet-class>edu.ucsb.nceas.metacat.advancedsearch.AdvancedSearchServlet</servlet-class>
          <load-on-startup>3</load-on-startup>
      </servlet>
  
      <!--
      <servlet>
        <servlet-name>HarvesterServlet</servlet-name>
        <servlet-class>edu.ucsb.nceas.metacat.harvesterClient.HarvesterServlet</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>1</param-value>
        </init-param>
        <init-param>
          <param-name>listings</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
      </servlet>
      -->
      <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <display-name>Apache-Axis Servlet</display-name>
        <servlet-class>
            org.apache.axis.transport.http.AxisServlet
        </servlet-class>
        <load-on-startup>3</load-on-startup>
      </servlet>
  
    <servlet>
      <servlet-name>AdminServlet</servlet-name>
      <display-name>Axis Admin Servlet</display-name>
      <servlet-class>
          org.apache.axis.transport.http.AdminServlet
      </servlet-class>
      <load-on-startup>100</load-on-startup>
    </servlet>
  
    <servlet>
      <servlet-name>SOAPMonitorService</servlet-name>
      <display-name>SOAPMonitorService</display-name>
      <servlet-class>
          org.apache.axis.monitor.SOAPMonitorService
      </servlet-class>
      <init-param>
        <param-name>SOAPMonitorPort</param-name>
        <param-value>5001</param-value>
      </init-param>
      <load-on-startup>100</load-on-startup>
    </servlet>
  
      <servlet-mapping>
          <servlet-name>metacat</servlet-name>
          <url-pattern>/metacat</url-pattern>
      </servlet-mapping>
      
      <servlet-mapping>
          <servlet-name>replication</servlet-name>
          <url-pattern>replication</url-pattern>
      </servlet-mapping> 
     
      <servlet-mapping>
          <servlet-name>replication</servlet-name>
          <url-pattern>/servlet/replication</url-pattern>
      </servlet-mapping>
  
      <servlet-mapping>
          <servlet-name>HarvesterRegistrationLogin</servlet-name>
          <url-pattern>/harvesterRegistrationLogin</url-pattern>
      </servlet-mapping>
  
      <servlet-mapping>
          <servlet-name>HarvesterRegistration</servlet-name>
          <url-pattern>/harvesterRegistration</url-pattern>
      </servlet-mapping>
  
      <servlet-mapping>
          <servlet-name>AdvancedSearchServlet</servlet-name>
          <url-pattern>/advancedSearchServlet</url-pattern>
      </servlet-mapping>
       
      <servlet-mapping>
      <servlet-name>AxisServlet</servlet-name>
      <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>
  
    <servlet-mapping>
      <servlet-name>AxisServlet</servlet-name>
      <url-pattern>*.jws</url-pattern>
    </servlet-mapping>
  
    <servlet-mapping>
      <servlet-name>AxisServlet</servlet-name>
      <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
  
    <servlet-mapping>
      <servlet-name>SOAPMonitorService</servlet-name>
      <url-pattern>/SOAPMonitor</url-pattern>
    </servlet-mapping>
  
   <!-- uncomment this if you want the admin servlet -->
    <servlet-mapping>
      <servlet-name>AdminServlet</servlet-name>
      <url-pattern>/servlet/AdminServlet</url-pattern>
    </servlet-mapping>
  
  
  
   <!-- MPTODO testing -->
    <servlet-mapping>
      <servlet-name>SldFactory</servlet-name>
      <url-pattern>/sldfactory</url-pattern>
    </servlet-mapping>
  
  
    <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
     </servlet-mapping>
    <servlet-mapping>
          <servlet-name>dispatcher</servlet-name>
          <url-pattern>/wms/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
          <servlet-name>dispatcher</servlet-name>
          <url-pattern>/wfs/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
          <servlet-name>dispatcher</servlet-name>
          <url-pattern>/ows/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
     <servlet-name>TestWfsPost</servlet-name>
     <url-pattern>/TestWfsPost/*</url-pattern>
    </servlet-mapping>
  
        
      <session-config>
        <session-timeout>30000</session-timeout>
      </session-config>
  
      
     <!-- currently the W3C havent settled on a media type for WSDL;
      http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
      for now we go with the basic 'it's XML' response -->
    <mime-mapping>
      <extension>wsdl</extension>
       <mime-type>text/xml</mime-type>
    </mime-mapping>
    
    <mime-mapping>
      <extension>xsd</extension>
      <mime-type>text/xml</mime-type>
    </mime-mapping>
    
    <mime-mapping>
     <extension>xsl</extension>
     <mime-type>text/xml</mime-type>
    </mime-mapping>
  
  		      
    <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
   
   
    <taglib>
       <taglib-uri>http://jakarta.apache.org/taglibs/xtags-1.0</taglib-uri>
       <taglib-location>/WEB-INF/xtags.tld</taglib-location>
    </taglib>   
  
    <taglib>
      <taglib-uri>/tags/struts-bean</taglib-uri>
      <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
    </taglib>
  
    <taglib>
      <taglib-uri>/tags/struts-html</taglib-uri>
      <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
    </taglib>
  
    <taglib>
      <taglib-uri>/tags/struts-logic</taglib-uri>
      <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
    </taglib>
  
    <taglib>
      <taglib-uri>/tags/struts-nested</taglib-uri>
      <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
    </taglib>
  
    <taglib>
      <taglib-uri>/tags/struts-tiles</taglib-uri>
      <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
    </taglib>  
    
    <!-- spring taglib -->
    <taglib>
          <taglib-uri>/tags/spring</taglib-uri>
          <taglib-location>/WEB-INF/tld/spring.tld</taglib-location>
    </taglib>
  
    <error-page>
          <exception-type>java.lang.Exception</exception-type>
                  <location>/WEB-INF/pages/errors/Exception.jsp</location>
    </error-page>
    <error-page>
          <exception-type>javax.servlet.ServletException</exception-type>
                  <location>/WEB-INF/pages/errors/Exception.jsp</location>
    </error-page>
    <error-page>
          <exception-type>org.vfny.geoserver.global.ConfigurationException</exception-type>
                  <location>/WEB-INF/pages/errors/Exception.jsp</location>
    </error-page>
  
  
  </web-app>
  
  
  
  1.1                  metacat/lib/spatial/WEB-INF/lib/dom4j-1.6.1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/style.css
  
  Index: style.css
  ===================================================================
  /* GeoServer Default Style */
  body {
   font-size: 90%;
   margin: 0ex;
   color: #256E81;
   font-family: tahoma, verdana, sans, arial, helvetica, sans-serif;
   background: rgb(255,255,255);
  }
  a:visited,
  a:link {
   color: rgb(8,128,159);
   text-decoration: none;
  }
  a:hover {
   color: rgb(8,128,159);
   text-decoration: underline;
  }
  table.page {
   text-align: left;
   width: 100%;
   cellspacing: 0;
   cellpadding: 0;
  }
  tr.header {
   vertical-align: bottom;
   white-space: nowrap;
  }
  td.gutter {
   width: 12em;
   min-width: 12em; 
   white-space: nowrap; 
  }
  .project {
   font-size: 110%;
   font-weight: bold;
   font-style: italic;
   color: rgb(8,128,159);
  }
  .license {
   font-size: 90%;
   font-weight: normal;
   font-style: italic;
   color: rgb(8,128,159);
  }
  .site {
   font-size: 110%;
   font-weight: bold;
   font-style: normal;
   padding: .5ex 1ex 0ex 0ex; 
  }
  .contact {
   font-size: 90%;
  }
  /*
   * SideBar
   */
  td.sidebar {
   vertical-align: top;
   width: 12em; 
  }
  /*
   * SideBar Actions
   */
  table.actions {
   text-align: left;
   width: 100%;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: #68AE0F;
   border-spacing: 0;
   background: rgb(186,221,141);
   -moz-border-radius: 5px;
   padding: .5ex;  
  }
  table.actions a:visited,
  table.actions a:link {
   color: #256E81;
   text-decoration: none;
  }
  table.actions a:hover {
   color: #256E81;
   text-decoration: underline;
  }
  /*
   * SideBar Status
   */
  table.status {
   width: 100%;
  }
  table.status td.module {
   vertical-align: top;
   text-align: right;
   white-space: nowrap;
   width: 10%;
   font-size: 90%; 
  }
  table.status td.health {
   vertical-align: center;
  }
  table.progress {
   cellpadding: 0;
   cellspacing: 0;
   border-width: 1px;
   border-style: raised;
   border-color: #68AE0F;
   text-align: left;
   width: 100%;
   height: 1em;
  }
  table.progress td.good {
   background-color: green;
  }
  table.progress td.bad {
   background-color: red;
  }
  table.progress td.disabled {
   background-color: gray;
  }
  /*
   * Sidebar Config Actions
   */
  table.state {
   width: 100%;
   font-size: 70%;  
  }
  table.state td.node {
   white-space: nowrap;
   text-align: left;
  }
  table.state td.timestamp {
   white-space: nowrap;
   text-align: right;
  }
  table.control {
   width: 100%;
   font-size: 90%; 
   text-align: left;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: #68AE0F;
   border-spacing: 0;
   background: white;
   -moz-border-radius: 5px;
   padding: .5ex;  
  }
  /*
   * Header Locator
   */
  td.locator {
   white-space: nowrap; 
   padding: 0.5ex 0 0.5ex 1ex; 
   border-width: 0 0 1px 0;
   border-style: solid;
   border-color: #68AE0F;
  }
  table.main {
   text-align: left;
   width: 100%;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: #68AE0F;
   border-spacing: 0;
   background: rgb(186,221,141);
   -moz-border-radius: 5px;   
  }
  
  tr.bar {
   color: #256E81;
   vertical-align: center;    
  }
  .bar a:visited,
  .bar a:link {
   color: #256E81;
   text-decoration: none;
  }
  .bar a:hover {
   color: #256E81;
   text-decoration: underline;
  }
  td.locator {
   white-space: nowrap; 
   padding: 0.5ex 0 0.5ex 1ex; 
   border-width: 0 0 1px 0;
   border-style: solid;
   border-color: #68AE0F;
  }
  span.locator {
   font-size: 90%;
  }
  td.loginStatus {
   text-align: right;
   padding: 0.5ex 1ex 0.5ex 0; 
   border-width: 0 0 1px 0px;
   border-style: solid;
   border-color: #68AE0F; 
  }
  span.loginStatus {
   font-size: 90%;
  }
  <!-- title -->
  table.tile {
   white-space: nowrap;
   width: 100%;
   text-align: left;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: #68AE0F;
   border-spacing: 0;
   -moz-border-radius: 5px;
   padding: 0px; 
   margin: 4px; 
  }
  table.title td.title {
   vertical-align: top; 
   padding: 1ex;
  }
  table.title td.icon {
   width: 64px;
   valign: center;
   align: center;
   padding: 2px;
  }
  table.title td.menu {
   font-size: 90%;
   background: rgb(186,221,141);
   border-color: #68AE0F;
   width: 12ex;
   vertical-align: top;
   -moz-border-radius: 5 0 0 5; 
   border-width: 1px 1px 1px 1px;
   border-style: solid;
  }
  td.title h1 {
   font-family: tahoma, verdana, sans, arial, helvetica, sans-serif;
   font-size: 170%; 
   white-space: nowrap; 
   margin: 2px;
  }
  <!-- menuator -->
  table.menu {
   width: 12ex;
   vertical-align: top;
   white-space: nowrap; 
  }
  td.item {
   text-align: left;
  }
  .menu a:visited,
  .menu a:link {
   color: #256E81;
   text-decoration: none;
  }
  .menu a:hover {
   color: #256E81;
   text-decoration: underline;
  }
  td.application {
   vertical-align: top;
   background-color: rgb(255,255,255);  
   -moz-border-radius: 0px 0px 5px 5px;  
  }
  td.application table.title {
   background-color: rgb(246,254,236);
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
   margin: 2px;  
  }
  td.administration {
   background-color: rgb(240,240,240);
   -moz-border-radius: 0px 0px 5px 5px;  
  }
  td.administration table.title {
   background-color: rgb(205,205,205); 
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
   margin: 2px;  
  }
  td.configuration {
   vertical-align: top;
   background-color: rgb(255, 255, 255);
   -moz-border-radius: 0px 0px 5px 5px;  
  }
  td.configuration table.title {
   background-color: rgb(246,254,236);  
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
   margin: 2px;  
  }
  td.data {
   vertical-align: top;
   background-color: rgb(255, 255, 255);
   -moz-border-radius: 0px 0px 5px 5px;  
  }
  td.data table.title {
   background-color: rgb(246,254,236);  
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
   margin: 2px;  
  }
  <!-- Main Page -->
  table.info {
   text-align: left;
   vertical-align: top;
   width: 100%;
   border: 0;
  }
  table.info td.label {
   vertical-align: top;
   text-align: right;
   width: 18ex;
  }
  table.info td.datum {
   vertical-align: top;
  }
  td.datum textarea {
   font-family: serif;
  }
  td.datum text {
   font-family: serif;
  }
  td.datum password {
   font-family: serif;
  }
  
  td.greyedout  {
  font-family: serif;
  text-align: right;
  color:rgb(150,150,150)
  }
  
  td.greyedout2  {
  font-family: serif;
  color:rgb(150,150,150)
  }
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/META-INF/MANIFEST.MF
  
  Index: MANIFEST.MF
  ===================================================================
  Manifest-Version: 1.0
  Archiver-Version: Plexus Archiver
  Build-Jdk: 1.4.2_10
  Built-By: jdeolive
  Created-By: Apache Maven
  Implementation-Title: web
  Specification-Vendor: The Open Planning Project
  Extension-Name: web
  Implementation-Version: 1.4.0-M1
  Implementation-Vendor: The Open Planning Project
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/META-INF/maven/org.geoserver/web/pom.properties
  
  Index: pom.properties
  ===================================================================
  #Generated by Maven
  #Sun Aug 13 13:43:55 PDT 2006
  version=1.4.0-M1
  groupId=org.geoserver
  artifactId=web
  
  
  
  1.1                  metacat/lib/spatial/geoserver/META-INF/maven/org.geoserver/web/pom.xml
  
  Index: pom.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?><project>
    <parent>
      <artifactId>geoserver</artifactId>
      <groupId>org.geoserver</groupId>
      <version>1.4.0-M1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.geoserver</groupId>
    <artifactId>web</artifactId>
    <name>Web Application Module</name>
    <version>1.4.0-M1</version>
    <inceptionYear>2005</inceptionYear>
    <licenses>
      <license>
        <name>Lesser General Public License (LGPL)</name>
        <url>http://www.gnu.org/copyleft/lesser.txt</url>
        <distribution>repo</distribution>
      </license>
    </licenses>
    <organization>
      <name>The Open Planning Project</name>
      <url>http://www.openplans.org</url>
    </organization>
    <build>
      <sourceDirectory>c:\devel\geoserver\trunk\web\src\main\java</sourceDirectory>
      <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
      <testSourceDirectory>c:\devel\geoserver\trunk\web\src\test\java</testSourceDirectory>
      <outputDirectory>c:\devel\geoserver\trunk\web\target\classes</outputDirectory>
      <testOutputDirectory>c:\devel\geoserver\trunk\web\target\test-classes</testOutputDirectory>
      <resources>
        <resource>
          <directory>c:\devel\geoserver\trunk\web/src/main/java</directory>
          <includes>
            <include>**/*.txt</include>
            <include>**/*.sql</include>
            <include>**/*.xml</include>
            <include>**/*.utf</include>
            <include>**/*.properties</include>
            <include>**/*.serialized</include>
            <include>META-INF/*.jai</include>
            <include>META-INF/services/**</include>
            <include>applicationContext.xml</include>
          </includes>
          <excludes>
            <exclude>**/doc-files/**</exclude>
            <exclude>org/geotools/resources/i18n/**/*.properties</exclude>
          </excludes>
        </resource>
      </resources>
      <testResources>
        <testResource>
          <directory>c:\devel\geoserver\trunk\web/src/test/java</directory>
          <includes>
            <include>META-INF/services/**</include>
            <include>**/test-data/**</include>
            <include>**/*.xml</include>
            <include>**/*.xsd</include>
            <include>**/*.csv</include>
            <include>**/*.sld</include>
            <include>**/*.svg</include>
            <include>**/*.gml</include>
            <include>**/*.wkt</include>
            <include>**/*.txt</include>
            <include>**/*.sql</include>
            <include>**/*.png</include>
            <include>**/*.properties</include>
            <include>**/*.serialized</include>
          </includes>
          <excludes>
            <exclude>**/doc-files/**</exclude>
          </excludes>
        </testResource>
      </testResources>
      <directory>c:\devel\geoserver\trunk\web\target</directory>
      <finalName>web-1.4.0-M1</finalName>
      <plugins>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <source>1.4</source>
            <target>1.4</target>
            <includes>
              <include>**/*Test.java</include>
            </includes>
            <excludes>
              <exclude>**/*OnlineTest.java</exclude>
            </excludes>
            <forkMode>once</forkMode>
            <argLine>-Xmx512M -enableassertions</argLine>
            <printSummary>false</printSummary>
            <testFailureIgnore>${allow.test.failure.ignore}</testFailureIgnore>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.1</version>
          <configuration>
            <descriptors>
              <descriptor>release/src.xml</descriptor>
              <descriptor>release/war.xml</descriptor>
              <descriptor>release/javadoc.xml</descriptor>
              <descriptor>release/bin.xml</descriptor>
              <descriptor>release/doc.xml</descriptor>
            </descriptors>
            <finalName>geoserver-1.4.0-M1</finalName>
            <outputDirectory>${project.build.directory}/release</outputDirectory>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>cobertura-maven-plugin</artifactId>
          <version>2.0</version>
          <executions>
            <execution>
              <goals>
                <goal>clean</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>maven-jetty6-plugin</artifactId>
          <version>6.0.0beta16</version>
          <configuration>
            <contextPath>geoserver</contextPath>
            <webApp>${project.build.directory}/geoserver</webApp>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.geoserver.maven</groupId>
          <artifactId>config</artifactId>
          <version>1.4.0-M1</version>
          <executions>
            <execution>
              <id>configPackage</id>
              <phase>package</phase>
              <goals>
                <goal>config</goal>
              </goals>
              <configuration>
                <configId>release</configId>
              </configuration>
            </execution>
            <execution>
              <id>configClean</id>
              <phase>clean</phase>
              <goals>
                <goal>clean</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>2.0-beta-2</version>
          <executions>
            <execution>
              <phase>install</phase>
              <goals>
                <goal>war</goal>
              </goals>
            </execution>
          </executions>
          <inherited>true</inherited>
          <configuration>
            <warName>geoserver</warName>
            <webappDirectory>${project.build.directory}/geoserver</webappDirectory>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>2.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>2.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.0.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.1</version>
        </plugin>
      </plugins>
    </build>
    <repositories>
      <repository>
        <snapshots>
          <enabled>false</enabled>
        </snapshots>
        <id>ibiblio</id>
        <name>Ibiblio - the public's library and digital archive</name>
        <url>http://www.ibiblio.org/maven2</url>
      </repository>
      <repository>
        <snapshots>
          <enabled>false</enabled>
        </snapshots>
        <id>geotools</id>
        <name>Repository serving Geotools libraries built against
  				2.2.x branch</name>
        <url>http://maven.geotools.fr/repository/</url>
        <layout>legacy</layout>
      </repository>
      <repository>
        <snapshots />
        <id>refractions</id>
        <name>Repository from Refractions research, Victoria, Canada</name>
        <url>http://lists.refractions.net/m2/</url>
      </repository>
      <repository>
        <snapshots>
          <enabled>false</enabled>
        </snapshots>
        <id>codehaus</id>
        <name>Repository serving Geoserver libraries hosted by
  				Codehaus</name>
        <url>http://dist.codehaus.org/geoserver</url>
        <layout>legacy</layout>
      </repository>
      <repository>
        <snapshots>
          <enabled>false</enabled>
        </snapshots>
        <id>espace</id>
        <name>Repository from the Sicade laboratory in New-Caledonia</name>
        <url>http://maven.espace.ird.nc</url>
      </repository>
      <repository>
        <snapshots>
          <enabled>false</enabled>
        </snapshots>
        <id>central</id>
        <name>Maven Repository Switchboard</name>
        <url>http://repo1.maven.org/maven2</url>
      </repository>
    </repositories>
    <pluginRepositories>
      <pluginRepository>
        <snapshots />
        <id>mortbay-repo</id>
        <name>mortbay-repo</name>
        <url>http://www.mortbay.org/maven2/snapshot</url>
      </pluginRepository>
      <pluginRepository>
        <releases>
          <enabled>false</enabled>
        </releases>
        <snapshots />
        <id>codehaus-snapshot-plugins</id>
        <name>codehaus-shapshot-plugins</name>
        <url>http://snapshots.repository.codehaus.org/</url>
      </pluginRepository>
      <pluginRepository>
        <releases>
          <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
          <enabled>false</enabled>
        </snapshots>
        <id>central</id>
        <name>Maven Plugin Repository</name>
        <url>http://repo1.maven.org/maven2</url>
      </pluginRepository>
    </pluginRepositories>
    <dependencies>
      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.4</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt2-shapefile</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>commons-digester</groupId>
        <artifactId>commons-digester</artifactId>
        <version>1.7</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>xalan</groupId>
        <artifactId>xalan</artifactId>
        <version>2.7.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>commons-validator</groupId>
        <artifactId>commons-validator</artifactId>
        <version>1.1.4</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geoserver</groupId>
        <artifactId>data</artifactId>
        <version>1.4.0-M1</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geoserver</groupId>
        <artifactId>wms</artifactId>
        <version>1.4.0-M1</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <version>2.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>1.0.b2</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>lucene</groupId>
        <artifactId>lucene</artifactId>
        <version>1.4.3</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geoserver</groupId>
        <artifactId>wfs</artifactId>
        <version>1.4.0-M1</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt2-validation</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>1.2.5</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geoserver</groupId>
        <artifactId>platform</artifactId>
        <version>1.4.0-M1</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.1</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>1.2.5</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geoserver</groupId>
        <artifactId>main</artifactId>
        <version>1.4.0-M1</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.9</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt2-api</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt2-main</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.7.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>2.4.0</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>struts</groupId>
        <artifactId>struts</artifactId>
        <version>1.2.9</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>oro</groupId>
        <artifactId>oro</artifactId>
        <version>2.0.8</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>1.2.5</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>org.geoserver</groupId>
        <artifactId>validation</artifactId>
        <version>1.4.0-M1</version>
        <scope>compile</scope>
      </dependency>
    </dependencies>
    <reporting>
      <outputDirectory>target/site</outputDirectory>
      <plugins>
        <plugin>
          <artifactId>maven-javadoc-plugin</artifactId>
          <configuration>
            <source>1.4</source>
            <version>false</version>
            <noqualifier>all</noqualifier>
            <quiet>true</quiet>
            <maxmemory>512M</maxmemory>
            <encoding>ISO-8859-1</encoding>
            <aggregate>true</aggregate>
            <additionalparam>-keywords</additionalparam>
            <excludePackageNames>org.geotools.resources</excludePackageNames>
            <tags>
              <tag>
                <name>todo</name>
                <placement>tfmc</placement>
                <head>TODO:</head>
              </tag>
              <tag>
                <name>task</name>
                <placement>tfmc</placement>
                <head>TODO:</head>
              </tag>
              <tag>
                <name>revisit</name>
                <placement>tfmc</placement>
                <head>TODO:</head>
              </tag>
              <tag>
                <name>source</name>
                <placement>Xt</placement>
                <head>Source:</head>
              </tag>
              <tag>
                <name>tutorial</name>
                <placement>Xt</placement>
                <head>Tutorial:</head>
              </tag>
            </tags>
            <links>
              <link>http://java.sun.com/j2se/1.5/docs/api</link>
              <link>http://java.sun.com/j2ee/1.4/docs/api</link>
              <link>http://java.sun.com/products/java-media/jai/forDevelopers/jai-apidocs</link>
              <link>http://java.sun.com/products/java-media/3D/forDevelopers/j3dapi</link>
              <link>http://jsr-108.sourceforge.net/javadoc</link>
              <link>http://geoapi.sourceforge.net/snapshot/javadoc</link>
              <link>http://geoapi.sourceforge.net/pending/javadoc</link>
              <link>http://geoapi.sourceforge.net/legacy/javadoc</link>
              <link>http://www.jump-project.org/docs/jts/1.7/api</link>
              <link>http://www.geotools.fr/javadoc/2.2/</link>
              <link>http://xmlgraphics.apache.org/batik/javadoc</link>
              <link>http://itextdocs.lowagie.com/docs</link>
            </links>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
        </plugin>
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-report-plugin</artifactId>
          <configuration>
            <linkXRef>true</linkXRef>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>cobertura-maven-plugin</artifactId>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>jxr-maven-plugin</artifactId>
          <configuration>
            <aggregate>true</aggregate>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>taglist-maven-plugin</artifactId>
          <configuration>
            <tags>
              <tag>@revisit</tag>
              <tag>@todo</tag>
              <tag>TODO</tag>
              <tag>FIXME</tag>
            </tags>
          </configuration>
        </plugin>
      </plugins>
    </reporting>
    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2-api</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2-main</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2-shapefile</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2-validation</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2-render</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2-demo-property</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2-epsg-wkt</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>org.geotools</groupId>
          <artifactId>gt2-epsg-hsql</artifactId>
          <version>2.2.0</version>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
        </dependency>
        <dependency>
          <groupId>httpunit</groupId>
          <artifactId>httpunit</artifactId>
          <version>1.6</version>
        </dependency>
        <dependency>
          <groupId>xml-apis</groupId>
          <artifactId>xml-apis</artifactId>
          <version>1.0.b2</version>
        </dependency>
        <dependency>
          <groupId>xml-apis</groupId>
          <artifactId>xmlParserAPIs</artifactId>
          <version>2.0.2</version>
        </dependency>
        <dependency>
          <groupId>xerces</groupId>
          <artifactId>xercesImpl</artifactId>
          <version>2.4.0</version>
        </dependency>
        <dependency>
          <groupId>xalan</groupId>
          <artifactId>xalan</artifactId>
          <version>2.7.0</version>
        </dependency>
        <dependency>
          <groupId>javax.xml</groupId>
          <artifactId>jaxp-api</artifactId>
          <version>1.3.1</version>
        </dependency>
        <dependency>
          <groupId>xpp3</groupId>
          <artifactId>xpp3</artifactId>
          <version>1.1.3.4.O</version>
        </dependency>
        <dependency>
          <groupId>lucene</groupId>
          <artifactId>lucene</artifactId>
          <version>1.4.3</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.4</version>
        </dependency>
        <dependency>
          <groupId>struts</groupId>
          <artifactId>struts</artifactId>
          <version>1.2.9</version>
        </dependency>
        <dependency>
          <groupId>oro</groupId>
          <artifactId>oro</artifactId>
          <version>2.0.8</version>
        </dependency>
        <dependency>
          <groupId>com.mockrunner</groupId>
          <artifactId>mockrunner</artifactId>
          <version>0.3.1</version>
        </dependency>
        <dependency>
          <groupId>commons-beanutils</groupId>
          <artifactId>commons-beanutils</artifactId>
          <version>1.7.0</version>
        </dependency>
        <dependency>
          <groupId>commons-digester</groupId>
          <artifactId>commons-digester</artifactId>
          <version>1.7</version>
        </dependency>
        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.0</version>
        </dependency>
        <dependency>
          <groupId>commons-httpclient</groupId>
          <artifactId>commons-httpclient</artifactId>
          <version>2.0</version>
        </dependency>
        <dependency>
          <groupId>commons-lang</groupId>
          <artifactId>commons-lang</artifactId>
          <version>2.1</version>
        </dependency>
        <dependency>
          <groupId>commons-validator</groupId>
          <artifactId>commons-validator</artifactId>
          <version>1.1.4</version>
        </dependency>
        <dependency>
          <groupId>mockobjects</groupId>
          <artifactId>mockobjects-core</artifactId>
          <version>0.09</version>
        </dependency>
        <dependency>
          <groupId>mockobjects</groupId>
          <artifactId>mockobjects-jdk1.4-j2ee1.3</artifactId>
          <version>0.09</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>1.2.5</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>1.2.5</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>1.2.5</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>1.2.5</version>
        </dependency>
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.9</version>
        </dependency>
        <dependency>
          <groupId>batik</groupId>
          <artifactId>batik-svggen</artifactId>
          <version>1.6</version>
        </dependency>
        <dependency>
          <groupId>batik</groupId>
          <artifactId>batik-awt-util</artifactId>
          <version>1.6</version>
        </dependency>
        <dependency>
          <groupId>batik</groupId>
          <artifactId>batik-util</artifactId>
          <version>1.6</version>
        </dependency>
        <dependency>
          <groupId>itext</groupId>
          <artifactId>itext</artifactId>
          <version>1.3</version>
        </dependency>
        <dependency>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>jetty</artifactId>
          <version>6.0.0beta16</version>
        </dependency>
        <dependency>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>jetty-util</artifactId>
          <version>6.0.0beta16</version>
        </dependency>
        <dependency>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>jsp-api-2.0</artifactId>
          <version>6.0.0beta16</version>
        </dependency>
        <dependency>
          <groupId>tomcat</groupId>
          <artifactId>jasper-compiler-jdt</artifactId>
          <version>5.5.15</version>
        </dependency>
        <dependency>
          <groupId>tomcat</groupId>
          <artifactId>jasper-compiler</artifactId>
          <version>5.5.15</version>
        </dependency>
        <dependency>
          <groupId>tomcat</groupId>
          <artifactId>jasper-runtime</artifactId>
          <version>5.5.15</version>
        </dependency>
        <dependency>
          <groupId>xerces</groupId>
          <artifactId>xercesImpl</artifactId>
          <version>2.6.2</version>
        </dependency>
        <dependency>
          <groupId>xerces</groupId>
          <artifactId>xmlParserAPIs</artifactId>
          <version>2.6.2</version>
        </dependency>
        <dependency>
          <groupId>commons-el</groupId>
          <artifactId>commons-el</artifactId>
          <version>1.0</version>
        </dependency>
        <dependency>
          <groupId>ant</groupId>
          <artifactId>ant</artifactId>
          <version>1.6.4</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jcl104-over-slf4j</artifactId>
          <version>1.0-rc5</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-simple</artifactId>
          <version>1.0-rc5</version>
        </dependency>
      </dependencies>
    </dependencyManagement>
    <properties>
      <gs.version>1.4.0-M1</gs.version>
      <configId>minimal</configId>
      <gt.version>2.2.0</gt.version>
    </properties>
  </project>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/action-servlet.xml
  
  Index: action-servlet.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  
  <beans>
  	<bean name="/admin/loginSubmit" 
  		class="org.vfny.geoserver.action.LoginAction">
  	</bean>
  </beans>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/catalog.xml
  
  Index: catalog.xml
  ===================================================================
  <?config.xml version="1.0" encoding="UTF-8"?>
  <catalog>
  
  
  <!--
  a datastore configuration element serves as a common data source connection
  parameters repository for all featuretypes it holds.
  -->
  <datastores>
  <datastore namespace = "metacat" enabled = "true" id = "Data_Points" >
  <connectionParams>
  <parameter value = "metacat" name = "namespace"  />
  <parameter value = "file:data/metacat_shps/data_points.shp" name = "url"  />
  </connectionParams>
  </datastore>
  
  <datastore namespace = "metacat" enabled = "true" id = "Metacat_test" >
  <connectionParams>
  <parameter value = "metacat" name = "namespace"  />
  <parameter value = "file:data/metacat_shps/metacat_testdata.shp" name = "url"  />
  </connectionParams>
  </datastore>
  
  <datastore namespace = "metacat" enabled = "true" id = "Data_Bounds" >
  <connectionParams>
  <parameter value = "metacat" name = "namespace"  />
  <parameter value = "file:data/metacat_shps/data_bounds.shp" name = "url"  />
  </connectionParams>
  </datastore>
  
  <datastore namespace = "metacat" enabled = "true" id = "countries" >
  <connectionParams>
  <parameter value = "metacat" name = "namespace"  />
  <parameter value = "file:data/shp/world_borders.shp" name = "url"  />
  </connectionParams>
  </datastore>
  
  <datastore namespace = "metacat" enabled = "true" id = "states_shp" >
  <connectionParams>
  <parameter value = "metacat" name = "namespace"  />
  <parameter value = "file:data/shp/states.shp" name = "url"  />
  </connectionParams>
  </datastore>
  
  <datastore namespace = "knp" enabled = "true" id = "kruger_boundary" >
  <connectionParams>
  <parameter value = "knp" name = "namespace"  />
  <parameter value = "file:data/shp/BNDRY_KRUGERNP.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "knp" enabled = "true" id = "kruger_soils" >
  <connectionParams>
  <parameter value = "knp" name = "namespace"  />
  <parameter value = "file:data/shp/SOILS_VENTER.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "knp" enabled = "true" id = "kruger_roads" >
  <connectionParams>
  <parameter value = "knp" name = "namespace"  />
  <parameter value = "file:data/shp/INFRA_ROADSPUBLIC_VIEW.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "knp" enabled = "true" id = "kruger_bizunits" >
  <connectionParams>
  <parameter value = "knp" name = "namespace"  />
  <parameter value = "file:data/shp/BNDRY_BUSINESSUNITS.shp" name = "url"  />
  </connectionParams>
  </datastore>
  
  </datastores>
  
  
  <!--
  Defines namespaces to be used by the datastores.
  -->
  <namespaces>
  <namespace uri = "http://knb.ecoinformatics.org/metacat" prefix = "metacat" default = "true"  />
  <namespace uri = "http://dataknp.sanparks.org/knp" prefix = "knp" default = "false"  />
  </namespaces>
  
  
  <!--
  Defines the style ids to be used by the wms.  The files must be
  contained in geoserver/misc/wms/styles.  We're working on finding
  a better place for them, but for now that's where you must put them
  if you want them on the server.
  -->
  <styles>
  <style filename = "NamedPlaces.sld" id = "cite_named_places"  />
  <style filename = "capitals.sld" id = "capitals"  />
  <style filename = "green.sld" id = "green"  />
  <style filename = "data_bounds_style.sld" id = "data_bounds_style"  />
  <style filename = "data_points_style.sld" id = "data_points_style"  />
  <style filename = "simpleRoads.sld" id = "simple_roads"  />
  <style filename = "popshade.sld" id = "population"  />
  <style filename = "Lakes.sld" id = "cite_lakes"  />
  <style filename = "simpleRoads.sld" id = "krugerRoads"  />
  <style filename = "default_polygon.sld" id = "defaultPolygon"  />
  </styles>
  </catalog>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/catalog.xml.dist
  
  Index: catalog.xml.dist
  ===================================================================
  <?config.xml version="1.0" encoding="UTF-8"?>
  <catalog>
  <datastores>
  <!--
  a datastore configuration element serves as a common data source connection
  parameters repository for all featuretypes it holds.
  -->
  <datastore namespace = "tiger" enabled = "true" id = "DS_giant_polygon" >
  <abstract></abstract>
  <connectionParams>
  <parameter value = "tiger" name = "namespace"  />
  <parameter value = "file:data/nyc/giant_polygon.shp" name = "url"  
  />
  </connectionParams>
  </datastore>
  <datastore namespace = "topp" enabled = "true" id = "states_shapefile" >
  <connectionParams>
  <parameter value = "file:data/shapefiles/states.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "tiger" enabled = "true" id = "DS_poi" >
  <abstract></abstract>
  <connectionParams>
  <parameter value = "tiger" name = "namespace"  />
  <parameter value = "file:data/nyc/poi.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "topp" enabled = "true" id = "tasmania_cities" >
  <connectionParams>
  <parameter value = "file:data/taz_shapes/tasmania_cities.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "topp" enabled = "true" id = "tasmania_roads" >
  <connectionParams>
  <parameter value = "file:data/taz_shapes/tasmania_roads.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "topp" enabled = "true" id = "tasmania_state_boundaries" >
  <connectionParams>
  <parameter value = "file:data/taz_shapes/tasmania_state_boundaries.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "tiger" enabled = "true" id = "DS_poly_landmarks" >
  <abstract></abstract>
  <connectionParams>
  <parameter value = "tiger" name = "namespace"  />
  <parameter value = "file:data/nyc/poly_landmarks.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "tiger" enabled = "true" id = "DS_tiger_roads" >
  <abstract></abstract>
  <connectionParams>
  <parameter value = "tiger" name = "namespace"  />
  <parameter value = "file:data/nyc/tiger_roads.shp" name = "url"  />
  </connectionParams>
  </datastore>
  <datastore namespace = "topp" enabled = "true" id = "tasmania_water_bodies" >
  <connectionParams>
  <parameter value = "file:data/taz_shapes/tasmania_water_bodies.shp" 
  name = "url"  /> </connectionParams>
  </datastore>
  </datastores>
  <!--
  Defines namespaces to be used by the datastores.
  -->
  <namespaces>
  <namespace uri = "http://www.openplans.org/topp" prefix = "topp" default = "true"  />
  <namespace uri = "http://www.census.gov" prefix = "tiger"  />
  <namespace uri = "http://www.opengeospatial.net/cite" prefix = "cite"  />
  </namespaces>
  <styles>
  <!--
  Defines the style ids to be used by the wms.  The files must be
  contained in geoserver/misc/wms/styles.  We're working on finding
  a better place for them, but for now that's where you must put them
  if you want them on the server.
  -->
  <style filename = "giant_polygon.sld" id = "giant_polygon"  />
  <style filename = "capitals.sld" id = "capitals"  />
  <style filename = "tiger_roads.sld" id = "tiger_roads"  />
  <style filename = "poly_landmarks.sld" id = "poly_landmarks"  />
  <style filename = "green.sld" id = "green"  />
  <style filename = "simpleRoads.sld" id = "simple_roads"  />
  <style filename = "poi.sld" id = "poi"  />
  <style filename = "Lakes.sld" id = "cite_lakes"  />
  <style filename = "popshade.sld" id = "population"  />
  <style filename = "default_point.sld" id = "point"  />
  <style filename = "default_line.sld" id = "line"  />
  <style filename = "default_polygon.sld" id = "polygon"  />
  </styles>
  </catalog>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/dispatcher-servlet.xml
  
  Index: dispatcher-servlet.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  
  <beans>
    <!-- controller for handling all incoming requests -->
    <bean id="requestDispatcher"
      class="org.geoserver.request.Dispatcher">
      <constructor-arg ref="geoServer"/>
    </bean>
  
    <!-- url mappings -->
    <bean id="urlMapping"
      class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
      <property name="mappings">
        <props>
          <prop key="*">requestDispatcher</prop>
        </props>
      </property>
    </bean>
  
   
  </beans>
   
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/log4j.properties
  
  Index: log4j.properties
  ===================================================================
  # For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!
  # For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
  log4j.rootLogger=INFO, stdout
  
  log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
  
  log4j.appender.logfile=org.apache.log4j.RollingFileAppender
  
  # Keep three backup files.
  log4j.appender.logfile.MaxBackupIndex=3
  # Pattern to output: date priority [category] - message
  log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
  log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/org.openplans.geoserver-servlet.xml
  
  Index: org.openplans.geoserver-servlet.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  
  <beans>
  	<!-- controller for handling all incoming requests -->
  	<bean id="org.openplans.geoserver.requestController" 
  		class="org.openplans.geoserver.RequestController"/>
  
  	<!-- url mappings -->		
  	<bean id="org.openplans.geoserver.urlMapping"
  		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  		<property name="mappings">
  			<props>
  				<prop key="*.gs">org.openplans.geoserver.requestController</prop>
  			</props>
  		</property>
  	</bean>
  	
  	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  	  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  	  <property name="prefix" value="/WEB-INF/jsp/"/>
  	  <property name="suffix" value=".jsp"/>
  	</bean>
  </beans>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/services.xml
  
  Index: services.xml
  ===================================================================
  <?config.xml version="1.0" encoding="UTF-8"?>
  <!--
  Service level configuration
  -->
  <serverConfiguration>
  <global>
  <!--
  Defines the logging level.  Common options are SEVERE,
  WARNING, INFO, CONFIG, FINER, FINEST, in order of
  Increasing statements logged.
  -->
  <loggingLevel>INFO</loggingLevel>
  <!--
  Sets the max number of Features returned by GetFeature
  -->
  <maxFeatures value = "1000000" />
  <!--
  Whether newlines and indents should be returned in 
  XML responses.  Default is false
  -->
  <verbose value = "false" />
  <!--
  Whether the Service Exceptions returned to clients should contain
  full java stack traces (useful for debugging). 
  -->
  <verboseExceptions value = "false" />
  <!--
  Sets the max number of decimal places past the zero returned in
  a GetFeature response.  Default is 4
  -->
  <numDecimals value = "8" />
  <!--
  Sets the global character set.  This could use some more testing
  from international users, but what it does is sets the encoding
  globally for all postgis database connections (the charset tag
  in FeatureTypeConfig), as well as specifying the encoding in the return
  config.xml header and mime type.  The default is UTF-8.  Also be warned
  that GeoServer does not check if the CharSet is valid before
  attempting to use it, so it will fail miserably if a bad charset
  is used.
  -->
  <charSet value = "UTF-8" />
  <!--
  Define a base url for the location of the wfs schemas.
  By default GeoServer loads and references its own at
  <URL>/data/capabilities. Uncomment to enable.  The
  standalone Tomcat server needs SchemaBaseUrl defined
  for validation.
  -->
  <SchemaBaseUrl>C:\eclipse\workspace\geoserver_trunk\cite\confUserBasic/data/capabilities/</SchemaBaseUrl>
  <!--
  Defines the user name of the administrator for log in
  to the web based administration tool.
  -->
  <adminUserName>admin</adminUserName>
  <!--
  Defines the password of the administrator for log in
  to the web based administration tool.
  -->
  <adminPassword>geoserver</adminPassword>
  </global>
  <services>
  <service type = "WFS" enabled = "true" >
  <!--
  ServiceDTO elements, needed for the capabilities document
  Title and OnlineResource are the two required
  -->
  <name>Metacat Spatial WFS</name>
  <title>Metacat Spatial WFS</title>
  <abstract>
  This is a description of your Web Feature Server.
  
  The GeoServer is a full transactional Web Feature Server, you may wish to limit
  GeoServer to a Basic service level to prevent modificaiton of your geographic
  data.
       </abstract>
  <keywords>
  <keyword>WFS</keyword>
  <keyword>WMS</keyword>
  <keyword>GEOSERVER</keyword>
  </keywords>
  <onlineResource>http://knb.ecoinformatics.org</onlineResource>
  <fees>NONE</fees>
  <accessConstraints>Certain functionality requires authenticated session</accessConstraints>
  <srsXmlStyle value = "true" />
  <serviceLevel value = "31" />
  <citeConformanceHacks>false</citeConformanceHacks>
  <maintainer>http://knb.ecoinformatics.org</maintainer>
  </service>
  <service type = "WMS" enabled = "true" >
  <!--
  ServiceDTO elements, needed for the capabilities document
  Title and OnlineResource are the two required
  -->
  <name>Metacat Spatial WMS</name>
  <title>Metacat Spatial WMS</title>
  <abstract>
  This is a description of your Web Map Server.
       </abstract>
  <keywords>
  <keyword>WFS</keyword>
  <keyword>WMS</keyword>
  <keyword>GEOSERVER</keyword>
  </keywords>
  <onlineResource>http://knb.ecoinformatics.org</onlineResource>
  <fees>NONE</fees>
  <accessConstraints>Certain functionality requires authenticated session</accessConstraints>
  <srsXmlStyle value = "false" />
  <maintainer>http://knb.ecoinformatics.org</maintainer>
  <svgAntiAlias>true</svgAntiAlias>
  </service>
  </services>
  </serverConfiguration>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/struts-bean.tld
  
  Index: struts-bean.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>bean</shortname>
  <uri>http://jakarta.apache.org/struts/tags-bean</uri>
  <tag>
  <name>cookie</name>
  <tagclass>org.apache.struts.taglib.bean.CookieTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.CookieTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>define</name>
  <tagclass>org.apache.struts.taglib.bean.DefineTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.DefineTei</teiclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>toScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>header</name>
  <tagclass>org.apache.struts.taglib.bean.HeaderTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.HeaderTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>include</name>
  <tagclass>org.apache.struts.taglib.bean.IncludeTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.IncludeTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>message</name>
  <tagclass>org.apache.struts.taglib.bean.MessageTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>arg0</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg1</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg2</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg3</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg4</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>key</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>page</name>
  <tagclass>org.apache.struts.taglib.bean.PageTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.PageTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>parameter</name>
  <tagclass>org.apache.struts.taglib.bean.ParameterTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.ParameterTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>resource</name>
  <tagclass>org.apache.struts.taglib.bean.ResourceTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.ResourceTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>input</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>size</name>
  <tagclass>org.apache.struts.taglib.bean.SizeTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.SizeTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>struts</name>
  <tagclass>org.apache.struts.taglib.bean.StrutsTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.StrutsTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>formBean</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>mapping</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>write</name>
  <tagclass>org.apache.struts.taglib.bean.WriteTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>filter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>format</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>formatKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ignore</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/struts-config.xml
  
  Index: struts-config.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  
  <!DOCTYPE struts-config PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
            "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
  
  <struts-config>
  
  <!-- ==================================== Data Source Configuration -->
  
  <!-- ======================================== Form Bean Definitions -->
  
      <form-beans>
          <!--
            form-bean: maps ActionForm instances
            name: name of of form bean
            type: class of form bean
          -->
          
          <form-bean 
  	    name="srsInfoForm" 
  	    type="org.apache.struts.action.DynaActionForm">
  	    <form-property 
  	        name="srsDefinitionList"
  	        type="java.lang.String[]" 
  	    />
  	    <form-property 
  	        name="srsIDList" 
  	        type="java.lang.String[]" 
  	    />
  		</form-bean>
  		
  	    <form-bean
      		name="sldWizardForm"
      		type="org.vfny.geoserver.form.data.SLDWizardForm"/>
      		
  		
  		<form-bean 
  	    name="mapPreviewForm" 
  	    type="org.apache.struts.action.DynaActionForm">
  	    <form-property 
  	        name="DSNameList"
  	        type="java.lang.String[]" 
  	    />
  	    <form-property 
  	        name="FTNameList" 
  	        type="java.lang.String[]" 
  	    />
  	    <form-property 
  	        name="FTNamespaceList" 
  	        type="java.lang.String[]" 
  	    />
  	    <form-property 
  	        name="BBoxList" 
  	        type="java.lang.String[]" 
  	    />
  		</form-bean>
  	    
  	    
      	<form-bean
      		name="loginForm"
      		type="org.vfny.geoserver.form.LoginForm"/>
      		    		  		
      	<form-bean
      		name="demoForm"
      		type="org.vfny.geoserver.form.DemoForm"/>
      		
      	<form-bean
      		name="demoRequestForm"
      		type="org.vfny.geoserver.form.DemoRequestForm"/>
  
      	<form-bean
      		name="loginEditForm"
      		type="org.vfny.geoserver.form.LoginForm"/>
      
      	<form-bean
      		name="geoServerConfigurationForm"
      		type="org.vfny.geoserver.form.global.GeoServerConfigurationForm"/>
      
      	<form-bean
      		name="wfsDescriptionForm"
      		type="org.vfny.geoserver.form.wfs.WFSDescriptionForm"/>
      		
      	<form-bean
      		name="wfsContentForm"
      		type="org.vfny.geoserver.form.wfs.WFSContentForm"/>
  
      	<form-bean
      		name="wmsDescriptionForm"
      		type="org.vfny.geoserver.form.wms.WMSDescriptionForm"/>
      		
      	<form-bean
      		name="wmsContentForm"
      		type="org.vfny.geoserver.form.wms.WMSContentForm"/>
  	
  		<form-bean
  			name="wmsRenderingForm"
  			type="org.vfny.geoserver.form.wms.WMSRenderingForm"/>
  			
  		<form-bean
      		name="dataDataStoresSelectForm"
      		type="org.vfny.geoserver.form.data.DataDataStoresSelectForm"/>
      	<form-bean
      		name="dataDataStoresNewForm"
      		type="org.vfny.geoserver.form.data.DataDataStoresNewForm"/>
      	<form-bean
      		name="dataDataStoresEditorForm"
      		type="org.vfny.geoserver.form.data.DataDataStoresEditorForm"/>
      		
      	<!-- DATA Namespace -->
      	<form-bean
      		name="dataNamespacesSelectForm"
      		type="org.vfny.geoserver.form.data.DataNamespacesSelectForm"/>
      	<form-bean
      		name="dataNamespacesNewForm"
      		type="org.vfny.geoserver.form.data.DataNamespacesNewForm"/>
      	<form-bean
      		name="dataNamespacesEditorForm"
      		type="org.vfny.geoserver.form.data.DataNamespacesEditorForm"/>
      	
      		
  		<!-- DATA Styles -->
      	<form-bean
      		name="dataStylesSelectForm"
      		type="org.vfny.geoserver.form.data.StylesSelectForm"/>
      	<form-bean
      		name="dataStylesNewForm"
      		type="org.vfny.geoserver.form.data.StylesNewForm"/>
      	<form-bean
      		name="dataStylesEditorForm"
      		type="org.vfny.geoserver.form.data.StylesEditorForm"/>
      		
  
  		<!-- DATA FeatureType -->
      	<form-bean
      		name="dataFeatureTypesSelectForm"
      		type="org.vfny.geoserver.form.data.DataFeatureTypesSelectForm"/>
      	<form-bean
      		name="dataFeatureTypesNewForm"
      		type="org.vfny.geoserver.form.data.DataFeatureTypesNewForm"/>
      	<form-bean
      		name="typesEditorForm"
      		type="org.vfny.geoserver.form.data.TypesEditorForm"/>
     		<form-bean
      		name="typesEditorNewSLDForm"
      		type="org.vfny.geoserver.form.data.TypesEditorNewSLDForm"/>
      	<form-bean
      		name="validationTestSuiteSelectForm"
      		type="org.vfny.geoserver.form.validation.ValidationTestSuiteSelectForm"/>
      	<form-bean
      		name="validationTestSelectForm"
      		type="org.vfny.geoserver.form.validation.ValidationTestSelectForm"/>
      	<form-bean
      		name="validationTestNewForm"
      		type="org.vfny.geoserver.form.validation.ValidationTestNewForm"/>
      	<form-bean
      		name="validationTestEditorForm"
      		type="org.vfny.geoserver.form.validation.ValidationTestEditorForm"/>
      	<form-bean
      		name="validationTestSuiteNewForm"
  	   		type="org.vfny.geoserver.form.validation.ValidationTestSuiteNewForm"/>
      		
  		<form-bean
  			name="blankBean"
  			type="org.apache.struts.action.DynaActionForm"/>
      		
      </form-beans>
  
  <!-- ================================= Global Exception Definitions -->
  
      <global-exceptions>
      </global-exceptions>
  
  <!-- =================================== Global Forward Definitions -->
  
      <global-forwards>
          <!-- Default forward to "Welcome" action -->
          <!-- Demonstrates using index.jsp to forward -->
          <forward
              name="welcome"
              path="/welcome.do"/>    
              
                  
          <forward 
          	name="contact"
          	path="/contactInformation.do"/>
  
          <forward 
          	name="welcome.demo"
          	path="/demo.do"/>
          	
          <forward 
          	name="welcome.demoRequest"
          	path="/demoRequest.do"/>
          
          	
          <!-- Appearance -->       		
         	<forward name="style" path="/style.css"/>
         	<forward name="icon" path="/images/gs.gif"/>
         	<forward name="favicon" path="/images/gs.ico"/>
         		
          <!-- ADMIN -->
          <forward 
          	name="admin"
          	path="/admin/index.do"/>
  
          <forward 
          	name="admin.main"
          	path="/admin/main.do"/>
  
          <forward 
          	name="admin.freeLocks"
          	path="/admin/freeLocks.do"/>
          	
          <forward 
          	name="admin.freeMemory"
          	path="/admin/freeMemory.do"/>
          	
          <forward 
          	name="login"
          	path="/admin/login.do"/>        
          	        	
          <forward 
         		name="logout"
          	path="/admin/logout.do"/>
  
          <!-- CONFIG -->        	
         	<forward
         		name="config"
         		path="/config/index.do"/>
          	
         	<forward
         		name="geoServer"
         		path="/config/geoServer.do"/>
         		
         	<forward
         		name="config.server"
         		path="/config/server.do"/>
  
          <forward 
          	name="config.server.login"
          	path="/config/loginEdit.do"/>
          	
          <!-- CONFIG validation -->
          <forward
          	name="config.validation"
          	path="/config/validation/suite.do"/>
          <forward
          	name="config.validation.suite"
          	path="/config/validation/suite.do"/>
         	<forward
         		name="config.validation.suite.doit"
         		path="/config/validation/suiteRun.do"/>
          <forward
          	name="suite"
          	path="/config/validation/suite.do"/>
          <forward
          	name="validationTest"
          	path="/config/validation/testSelect.do"/>
          <forward
          	name="config.validation.test"
          	path="/config/validation/testSelect.do"/>
         	<forward
         		name="config.validation.test.doit"
         		path="/config/validation/suiteRun.do"/>
         	<forward
         		name="config.validation.test.doitStop"
         		path="/config/validation/suiteStop.do"/>       		
          <forward
          	name="validationTestEditor"
          	path="/config/validation/testEdit.do"/>
          <forward
          	name="config.validation.displayResults"
          	path="/config/validation/displayResults.do"/>
          	
          <!-- CONFIG wfs -->
          
         	<forward
         		name="config.wfs"
         		path="/config/wfs/index.do"/>
          <forward
         		name="config.wfs.description"
         		path="/config/wfs/description.do"/>
         	<forward
         		name="config.wfs.content"
         		path="/config/wfs/content.do"/>
         		
         	<forward
         		name="wfsConfigDescription"
         		path="/config/wfs/description.do"/>
         	<forward
         		name="wfsConfigContent"
         		path="/config/wfs/content.do"/>
         		
          <!-- CONFIG wms -->       		
         	<forward
         		name="config.wms"
         		path="/config/wms/index.do"/>
          <forward
         		name="config.wms.description"
         		path="/config/wms/description.do"/>
         	<forward
         		name="config.wms.content"
         		path="/config/wms/content.do"/>
       	<forward
       		name="config.wms.rendering"
       		path="/config/wms/rendering.do"/>
        	
         	<forward
         		name="wmsConfigDescription"
         		path="/config/wms/description.do"/>
         	<forward
         		name="wmsConfigContent"
         		path="/config/wms/content.do"/>
  
          <!-- CONFIG data -->
         	<forward
         		name="config.data"
         		path="/config/data/index.do"/>
  
          <!-- CONFIG data store -->
         	<forward
         		name="config.data.store"
         		path="/config/data/store.do"/>
         	<forward
         		name="config.data.store.new"
         		path="/config/data/storeNew.do"/>
         	<forward
         		name="config.data.store.editor"
         		path="/config/data/storeEditor.do"/>
         		
          <!-- CONFIG data namespace -->
         	<forward
         		name="config.data.namespace"
         		path="/config/data/namespace.do"/>
         	<forward
         		name="config.data.namespace.select"
         		path="/config/data/namespaceSelect.do"/>
         	<forward
         		name="config.data.namespace.editor"
         		path="/config/data/namespaceEditor.do"/>
         	<forward
         		name="config.data.namespace.new"
         		path="/config/data/namespaceNew.do"/>
         		
          <!-- CONFIG data style -->
         	<forward
         		name="config.data.style"
         		path="/config/data/style.do"/>
         	<forward
         		name="config.data.style.select"
         		path="/config/data/styleSelect.do"/>       		
         	<forward
         		name="config.data.style.new"
         		path="/config/data/styleNew.do"/>
         	<forward
         		name="config.data.style.editor"
         		path="/config/data/styleEditor.do"/>
  
          <!-- CONFIG data type -->       		
         	<forward
         		name="config.data.type"
         		path="/config/data/typeSelect.do"/>
         	<forward
         		name="config.data.type.new"
         		path="/config/data/typeNew.do"/>
         	<forward
         		name="config.data.type.editor"
         		path="/config/data/typeEditor.do"/>
  
         		
         	<forward
         		name="config.data.calculateBoundingBox"
         		path="/config/data/calculateBoundingBox.do"/>
         	<forward
         		name="SLDWizard"
         		path="/WEB-INF/pages/SLDWizard.jsp"/>
  
         		
      </global-forwards>
  
  <!-- =================================== Action Mapping Definitions -->
  
      <action-mappings>
          <!-- WELCOME -->
          <action
              path="/welcome"
              type="org.apache.struts.actions.ForwardAction"
              parameter="welcome"
              name="blankBean"/>
          <action
              path="/"
              type="org.apache.struts.actions.ForwardAction"
              parameter="welcome"
              name="blankBean"/>
  
          <action
              path="/contactInformation"
              type="org.apache.struts.actions.ForwardAction"
              parameter="welcome.contact"/>                             	       	
  
  		<action
  			path ="/demo"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="welcome.demo"/>
          	
         	<action
  			path ="/demoRequest"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="welcome.demoRequest"/>
          	
          <!-- ADMIN -->
          <action
          	path ="/admin/index"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="admin"
          	name="blankBean"/>        	
          <action
          	path ="/admin"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="admin"
          	name="blankBean"/>       
  
          <action
          	path ="/admin/main"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="admin.main"
          	name="blankBean"/>        	
  
          <action
          	path ="/admin/freeLocks"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="admin.freeLocks"
          	name="blankBean"/>
  
          <action
          	path ="/admin/freeMemory"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="admin.freeMemory"
          	name="blankBean"/>
          	        	
  		<action
  			path ="/admin/login"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="admin.login"/>
                  	
  		<action        	
  			path ="/admin/logout"
          	type="org.vfny.geoserver.action.LogoutAction"
          	parameter=""/>
          	
          <!-- CONFIG -->
          <action
          	path="/config/index"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config"
          	name="blankBean"/>
          <action
          	path="/config"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config"
          	name="blankBean"/>
          <action
          	path="/config/server"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.server"
          	name="blankBean"/>
  
          <action
          	path="/config/loginEdit"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.server.login"/>
  
  
          <!-- CONFIG WFS -->        	
          <action
          	path="/config/wfs/index"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wfs"/>    	
          <action
          	path="/config/wfs"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wfs"/>
  
          <action
          	path="/config/wfs/description"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wfs.description"/>
  
          <action
          	path="/config/wfs/content"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wfs.content"/>
          	
          <!-- CONFIG WMS -->
          <action
          	path="/config/wms/index"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wms"/>      	
          <action
          	path="/config/wms"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wms"/>      
  
          <action
          	path="/config/wms/description"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wms.description"/>
  
          <action
          	path="/config/wms/content"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wms.content"/>
          	
         	<action 
         		path="/config/wms/rendering"
         		type="org.apache.struts.actions.ForwardAction"
          	parameter="config.wms.rendering"/>
         		
          <!-- CONFIG VALIDATION -->
          <action
          	path="/config/validation/index"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.validation.suite"/>
          <action
          	path="/config/validation"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.validation.suite"/>
  
          <action
          	path="/config/validation/suite"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.validation.suite"/>
          	        	
          <action
          	path="/config/validation/testSelect"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.validation.test"/>
          	
          <action
          	path="/config/validation/testEdit"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.validation.test.editor"/>
  
          <action
          	path="/config/validation/displayResults"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.validation.displayResults"/>
          	        	
          <!-- DATA -->
          <action
          	path="/config/data/index"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data"/>    
          <action
          	path="/config/data"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data"/>      
          	
         <!-- DATA STORES -->
          <action
          	path="/config/data/store"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.store"/>
          <action	
          	path="/config/data/storeNew"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.store.new"/>
          <action
          	path="/config/data/storeEditor"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.store.editor"/>        	
          	
         <!-- DATA Namespaces -->        	
          <action
          	path="/config/data/namespace"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.namespace"/>
          <action
          	path="/config/data/namespaceNew"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.namespace.new"/>
          <action
          	path="/config/data/namespaceEditor"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.namespace.editor"/>        	        	
  
  		<!-- DATA styles -->        	
          <action
          	path="/config/data/style"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.style"/>
          <action
          	path="/config/data/styleNew"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.style.new"/>
          <action
          	path="/config/data/styleEditor"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.style.editor"/>
          	
  		<!-- DATA featuretypes -->
          <action
          	path="/config/data/typeSelect"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.type"/>
          <action
          	path="/config/data/typeNew"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.type.new"/>
          <action
          	path="/config/data/typeEditor"
          	type="org.apache.struts.actions.ForwardAction"
          	parameter="config.data.type.editor"/>
          	
  		<!-- Submit Actions -->    
  		<!-- Welcome Actions -->
  		<!--type="org.springframework.web.struts.DelegatingActionProxy"-->
  		
  		<action
  			path="/admin/loginSubmit"
  			type="org.vfny.geoserver.action.LoginAction" 
  			name="loginForm"
  			scope="request"
  			validate="true"
  			input="/admin/login.do"/>
  			
  		<action
  			path="/config/loginEditSubmit"
  			type="org.vfny.geoserver.action.LoginEditAction"
  			name="loginEditForm"
  			scope="request"
  			validate="true"
  			input="/config/loginEdit.do"/>
  
  		<action
  			path="/demoSubmit"
  			type="org.vfny.geoserver.action.DemoAction"
  			name="demoForm"
  			scope="request"
  			validate="true"
  			input="/demo.do"/>
  			
  		<action
  			path="/demoRequestSubmit"
  			type="org.vfny.geoserver.action.DemoRequestAction"
  			name="demoRequestForm"
  			scope="request"
  			validate="true"
  			input="/demoRequest.do"/>
  			
  			
  		<!-- Admin Actions -->
          <action
          	path="/admin/index"
          	type="org.vfny.geoserver.action.AdminIndexAction"
          	name="blankBean"/>
  
          <action
          	path="/admin/freeLocks"
          	type="org.vfny.geoserver.action.FreeLocksAction"
          	name="blankBean"/>
  
          <action
          	path="/admin/freeMemory"
          	type="org.vfny.geoserver.action.FreeMemoryAction"
          	name="blankBean"/>
          	        	
          <!-- Config Actions -->
  		<action    	
          	path="/config/geoServerSubmit"
          	type="org.vfny.geoserver.action.global.GeoServerConfigurationSubmit"
          	name="geoServerConfigurationForm"
          	scope="request"
          	validate="true"
          	input="/config/server.do"/>
          	
         	<!-- WFS Actions -->
          <action
          	path="/config/wfs/descriptionSubmit"
          	type="org.vfny.geoserver.action.wfs.WFSDescriptionAction"
          	name="wfsDescriptionForm"
          	scope="request"
          	validate="true"
          	input="/config/wfs/description.do"/>
          	
          <action
          	path="/config/wfs/contentSubmit"
          	type="org.vfny.geoserver.action.wfs.WFSContentAction"
          	name="wfsContentForm"
          	scope="request"
          	validate="true"
          	input="/config/wfs/content.do"/>
  
         	<!-- WMS Actions -->
          <action
          	path="/config/wms/descriptionSubmit"
          	type="org.vfny.geoserver.action.wms.WMSDescriptionAction"
          	name="wmsDescriptionForm"
          	scope="request"
          	validate="true"
          	input="/config/wms/description.do"/>
          <action
          	path="/config/wms/contentSubmit"
          	type="org.vfny.geoserver.action.wms.WMSContentAction"
          	name="wmsContentForm"
          	scope="request"
          	validate="true"
          	input="/config/wms/content.do"/>
  		<action
          	path="/config/wms/renderingSubmit"
          	type="org.vfny.geoserver.action.wms.WMSRenderingAction"
          	name="wmsRenderingForm"
          	scope="request"
          	validate="true"
          	input="/config/wms/rendering.do"/>
         
         	<!-- DATA Stores Actions -->
          <action
          	path="/config/data/storeSubmit"
          	type="org.vfny.geoserver.action.data.DataDataStoresEditorAction"
          	name="dataDataStoresEditorForm"
          	scope="request"
          	validate="true"
          	input="/config/data/storeEditor.do"/>
          	
          <action
          	path="/config/data/storeSelectSubmit"
          	type="org.vfny.geoserver.action.data.DataDataStoresSelectAction"
          	name="dataDataStoresSelectForm"
          	scope="request"
          	validate="true"
          	input="/config/data/storeEditor.do"/>
  
          <action
          	path="/config/data/storeNewSubmit"
          	type="org.vfny.geoserver.action.data.DataDataStoresNewAction"
          	name="dataDataStoresNewForm"
          	scope="request"
          	validate="true"
          	input="/config/data/storeNew.do"/>        	
        
  		<!-- DATA Namespaces Actions -->
          <action
          	path="/config/data/namespaceSelect"
          	type="org.vfny.geoserver.action.data.DataNamespacesSelectAction"
          	name="dataNamespacesSelectForm"
          	scope="request"
          	validate="true"
          	input="/config/data/namespaceSelect.do"/>
          <action
          	path="/config/data/namespaceNewSubmit"
          	type="org.vfny.geoserver.action.data.DataNamespacesNewAction"
          	name="dataNamespacesNewForm"
          	scope="request"
          	validate="true"
          	input="/config/data/namespaceNew.do"/>
          <action
          	path="/config/data/namespaceSubmit"
          	type="org.vfny.geoserver.action.data.DataNamespacesEditorAction"
          	name="dataNamespacesEditorForm"
          	scope="request"
          	validate="true"
          	input="/config/data/namespaceEditor.do"/>
          	
  		<!-- DATA Styles Actions -->        	
          <action
          	path="/config/data/styleSelectSubmit"
          	type="org.vfny.geoserver.action.data.StylesSelectAction"
          	name="dataStylesSelectForm"
          	scope="request"
          	validate="true"
          	input="/config/data/styleSelect.do"/>
          <action
          	path="/config/data/styleNewSubmit"
          	type="org.vfny.geoserver.action.data.StylesNewAction"
          	name="dataStylesNewForm"
          	scope="request"
          	validate="true"
          	input="/config/data/styleNew.do"/>
          <action
          	path="/config/data/styleEditorSubmit"
          	type="org.vfny.geoserver.action.data.StylesEditorAction"
          	name="dataStylesEditorForm"
          	scope="request"
          	validate="true"
          	input="/config/data/styleEditor.do">
          	   <forward name="schemaErrors" path="/WEB-INF/pages/schemaErrors.jsp"/>
           </action>
          	        	        	
  		<!-- DATA FeatureType Actions -->
          <action
          	path="/config/data/typeSelectSubmit"
          	type="org.vfny.geoserver.action.data.DataFeatureTypesSelectAction"
          	name="dataFeatureTypesSelectForm"
          	scope="request"
          	validate="true"
          	input="/config/data/typeSelect.do"/>
           <action
          	path="/config/data/typeNewSubmit"
          	type="org.vfny.geoserver.action.data.DataFeatureTypesNewAction"
          	name="dataFeatureTypesNewForm"
          	scope="request"
          	validate="true"
          	input="/config/data/typeNew.do"/>        	
          <action
          	path="/config/data/typeEditorSubmit"
          	type="org.vfny.geoserver.action.data.TypesEditorAction"
          	name="typesEditorForm"
          	scope="request"
          	validate="true"
          	input="/config/data/typeEditor.do"/>
          	
          	
  		 <!-- DATA Validation -->
   
           <action
          	path="/config/validation/testSuiteSelect"
          	type="org.vfny.geoserver.action.validation.ValidationTestSuiteSelectAction"
          	name="validationTestSuiteSelectForm"
          	scope="request"
          	validate="true"
          	input="/config/validation/testSuiteSelect.do"/>
  
           <action
          	path="/config/validation/testSuiteNew"
          	type="org.vfny.geoserver.action.validation.ValidationTestSuiteNewAction"
          	name="validationTestSuiteNewForm"
          	scope="request"
          	validate="true"
          	input="/config/validation/testSuiteSelect.do"/>
  
           <action
          	path="/config/validation/test"
          	type="org.vfny.geoserver.action.validation.ValidationTestSelectAction"
          	name="validationTestSelectForm"
          	scope="request"
          	validate="true"
          	input="/config/validation/test.do"/>
          	
           <action
  			path="/config/validation/testNew"
          	type="org.vfny.geoserver.action.validation.ValidationTestNewAction"
          	name="validationTestNewForm"
          	scope="request"
          	validate="true"
          	input="/config/validation/testNew.do"/>
          	        	
           <action
          	path="/config/validation/testEditor"
          	type="org.vfny.geoserver.action.validation.ValidationTestEditorAction"
          	name="validationTestEditorForm"
          	scope="request"
          	validate="true"
          	input="/config/validation/testEditor.do"/>
          	
          <action
          	path ="/config/validation/suiteRun"
          	type="org.vfny.geoserver.action.validation.ValidationTestDoIt"
          	name="validationTestDoIt"
          	scope="request"
          	validate="true"
          	input="/config/validation/suite.do"/>
  
          <action	
          	path="/config/validation/suiteStop"
          	type="org.vfny.geoserver.action.validation.ValidationTestDoIt"
          	parameter="stop"
          	name="validationTestDoIt"
          	scope="request"
          	validate="true"
          	input="/config/validation/suite.do"/>
          	
          <action
          	path="/config/data/calculateBoundingBox"
          	type="org.vfny.geoserver.action.data.CalculateBoundingBoxAction"
          	name="blankBean"/>
          <action
          	path="/SLDWizard"
          	type="org.vfny.geoserver.action.data.SLDWizardAction"
          	name="sldWizardForm"
          	input="/WEB-INF/pages/SLDWizard.jsp"
  			scope="request"
  			validate="true">
          	
          	<forward name="SLDWizard" path="/WEB-INF/pages/SLDWizard.jsp"/>
          </action>
          	
          <action
          	path="/admin/saveToGeoServer"
          	type="org.vfny.geoserver.action.UpdateGSAction"
          	name="blankBean"/>
          <action
          	path="/admin/saveToXML"
          	type="org.vfny.geoserver.action.SaveXMLAction"
          	name="blankBean"/>
          <action
          	path="/admin/loadFromXML"
          	type="org.vfny.geoserver.action.LoadXMLAction"
          	name="blankBean"/>        	
          	
          	
          	<!-- srsHelp -->
          	
          <action
  		            path="/srsHelp"
  		            type="org.vfny.geoserver.action.SrsHelpAction"
  		            name="srsInfoForm"
  		            scope="request"
                   >
                   <forward name="success" path="/WEB-INF/pages/srsList.jsp"/>
            </action>
            
            
            <!-- mapPreview -->
            
            <action
  		            path="/mapPreview"
  		            type="org.vfny.geoserver.action.MapPreviewAction"
  		            name="mapPreviewForm"
  		            scope="request"
                   >
                   <forward name="success" path="/WEB-INF/pages/mapPreview.jsp"/>
            </action>
            
  
  
  
  <!-- End Submit Actions -->
  
      </action-mappings>
  
  <!-- ===================================== Controller Configuration -->
  
      <!--  controller
         processorClass="org.apache.struts.tiles.TilesRequestProcessor"/-->
  	<controller>
         <set-property property="processorClass"
         		value="org.springframework.web.struts.DelegatingTilesRequestProcessor"/>
      </controller>
  
  <!-- ================================ Message Resources Definitions -->
  
      <message-resources parameter="ApplicationResources"/>
  
  
  <!-- ======================================= Plug Ins Configuration -->
  
    <!-- ========== Tiles plugin ===================  -->
    <!--												-->
    <!--
       This plugin initialize Tiles definition factory. This later can takes some
  	 parameters explained here after. The plugin first read parameters from web.xml, then
  	 overload them with parameters defined here. All parameters are optional.
  	 The plugin should be declared in each struts-config file.
         - definitions-config: (optional) 
              Specify configuration file names. There can be several comma 
  		    separated file names (default: ?? )
         - moduleAware: (optional - struts1.1) 
              Specify if the Tiles definition factory is module aware. If true (default), 
  			there will be one factory for each Struts module. 
  			If false, there will be one common factory for all module. In this later case, 
  			it is still needed to declare one plugin per module. The factory will be 
  			initialized with parameters found in the first initialized plugin (generally the
  			one associated with the default module).
  			  true : One factory per module. (default)
  			  false : one single shared factory for all modules
  	   - definitions-parser-validate: (optional)
  	        Specify if xml parser should validate the Tiles configuration file.
  			  true : validate. DTD should be specified in file header. (default)
  			  false : no validation
  			  
  	  Paths found in Tiles definitions are relative to the main context.
    -->
    <!-- comment following if struts1.0.x -->
    <plug-in className="org.apache.struts.tiles.TilesPlugin" >
      <set-property property="definitions-config" 
  	                 value="/WEB-INF/tiles-defs.xml" />
      <set-property property="moduleAware" value="true" />
      <set-property property="definitions-parser-validate" value="true" />
    </plug-in>
  
    <!-- end comment if struts1.0.x -->
  
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
      <set-property
          property="pathnames"
          value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>
  
    <!-- plug-in className="org.vfny.geoserver.global.ApplicationState">
    </plug-in>
    
    <plug-in className="org.vfny.geoserver.global.GeoServerPlugIn">
    </plug-in>  
    
    <plug-in className="org.vfny.geoserver.config.ConfigPlugIn">
    </plug-in-->  
    
    <!--  plugin for struts integration -->
    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>
   
  </struts-config>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/struts-html.tld
  
  Index: struts-html.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>html</shortname>
  <uri>http://jakarta.apache.org/struts/tags-html</uri>
  <tag>
  <name>base</name>
  <tagclass>org.apache.struts.taglib.html.BaseTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>server</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>button</name>
  <tagclass>org.apache.struts.taglib.html.ButtonTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>cancel</name>
  <tagclass>org.apache.struts.taglib.html.CancelTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>checkbox</name>
  <tagclass>org.apache.struts.taglib.html.CheckboxTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>errors</name>
  <tagclass>org.apache.struts.taglib.html.ErrorsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>file</name>
  <tagclass>org.apache.struts.taglib.html.FileTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>accept</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>form</name>
  <tagclass>org.apache.struts.taglib.html.FormTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>action</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>enctype</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>focus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>focusIndex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>method</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onreset</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onsubmit</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>frame</name>
  <tagclass>org.apache.struts.taglib.html.FrameTag</tagclass>
  <attribute>
  <name>action</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>frameborder</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>frameName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>longdesc</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>marginheight</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>marginwidth</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>noresize</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scrolling</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>hidden</name>
  <tagclass>org.apache.struts.taglib.html.HiddenTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>write</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>html</name>
  <tagclass>org.apache.struts.taglib.html.HtmlTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>xhtml</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>image</name>
  <tagclass>org.apache.struts.taglib.html.ImageTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>align</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>border</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>pageKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>src</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>srcKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>img</name>
  <tagclass>org.apache.struts.taglib.html.ImgTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>align</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>border</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>height</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>hspace</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>imageName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ismap</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>lowsrc</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>pageKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>src</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>srcKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>usemap</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>vspace</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>width</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>javascript</name>
  <tagclass>org.apache.struts.taglib.html.JavascriptValidatorTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>cdata</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>dynamicJavascript</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>formName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>method</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>src</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>staticJavascript</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>htmlComment</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>link</name>
  <tagclass>org.apache.struts.taglib.html.LinkTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>action</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>linkName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>messages</name>
  <tagclass>org.apache.struts.taglib.html.MessagesTag</tagclass>
  <teiclass>org.apache.struts.taglib.html.MessagesTei</teiclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>footer</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>message</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>multibox</name>
  <tagclass>org.apache.struts.taglib.html.MultiboxTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>option</name>
  <tagclass>org.apache.struts.taglib.html.OptionTag</tagclass>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>key</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>options</name>
  <tagclass>org.apache.struts.taglib.html.OptionsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>filter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>labelName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>labelProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>optionsCollection</name>
  <tagclass>org.apache.struts.taglib.html.OptionsCollectionTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>filter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>label</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>password</name>
  <tagclass>org.apache.struts.taglib.html.PasswordTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>redisplay</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>radio</name>
  <tagclass>org.apache.struts.taglib.html.RadioTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>idName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>reset</name>
  <tagclass>org.apache.struts.taglib.html.ResetTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>rewrite</name>
  <tagclass>org.apache.struts.taglib.html.RewriteTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>select</name>
  <tagclass>org.apache.struts.taglib.html.SelectTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>submit</name>
  <tagclass>org.apache.struts.taglib.html.SubmitTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>text</name>
  <tagclass>org.apache.struts.taglib.html.TextTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>textarea</name>
  <tagclass>org.apache.struts.taglib.html.TextareaTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>cols</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>rows</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>xhtml</name>
  <tagclass>org.apache.struts.taglib.html.XhtmlTag</tagclass>
  <bodycontent>empty</bodycontent>
  </tag>
  </taglib>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/struts-logic.tld
  
  Index: struts-logic.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>logic</shortname>
  <uri>http://jakarta.apache.org/struts/tags-logic</uri>
  <tag>
  <name>empty</name>
  <tagclass>org.apache.struts.taglib.logic.EmptyTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>equal</name>
  <tagclass>org.apache.struts.taglib.logic.EqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>forward</name>
  <tagclass>org.apache.struts.taglib.logic.ForwardTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>greaterEqual</name>
  <tagclass>org.apache.struts.taglib.logic.GreaterEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>greaterThan</name>
  <tagclass>org.apache.struts.taglib.logic.GreaterThanTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>iterate</name>
  <tagclass>org.apache.struts.taglib.logic.IterateTag</tagclass>
  <teiclass>org.apache.struts.taglib.logic.IterateTei</teiclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexId</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>length</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>offset</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>lessEqual</name>
  <tagclass>org.apache.struts.taglib.logic.LessEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>lessThan</name>
  <tagclass>org.apache.struts.taglib.logic.LessThanTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>match</name>
  <tagclass>org.apache.struts.taglib.logic.MatchTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>location</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>messagesNotPresent</name>
  <tagclass>org.apache.struts.taglib.logic.MessagesNotPresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>message</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>messagesPresent</name>
  <tagclass>org.apache.struts.taglib.logic.MessagesPresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>message</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notEmpty</name>
  <tagclass>org.apache.struts.taglib.logic.NotEmptyTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notEqual</name>
  <tagclass>org.apache.struts.taglib.logic.NotEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notMatch</name>
  <tagclass>org.apache.struts.taglib.logic.NotMatchTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>location</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notPresent</name>
  <tagclass>org.apache.struts.taglib.logic.NotPresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>user</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>present</name>
  <tagclass>org.apache.struts.taglib.logic.PresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>user</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>redirect</name>
  <tagclass>org.apache.struts.taglib.logic.RedirectTag</tagclass>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/struts-nested.tld
  
  Index: struts-nested.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>nested</shortname>
  <uri>http://jakarta.apache.org/struts/tags-nested</uri>
  <tag>
  <name>nest</name>
  <tagclass>org.apache.struts.taglib.nested.NestedPropertyTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>writeNesting</name>
  <tagclass>org.apache.struts.taglib.nested.NestedWriteNestingTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>filter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>root</name>
  <tagclass>org.apache.struts.taglib.nested.NestedRootTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>define</name>
  <tagclass>org.apache.struts.taglib.nested.bean.NestedDefineTag</tagclass>
  <teiclass>org.apache.struts.taglib.nested.bean.NestedDefineTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>toScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>message</name>
  <tagclass>org.apache.struts.taglib.nested.bean.NestedMessageTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>arg0</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg1</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg2</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg3</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>arg4</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>key</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>size</name>
  <tagclass>org.apache.struts.taglib.nested.bean.NestedSizeTag</tagclass>
  <teiclass>org.apache.struts.taglib.bean.SizeTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>write</name>
  <tagclass>org.apache.struts.taglib.nested.bean.NestedWriteTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>filter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>format</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>formatKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ignore</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>checkbox</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedCheckboxTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>errors</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedErrorsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>file</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedFileTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>accept</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>form</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedFormTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>action</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>enctype</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>focus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>method</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onreset</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onsubmit</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>hidden</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedHiddenTag</tagclass>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>image</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedImageTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>align</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>border</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>pageKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>src</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>srcKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>img</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedImgTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>align</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>border</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>height</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>hspace</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>imageName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ismap</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>lowsrc</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>pageKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>src</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>srcKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>usemap</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>vspace</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>width</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>link</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedLinkTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>action</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>anchor</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>forward</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>href</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>linkName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>paramScope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>target</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>transaction</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>messages</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedMessagesTag</tagclass>
  <teiclass>org.apache.struts.taglib.html.MessagesTei</teiclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>bundle</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>locale</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>footer</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>message</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>multibox</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedMultiboxTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>options</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedOptionsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>labelName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>labelProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>optionsCollection</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedOptionsCollectionTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>label</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>password</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedPasswordTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>redisplay</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>radio</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedRadioTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>select</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedSelectTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>multiple</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>submit</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedSubmitTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>text</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedTextTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>maxlength</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>size</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>textarea</name>
  <tagclass>org.apache.struts.taglib.nested.html.NestedTextareaTag</tagclass>
  <attribute>
  <name>accesskey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>alt</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>altKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>cols</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>disabled</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexed</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onblur</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onchange</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ondblclick</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onfocus</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeydown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeypress</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onkeyup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousedown</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmousemove</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseout</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseover</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>onmouseup</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>readonly</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>rows</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>style</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>styleId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>tabindex</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>title</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>titleKey</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>empty</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedEmptyTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>equal</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>greaterEqual</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedGreaterEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>greaterThan</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedGreaterThanTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>iterate</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedIterateTag</tagclass>
  <teiclass>org.apache.struts.taglib.nested.logic.NestedIterateTei</teiclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>collection</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>id</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>indexId</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>length</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>offset</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>lessEqual</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedLessEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>lessThan</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedLessThanTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>match</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedMatchTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>location</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>messagesNotPresent</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedMessagesNotPresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>message</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>messagesPresent</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedMessagesPresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>message</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notEmpty</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedNotEmptyTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notEqual</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedNotEqualTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notMatch</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedNotMatchTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>location</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>notPresent</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedNotPresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>user</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>present</name>
  <tagclass>org.apache.struts.taglib.nested.logic.NestedPresentTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>cookie</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>header</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>parameter</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>user</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/struts-template.tld
  
  Index: struts-template.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>template</shortname>
  <uri>http://jakarta.apache.org/struts/tags-template</uri>
  <tag>
  <name>insert</name>
  <tagclass>org.apache.struts.taglib.template.InsertTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>template</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>put</name>
  <tagclass>org.apache.struts.taglib.template.PutTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>content</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>direct</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>get</name>
  <tagclass>org.apache.struts.taglib.template.GetTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>flush</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/struts-tiles.tld
  
  Index: struts-tiles.tld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  <taglib>
  <tlibversion>1.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>tiles</shortname>
  <uri>http://jakarta.apache.org/struts/tags-tiles</uri>
  <tag>
  <name>insert</name>
  <tagclass>org.apache.struts.taglib.tiles.InsertTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>template</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>component</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>definition</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>attribute</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanScope</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>flush</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>ignore</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>controllerUrl</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>controllerClass</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>definition</name>
  <tagclass>org.apache.struts.taglib.tiles.DefinitionTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>id</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>template</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>page</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>extends</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>put</name>
  <tagclass>org.apache.struts.taglib.tiles.PutTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>content</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>direct</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanScope</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>putList</name>
  <tagclass>org.apache.struts.taglib.tiles.PutListTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>add</name>
  <tagclass>org.apache.struts.taglib.tiles.AddTag</tagclass>
  <bodycontent>JSP</bodycontent>
  <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>content</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>direct</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>type</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanName</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanProperty</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>beanScope</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>get</name>
  <tagclass>org.apache.struts.taglib.tiles.GetTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ignore</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>flush</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>getAsString</name>
  <tagclass>org.apache.struts.taglib.tiles.GetAttributeTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ignore</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>role</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>useAttribute</name>
  <tagclass>org.apache.struts.taglib.tiles.UseAttributeTag</tagclass>
  <teiclass>org.apache.struts.taglib.tiles.UseAttributeTei</teiclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>id</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>classname</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>name</name>
  <required>true</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>ignore</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>importAttribute</name>
  <tagclass>org.apache.struts.taglib.tiles.ImportAttributeTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>name</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
  <name>scope</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>ignore</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
  <tag>
  <name>initComponentDefinitions</name>
  <tagclass>org.apache.struts.taglib.tiles.InitDefinitionsTag</tagclass>
  <bodycontent>empty</bodycontent>
  <attribute>
  <name>file</name>
  <required>true</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  <attribute>
  <name>classname</name>
  <required>false</required>
  <rtexprvalue>false</rtexprvalue>
  </attribute>
  </tag>
  </taglib>
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/tiles-defs.xml
  
  Index: tiles-defs.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  
   <!DOCTYPE tiles-definitions PUBLIC
         "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
         "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
  
  <tiles-definitions>
  
     	<definition name=".mainLayout"
     	            page="/WEB-INF/pages/layouts/mainLayout.jsp">
  		<put name="key" value="GeoServer"/>
     		
  		<!-- SIDEBAR -->
     		<put name="status" value="/WEB-INF/pages/status.jsp"/>
     		<put name="messages" value="/WEB-INF/pages/messages.jsp"/>
     		<put name="actionator"	value="/WEB-INF/pages/actionator.jsp"/>
     		<put name="menuator"	value="/WEB-INF/pages/menuator.jsp"/>   		
     		<put name="configActions" value="/WEB-INF/pages/blank.jsp"/>
     		
  		<!-- BODY -->
     		<put name="locator" value="/WEB-INF/pages/locator.jsp"/>
  		<put name="body" value="/WEB-INF/pages/blank.jsp"/>
  
  		<!-- CONTEXT -->
     		<put name="layer" value="application"/>
          <put name="locationForwards" value="welcome"/>
          <put name="actionForwards" value=""/>
          <put name="menuForwards" value=""/>
     	</definition>
  
     	<!-- WELCOME -->
     	<definition name="welcome" extends=".mainLayout">
          <put name="key" value="welcome"/>
     		<put name="body" value="/WEB-INF/pages/Welcome.jsp"/>
     		<put name="layer" value="application"/>
          <put name="locationForwards" value=""/>
          <put name="menuForwards" value="admin:config:welcome.demo"/>
     	</definition>
     	
     	<definition name="welcome.contact" extends=".mainLayout">
          <put name="key" value="welcome.contact"/>
     		<put name="body" value="/WEB-INF/pages/ContactInformation.jsp"/>
     		<put name="layer" value="application"/>
          <put name="locationForwards" value="welcome"/>   		
     	</definition>
     	
     	<definition name="admin.login" extends=".mainLayout">
     		<put name="key" value="admin.login"/>
     		<put name="body" value="/WEB-INF/pages/Login.jsp"/>   		
     		<put name="layer" value="application"/>
          <put name="locationForwards" value="welcome"/>        
     	</definition>
  
     	<definition name="welcome.demo" extends=".mainLayout">
     		<put name="key" value="welcome.demo"/>
     		<put name="body" value="/WEB-INF/pages/Demo.jsp"/>   		
     		<put name="layer" value="application"/>
          <put name="locationForwards" value="welcome"/>        
     	</definition>
     	
     	<definition name="welcome.demoRequest" extends=".mainLayout">
     		<put name="key" value="welcome.demoRequest"/>
     		<put name="body" value="/WEB-INF/pages/demoRequest.jsp"/>   		
     		<put name="layer" value="application"/>
          <put name="locationForwards" value="welcome:welcome.demo"/>        
     	</definition>
     	   	   	
     	<!-- ADMIN -->
     	<definition name="admin.main" extends=".mainLayout">
     		<put name="key" value="admin"/>
     		<put name="body" value="/WEB-INF/pages/Administration.jsp"/>
     		<put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome"/>
          <put name="actionForwards" value="admin.freeLocks:admin.freeMemory"/>
     	</definition>   	
     	   	
     	<!-- CONFIG -->
     	<definition name="config" extends=".mainLayout">
     		<put name="key" value="config"/>
     		<put name="body" value="/WEB-INF/pages/Configuration.jsp"/>
     		<put name="layer" value="configuration"/>
     		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
          <put name="locationForwards" value="welcome"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>        
          <put name="menuForwards"
               value="config.server:config.wfs:config.wms:config.data"/>   		
     	</definition>
  
     	<!-- CONFIG Server -->
     	<definition name="config.server" extends=".mainLayout">
     		<put name="key" value="config.server"/>
     		<put name="body" value="/WEB-INF/pages/GeoServerConfiguration.jsp"/>
     		<put name="layer" value="configuration"/>
     		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
          <put name="locationForwards" value="welcome:config"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="menuForwards"
               value="config.server.login"/>
     	</definition>
     	
          <definition name="config.server.login" extends=".mainLayout">
                  <put name="key" value="config.server.login"/>
                  <put name="body" value="/WEB-INF/pages/loginEditor.jsp"/>
                  <put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome:config:config.server"/>
          </definition>
  
  	<!-- CONFIG VALIDATION -->   	
     	<definition name="config.validation" extends=".mainLayout">
     		<put name="key" value="config.validation"/>
     		<put name="body" value="/WEB-INF/pages/validation/Validation.jsp"/>
     		<put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome:config:config.wfs"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="menuForwards"
               value="config.validation.suite"/>
     	</definition> 
     		
     	<definition name="config.validation.suite" extends=".mainLayout">
     		<put name="key" value="config.validation.suite"/>
     		<put name="body" value="/WEB-INF/pages/validation/SelectTestSuite.jsp"/>
     		<put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome:config:config.validation"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>        
          <put name="actionForwards" value="config.validation.suite.doit"/>
     	</definition>   	
  
     	<definition name="config.validation.test" extends=".mainLayout">
     		<put name="key" value="config.validation.test"/>
     		<put name="body" value="/WEB-INF/pages/validation/SelectTest.jsp"/>
     		<put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome:config:config.wfs:config.validation:config.validation.suite"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>        
     	</definition>     	
  
     	<definition name="config.validation.test.editor" extends=".mainLayout">
     		<put name="key" value="config.validation.test.editor"/>
     		<put name="body" value="/WEB-INF/pages/validation/TestEditor.jsp"/>
     		<put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome:config:config.wfs:config.validation:config.validation.suite:config.validation.test"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="actionForwards" value="config.validation.test.doit"/>
      </definition>
      
     	<definition name="config.validation.displayResults" extends=".mainLayout">
     		<put name="key" value="config.validation.displayResults"/>
     		<put name="body" value="/WEB-INF/pages/validation/displayResults.jsp"/>
     		<put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome:config:config.validation"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>     
     	
     	<!-- CONFIG WFS -->
     	<definition name="config.wfs" extends=".mainLayout">
     		<put name="key" value="config.wfs"/>
  		<put name="body" value="/WEB-INF/pages/wfs/WFSConfigMenu.jsp"/>
  		<put name="status" value="/WEB-INF/pages/wfs/status.jsp"/>
  		<put name="serviceName" value="/WEB-INF/pages/wfs/serviceName.jsp"/>
     		<put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome:config"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="menuForwards"
               value="config.wfs.content:config.wfs.description:config.validation"/>
     	</definition>
  
     	<definition name="config.wfs.description" extends=".mainLayout">
     		<put name="key" value="config.wfs.description"/>
  		<put name="body" value="/WEB-INF/pages/wfs/WFSConfigDescription.jsp"/>
  		<put name="status" value="/WEB-INF/pages/wfs/status.jsp"/>
  		<put name="serviceName" value="/WEB-INF/pages/wfs/serviceName.jsp"/>		
     		<put name="layer" value="configuration"/>   				
          <put name="locationForwards" value="welcome:config:config.wfs"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
     	
     	<definition name="config.wfs.content" extends=".mainLayout">
     		<put name="key" value="config.wfs.content"/>   		
  		<put name="body" value="/WEB-INF/pages/wfs/WFSConfigContent.jsp"/>
  		<put name="status" value="/WEB-INF/pages/wfs/status.jsp"/>
  		<put name="serviceName" value="/WEB-INF/pages/wfs/serviceName.jsp"/>		
     		<put name="layer" value="configuration"/>   				
          <put name="locationForwards" value="welcome:config:config.wfs"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
     	
     	<!-- CONFIG WMS -->
     	<definition name="config.wms" extends=".mainLayout">
     		<put name="key" value="config.wms"/>
  		<put name="body" value="/WEB-INF/pages/wms/WMSConfigMenu.jsp"/>
  		<put name="status" value="/WEB-INF/pages/wms/status.jsp"/>
  		<put name="serviceName" value="/WEB-INF/pages/wms/serviceName.jsp"/>		
     		<put name="layer" value="configuration"/>   				
          <put name="locationForwards" value="welcome:config"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="menuForwards"
               value="config.wms.content:config.wms.description:config.wms.rendering"/>
     	</definition>
  
     	<definition name="config.wms.description" extends=".mainLayout">
     		<put name="key" value="config.wms.description"/>   		
  		<put name="body" value="/WEB-INF/pages/wms/WMSConfigDescription.jsp"/>
  		<put name="status" value="/WEB-INF/pages/wms/status.jsp"/>
  		<put name="serviceName" value="/WEB-INF/pages/wms/serviceName.jsp"/>			
     		<put name="layer" value="configuration"/>
          <put name="locationForwards" value="welcome:config:config.wms"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
     	   	
     	<definition name="config.wms.content" extends=".mainLayout">
     		<put name="key" value="config.wms.content"/>   		
  		<put name="body" value="/WEB-INF/pages/wms/WMSConfigContent.jsp"/>
  		<put name="status" value="/WEB-INF/pages/wms/status.jsp"/>		
  		<put name="serviceName" value="/WEB-INF/pages/wms/serviceName.jsp"/>			
     		<put name="layer" value="configuration"/>   				
          <put name="locationForwards" value="welcome:config:config.wms"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
      
      <definition name="config.wms.rendering" extends=".mainLayout">
     		<put name="key" value="config.wms.rendering"/>   		
  		<put name="body" value="/WEB-INF/pages/wms/WMSConfigRendering.jsp"/>
  		<put name="status" value="/WEB-INF/pages/wms/status.jsp"/>		
  		<put name="serviceName" value="/WEB-INF/pages/wms/serviceName.jsp"/>			
     		<put name="layer" value="configuration"/>   				
          <put name="locationForwards" value="welcome:config:config.wms"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
      <!-- CONFIG DATA -->
     	<definition name="config.data" extends=".mainLayout">
     		<put name="key" value="config.data"/>
  		<put name="body" value="/WEB-INF/pages/data/DataMenu.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>		
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
  <!-- didier, 2004-04-18, logical order :
          <put name="menuForwards"
               value="config.data.store:config.data.namespace:config.data.style:config.data.type"/>
    -->
          <put name="menuForwards"
               value="config.data.namespace:config.data.store:config.data.style:config.data.type"/>
     	</definition>
  
  	<!-- datastores -->
     	<definition name="config.data.store" extends=".mainLayout">
     		<put name="key" value="config.data.store"/>
  		<put name="body" value="/WEB-INF/pages/data/DataConfigDataStoresSelect.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>		
     		<put name="layer" value="data"/>   				
          <put name="locationForwards" value="welcome:config:config.data"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="menuForwards"
               value="config.data.store.new"/>   		
     	</definition>
     	
     	<definition name="config.data.store.new" extends=".mainLayout">
          <put name="key" value="config.data.store.new"/>
     		<put name="body" value="/WEB-INF/pages/data/DataConfigDataStoresNew.jsp"/>
     		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
          <put name="layer" value="data"/>   				   		
          <put name="locationForwards" value="welcome:config:config.data:config.data.store"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>   	
  
     	<definition name="config.data.store.editor" extends=".mainLayout">
          <put name="key" value="config.data.store.editor"/>   	
     		<put name="body" value="/WEB-INF/pages/data/DataConfigDataStoresEditor.jsp"/>
     		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data:config.data.store"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
  
  	<!-- namespace -->   	
     	<definition name="config.data.namespace" extends=".mainLayout">
     		<put name="key" value="config.data.namespace"/>
  		<put name="body" value="/WEB-INF/pages/data/namespaces/Select.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="menuForwards"
               value="config.data.namespace.new"/> 
     	</definition>   	
  
     	<definition name="config.data.namespace.new" extends=".mainLayout">
     		<put name="key" value="config.data.namespace.new"/>
     		<put name="body" value="/WEB-INF/pages/data/namespaces/New.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>		
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data:config.data.namespace"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>   	
     	
     	<definition name="config.data.namespace.editor" extends=".mainLayout">
     		<put name="key" value="config.data.namespace.editor"/>
     		<put name="body" value="/WEB-INF/pages/data/namespaces/Editor.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>		
     		<put name="layer" value="data"/>   						
          <put name="locationForwards" value="welcome:config:config.data:config.data.namespace"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>   	
  
  	<!-- styles -->
     	<definition name="config.data.style" extends=".mainLayout">
     		<put name="key" value="config.data.style"/>
     		<put name="body" value="/WEB-INF/pages/data/styles/Select.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="menuForwards"
               value="config.data.style.new"/>
     	</definition>
     	   	
     	<definition name="config.data.style.new" extends=".mainLayout">
     		<put name="key" value="config.data.style.new"/>
     		<put name="body" value="/WEB-INF/pages/data/styles/New.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data:config.data.style"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
  
     	<definition name="config.data.style.editor" extends=".mainLayout">
     		<put name="key" value="config.data.style.editor"/>
     		<put name="body" value="/WEB-INF/pages/data/styles/Editor.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data:config.data.style"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
  
  	<!-- featuretypes -->   	
     	<definition name="config.data.type" extends=".mainLayout">
     		<put name="key" value="config.data.type"/> 
  		<put name="body" value="/WEB-INF/pages/data/featureTypes/Select.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>	
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
          <put name="menuForwards"
               value="config.data.type.new"/>
     	</definition>   	
     	
  	<definition name="config.data.type.new" extends=".mainLayout">
     		<put name="key" value="config.data.type.new"/> 
  		<put name="body" value="/WEB-INF/pages/data/featureTypes/New.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>	
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data:config.data.type"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
  
  	<definition name="config.data.type.editor" extends=".mainLayout">
     		<put name="key" value="config.data.type.editor"/>
     		<put name="body" value="/WEB-INF/pages/data/featureTypes/Editor.jsp"/>
  		<put name="status" value="/WEB-INF/pages/data/status.jsp"/>
     		<put name="layer" value="data"/>
          <put name="locationForwards" value="welcome:config:config.data:config.data.type"/>
     		<put name="configActions" value="/WEB-INF/pages/configActions.jsp"/>
     	</definition>
     	
     
  </tiles-definitions>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/validation.xml
  
  Index: validation.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  
  <!DOCTYPE form-validation PUBLIC
            "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
            "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
  
  <form-validation>
  
  <!--
       This is a blank Validator form file with a commented examples.
  -->
  
      <!-- An example global constant -->
      <!--global>
  
          <constant>
              <constant-name>postalCode</constant-name>
              <constant-value>^\d{5}\d*$</constant-value>
          </constant>
  
      </global-->
  
  	
      <!-- An example form -->
      <!--formset>
  
          <form name="logonForm">
              <field
                  property="username"
                  depends="required">
                      <arg0 key="logonForm.username"/>
               </field>
           <field
              property="password"
              depends="required,mask">
              <arg0 key="logonForm.password"/>
              <var>
                  <var-name>mask</var-name>
                  <var-value>^[0-9a-zA-Z]*$</var-value>
              </var>
           </field>
          </form>
  
      </formset -->
  
      <!-- An example formset for another locale
      <formset language="fr">
  
          <constant>
              <constant-name>postalCode</constant-name>
              <constant-value>^[0-9a-zA-Z]*$</constant-value>
          </constant>
  
     </formset>
     -->
  
  </form-validation>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/validator-rules.xml
  
  Index: validator-rules.xml
  ===================================================================
  <!DOCTYPE form-validation PUBLIC
            "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
            "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
  <!--
  
     This file contains the default Struts Validator pluggable validator
     definitions.  It should be placed somewhere under /WEB-INF and
     referenced in the struts-config.xml under the plug-in element
     for the ValidatorPlugIn.
  
        <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
          <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
                                                    /WEB-INF/validation.xml"/>
        </plug-in>
  
     These are the default error messages associated with
     each validator defined in this file.  They should be
     added to your projects ApplicationResources.properties
     file or you can associate new ones by modifying the
     pluggable validators msg attributes in this file.
  
     # Struts Validator Error Messages
     errors.required={0} is required.
     errors.minlength={0} can not be less than {1} characters.
     errors.maxlength={0} can not be greater than {1} characters.
     errors.invalid={0} is invalid.
  
     errors.byte={0} must be a byte.
     errors.short={0} must be a short.
     errors.integer={0} must be an integer.
     errors.long={0} must be a long.
     errors.float={0} must be a float.
     errors.double={0} must be a double.
  
     errors.date={0} is not a date.
     errors.range={0} is not in the range {1} through {2}.
     errors.creditcard={0} is an invalid credit card number.
     errors.email={0} is an invalid e-mail address.
  
  -->
  
  <form-validation>
  
     <global>
  
        <validator name="required"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateRequired"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                    msg="errors.required">
  
           <javascript><![CDATA[
              function validateRequired(form) {
                  var isValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oRequired = new required();
                  for (x in oRequired) {
                  	var field = form[oRequired[x][0]];
                  	
                      if (field.type == 'text' ||
                          field.type == 'textarea' ||
                          field.type == 'file' ||
                          field.type == 'select-one' ||
                          field.type == 'radio' ||
                          field.type == 'password') {
                          
                          var value = '';
  						// get field's value
  						if (field.type == "select-one") {
  							var si = field.selectedIndex;
  							if (si >= 0) {
  								value = field.options[si].value;
  							}
  						} else {
  							value = field.value;
  						}
                          
                          if (trim(value).length == 0) {
                          
  	                        if (i == 0) {
  	                            focusField = field;
  	                        }
  	                        fields[i++] = oRequired[x][1];
  	                        isValid = false;
                          }
                      }
                  }
                  if (fields.length > 0) {
                     focusField.focus();
                     alert(fields.join('\n'));
                  }
                  return isValid;
              }
              
              // Trim whitespace from left and right sides of s.
              function trim(s) {
                  return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
              }
              
              ]]>
           </javascript>
  
        </validator>
  
        <validator name="requiredif"
                   classname="org.apache.struts.validator.FieldChecks"
                   method="validateRequiredIf"
                   methodParams="java.lang.Object,
                                 org.apache.commons.validator.ValidatorAction,
                                 org.apache.commons.validator.Field,
                                 org.apache.struts.action.ActionErrors,
                                 org.apache.commons.validator.Validator,
                                 javax.servlet.http.HttpServletRequest"
                   msg="errors.required">
        </validator>
  
        <validator name="minlength"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateMinLength"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.minlength">
  
           <javascript><![CDATA[
              function validateMinLength(form) {
                  var isValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oMinLength = new minlength();
                  for (x in oMinLength) {
                      var field = form[oMinLength[x][0]];
                      
                      if (field.type == 'text' ||
                          field.type == 'textarea') {
                          
                          var iMin = parseInt(oMinLength[x][2]("minlength"));
                          if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
                              if (i == 0) {
                                  focusField = field;
                              }
                              fields[i++] = oMinLength[x][1];
                              isValid = false;
                          }
                      }
                  }
                  if (fields.length > 0) {
                     focusField.focus();
                     alert(fields.join('\n'));
                  }
                  return isValid;
              }]]>
           </javascript>
  
        </validator>
  
  
        <validator name="maxlength"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateMaxLength"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.maxlength">
  
           <javascript><![CDATA[
              function validateMaxLength(form) {
                  var isValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oMaxLength = new maxlength();
                  for (x in oMaxLength) {
                      var field = form[oMaxLength[x][0]];
                      
                      if (field.type == 'text' ||
                          field.type == 'textarea') {
                          
                          var iMax = parseInt(oMaxLength[x][2]("maxlength"));
                          if (field.value.length > iMax) {
                              if (i == 0) {
                                  focusField = field;
                              }
                              fields[i++] = oMaxLength[x][1];
                              isValid = false;
                          }
                      }
                  }
                  if (fields.length > 0) {
                     focusField.focus();
                     alert(fields.join('\n'));
                  }
                  return isValid;
              }]]>
           </javascript>
  
        </validator>
  
  
        <validator name="mask"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateMask"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.invalid">
  
           <javascript><![CDATA[
              function validateMask(form) {
                  var isValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oMasked = new mask();
                  for (x in oMasked) {
                      var field = form[oMasked[x][0]];
                      
                      if ((field.type == 'text' || 
                           field.type == 'textarea') && 
                           (field.value.length > 0)) {
                          
                          if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
                              if (i == 0) {
                                  focusField = field;
                              }
                              fields[i++] = oMasked[x][1];
                              isValid = false;
                          }
                      }
                  }
                  
                  if (fields.length > 0) {
                     focusField.focus();
                     alert(fields.join('\n'));
                  }
                  return isValid;
              }
  
              function matchPattern(value, mask) {
                 return mask.exec(value);
              }]]>
           </javascript>
  
        </validator>
  
  
        <validator name="byte"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateByte"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.byte"
         jsFunctionName="ByteValidations">
  
           <javascript><![CDATA[
              function validateByte(form) {
                  var bValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oByte = new ByteValidations();
                  for (x in oByte) {
                  	var field = form[oByte[x][0]];
                  	
                      if (field.type == 'text' ||
                          field.type == 'textarea' ||
                          field.type == 'select-one' ||
  						field.type == 'radio') {
  
  						var value = '';
  						// get field's value
  						if (field.type == "select-one") {
  							var si = field.selectedIndex;
  							if (si >= 0) {
  								value = field.options[si].value;
  							}
  						} else {
  							value = field.value;
  						}
                          
                          if (value.length > 0) {
                              if (!isAllDigits(value)) {
                                  bValid = false;
                                  if (i == 0) {
                                      focusField = field;
                                  }
                                  fields[i++] = oByte[x][1];
  
                              } else {
  
  	                            var iValue = parseInt(value);
  	                            if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
  	                                if (i == 0) {
  	                                    focusField = field;
  	                                }
  	                                fields[i++] = oByte[x][1];
  	                                bValid = false;
  	                            }
                              }
  						}
  						
                      }
                  }
                  if (fields.length > 0) {
                     focusField.focus();
                     alert(fields.join('\n'));
                  }
                  return bValid;
              }]]>
           </javascript>
  
        </validator>
  
  
        <validator name="short"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateShort"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.short"
         jsFunctionName="ShortValidations">
  
           <javascript><![CDATA[
              function validateShort(form) {
                  var bValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oShort = new ShortValidations();
                  for (x in oShort) {
                  	var field = form[oShort[x][0]];
                  	
                      if (field.type == 'text' ||
                          field.type == 'textarea' ||
                          field.type == 'select-one' ||
                          field.type == 'radio') {
                          
                          var value = '';
  						// get field's value
  						if (field.type == "select-one") {
  							var si = field.selectedIndex;
  							if (si >= 0) {
  								value = field.options[si].value;
  							}
  						} else {
  							value = field.value;
  						}
                          
                          if (value.length > 0) {
                              if (!isAllDigits(value)) {
                                  bValid = false;
                                  if (i == 0) {
                                      focusField = field;
                                  }
                                  fields[i++] = oShort[x][1];
  
                              } else {
                          
  	                            var iValue = parseInt(value);
  	                            if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {
  	                                if (i == 0) {
  	                                    focusField = field;
  	                                }
  	                                fields[i++] = oShort[x][1];
  	                                bValid = false;
  	                            }
  	                       }
                         }
                      }
                  }
                  if (fields.length > 0) {
                     focusField.focus();
                     alert(fields.join('\n'));
                  }
                  return bValid;
              }]]>
           </javascript>
  
        </validator>
  
  
        <validator name="integer"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateInteger"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.integer"
         jsFunctionName="IntegerValidations">
  
           <javascript><![CDATA[
              function validateInteger(form) {
                  var bValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oInteger = new IntegerValidations();
                  for (x in oInteger) {
                  	var field = form[oInteger[x][0]];
  
                      if (field.type == 'text' ||
                          field.type == 'textarea' ||
                          field.type == 'select-one' ||
                          field.type == 'radio') {
                          
                          var value = '';
  						// get field's value
  						if (field.type == "select-one") {
  							var si = field.selectedIndex;
  						    if (si >= 0) {
  							    value = field.options[si].value;
  						    }
  						} else {
  							value = field.value;
  						}
                          
                          if (value.length > 0) {
                          
                              if (!isAllDigits(value)) {
                                  bValid = false;
                                  if (i == 0) {
  	                                focusField = field;
  	                            }
  						        fields[i++] = oInteger[x][1];
  						        
                              } else {
  	                            var iValue = parseInt(value);
  	                            if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
  	                                if (i == 0) {
  	                                    focusField = field;
  	                                }
  	                                fields[i++] = oInteger[x][1];
  	                                bValid = false;
  	                           }
                             }
                         }
                      }
                  }
                  if (fields.length > 0) {
                     focusField.focus();
                     alert(fields.join('\n'));
                  }
                  return bValid;
              }
  
              function isAllDigits(argvalue) {
                  argvalue = argvalue.toString();
                  var validChars = "0123456789";
                  var startFrom = 0;
                  if (argvalue.substring(0, 2) == "0x") {
                     validChars = "0123456789abcdefABCDEF";
                     startFrom = 2;
                  } else if (argvalue.charAt(0) == "0") {
                     validChars = "01234567";
                     startFrom = 1;
                  } else if (argvalue.charAt(0) == "-") {
                      startFrom = 1;
                  }
                  
                  for (var n = startFrom; n < argvalue.length; n++) {
                      if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
                  }
                  return true;
              }]]>
           </javascript>
  
        </validator>
  
  
        <validator name="long"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateLong"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.long"/>
  
  
        <validator name="float"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateFloat"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.float"
         jsFunctionName="FloatValidations">
  
           <javascript><![CDATA[
              function validateFloat(form) {
                  var bValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oFloat = new FloatValidations();
                  for (x in oFloat) {
                  	var field = form[oFloat[x][0]];
                  	
                      if (field.type == 'text' ||
                          field.type == 'textarea' ||
                          field.type == 'select-one' ||
                          field.type == 'radio') {
                          
                      	var value = '';
  						// get field's value
  						if (field.type == "select-one") {
  							var si = field.selectedIndex;
  							if (si >= 0) {
  							    value = field.options[si].value;
  							}
  						} else {
  							value = field.value;
  						}
                          
                          if (value.length > 0) {
                              // remove '.' before checking digits
                              var tempArray = value.split('.');
                              var joinedString= tempArray.join('');
  
                              if (!isAllDigits(joinedString)) {
                                  bValid = false;
                                  if (i == 0) {
                                      focusField = field;
                                  }
                                  fields[i++] = oFloat[x][1];
  
                              } else {
  	                            var iValue = parseFloat(value);
  	                            if (isNaN(iValue)) {
  	                                if (i == 0) {
  	                                    focusField = field;
  	                                }
  	                                fields[i++] = oFloat[x][1];
  	                                bValid = false;
  	                            }
                              }
                          }
                      }
                  }
                  if (fields.length > 0) {
                     focusField.focus();
                     alert(fields.join('\n'));
                  }
                  return bValid;
              }]]>
           </javascript>
  
        </validator>
  
  
        <validator name="double"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateDouble"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.double"/>
  
  
        <validator name="date"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateDate"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.date"
         jsFunctionName="DateValidations">
  
           <javascript><![CDATA[
              function validateDate(form) {
                 var bValid = true;
                 var focusField = null;
                 var i = 0;
                 var fields = new Array();
                 oDate = new DateValidations();
                 for (x in oDate) {
                     var value = form[oDate[x][0]].value;
                     var datePattern = oDate[x][2]("datePatternStrict");
                     if ((form[oDate[x][0]].type == 'text' ||
                          form[oDate[x][0]].type == 'textarea') &&
                         (value.length > 0) &&
                         (datePattern.length > 0)) {
                       var MONTH = "MM";
                       var DAY = "dd";
                       var YEAR = "yyyy";
                       var orderMonth = datePattern.indexOf(MONTH);
                       var orderDay = datePattern.indexOf(DAY);
                       var orderYear = datePattern.indexOf(YEAR);
                       if ((orderDay < orderYear && orderDay > orderMonth)) {
                           var iDelim1 = orderMonth + MONTH.length;
                           var iDelim2 = orderDay + DAY.length;
                           var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                           var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                           if (iDelim1 == orderDay && iDelim2 == orderYear) {
                              dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                           } else if (iDelim1 == orderDay) {
                              dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                           } else if (iDelim2 == orderYear) {
                              dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                           } else {
                              dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                           }
                           var matched = dateRegexp.exec(value);
                           if(matched != null) {
                              if (!isValidDate(matched[2], matched[1], matched[3])) {
                                 if (i == 0) {
                                     focusField = form[oDate[x][0]];
                                 }
                                 fields[i++] = oDate[x][1];
                                 bValid =  false;
                              }
                           } else {
                              if (i == 0) {
                                  focusField = form[oDate[x][0]];
                              }
                              fields[i++] = oDate[x][1];
                              bValid =  false;
                           }
                       } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
                           var iDelim1 = orderDay + DAY.length;
                           var iDelim2 = orderMonth + MONTH.length;
                           var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                           var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                           if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                               dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                           } else if (iDelim1 == orderMonth) {
                               dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                           } else if (iDelim2 == orderYear) {
                               dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                           } else {
                               dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                           }
                           var matched = dateRegexp.exec(value);
                           if(matched != null) {
                               if (!isValidDate(matched[1], matched[2], matched[3])) {
                                   if (i == 0) {
                                       focusField = form[oDate[x][0]];
                                   }
                                   fields[i++] = oDate[x][1];
                                   bValid =  false;
                                }
                           } else {
                               if (i == 0) {
                                   focusField = form[oDate[x][0]];
                               }
                               fields[i++] = oDate[x][1];
                               bValid =  false;
                           }
                       } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
                           var iDelim1 = orderYear + YEAR.length;
                           var iDelim2 = orderMonth + MONTH.length;
                           var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                           var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                           if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                               dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
                           } else if (iDelim1 == orderMonth) {
                               dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
                           } else if (iDelim2 == orderDay) {
                               dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
                           } else {
                               dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
                           }
                           var matched = dateRegexp.exec(value);
                           if(matched != null) {
                               if (!isValidDate(matched[3], matched[2], matched[1])) {
                                   if (i == 0) {
                                       focusField = form[oDate[x][0]];
                                    }
                                    fields[i++] = oDate[x][1];
                                    bValid =  false;
                                }
                            } else {
                                if (i == 0) {
                                    focusField = form[oDate[x][0]];
                                }
                                fields[i++] = oDate[x][1];
                                bValid =  false;
                            }
                       } else {
                           if (i == 0) {
                               focusField = form[oDate[x][0]];
                           }
                           fields[i++] = oDate[x][1];
                           bValid =  false;
                       }
                    }
                 }
                 if (fields.length > 0) {
                    focusField.focus();
                    alert(fields.join('\n'));
                 }
                 return bValid;
              }
  
  	    function isValidDate(day, month, year) {
  	        if (month < 1 || month > 12) {
                      return false;
                  }
                  if (day < 1 || day > 31) {
                      return false;
                  }
                  if ((month == 4 || month == 6 || month == 9 || month == 11) &&
                      (day == 31)) {
                      return false;
                  }
                  if (month == 2) {
                      var leap = (year % 4 == 0 &&
                                 (year % 100 != 0 || year % 400 == 0));
                      if (day>29 || (day == 29 && !leap)) {
                          return false;
                      }
                  }
                  return true;
              }]]>
           </javascript>
  
        </validator>
  
  <!-- range is deprecated use intRange instead -->
        <validator name="range"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateIntRange"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends="integer"
                    msg="errors.range">
  
           <javascript><![CDATA[
              function validateRange(form) {
                  return validateIntRange(form);
              }]]>
           </javascript>
  
        </validator>
  
        <validator name="intRange"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateIntRange"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends="integer"
                    msg="errors.range">
  
           <javascript><![CDATA[
              function validateIntRange(form) {
                  var isValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oRange = new intRange();
                  for (x in oRange) {
                      var field = form[oRange[x][0]];
                      
                      if ((field.type == 'text' ||
                           field.type == 'textarea') &&
                          (field.value.length > 0)) {
                          
                          var iMin = parseInt(oRange[x][2]("min"));
                          var iMax = parseInt(oRange[x][2]("max"));
                          var iValue = parseInt(field.value);
                          if (!(iValue >= iMin && iValue <= iMax)) {
                              if (i == 0) {
                                  focusField = field;
                              }
                              fields[i++] = oRange[x][1];
                              isValid = false;
                          }
                      }
                  }
                  if (fields.length > 0) {
                      focusField.focus();
                      alert(fields.join('\n'));
                  }
                  return isValid;
              }]]>
           </javascript>
  
        </validator>
  
        <validator name="floatRange"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateFloatRange"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends="float"
                    msg="errors.range">
  
           <javascript><![CDATA[
              function validateFloatRange(form) {
                  var isValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oRange = new floatRange();
                  for (x in oRange) {
                      var field = form[oRange[x][0]];
                      
                      if ((field.type == 'text' ||
                           field.type == 'textarea') &&
                          (field.value.length > 0)) {
                          
                          var fMin = parseFloat(oRange[x][2]("min"));
                          var fMax = parseFloat(oRange[x][2]("max"));
                          var fValue = parseFloat(field.value);
                          if (!(fValue >= fMin && fValue <= fMax)) {
                              if (i == 0) {
                                  focusField = field;
                              }
                              fields[i++] = oRange[x][1];
                              isValid = false;
                          }
                      }
                  }
                  if (fields.length > 0) {
                      focusField.focus();
                      alert(fields.join('\n'));
                  }
                  return isValid;
              }]]>
           </javascript>
  
        </validator>
  
        <validator name="creditCard"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateCreditCard"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.creditcard">
  
           <javascript><![CDATA[
              function validateCreditCard(form) {
                  var bValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oCreditCard = new creditCard();
                  for (x in oCreditCard) {
                      if ((form[oCreditCard[x][0]].type == 'text' ||
                           form[oCreditCard[x][0]].type == 'textarea') &&
                          (form[oCreditCard[x][0]].value.length > 0)) {
                          if (!luhnCheck(form[oCreditCard[x][0]].value)) {
                              if (i == 0) {
                                  focusField = form[oCreditCard[x][0]];
                              }
                              fields[i++] = oCreditCard[x][1];
                              bValid = false;
                          }
                      }
                  }
                  if (fields.length > 0) {
                      focusField.focus();
                      alert(fields.join('\n'));
                  }
                  return bValid;
              }
  
              /**
               * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
               */
              function luhnCheck(cardNumber) {
                  if (isLuhnNum(cardNumber)) {
                      var no_digit = cardNumber.length;
                      var oddoeven = no_digit & 1;
                      var sum = 0;
                      for (var count = 0; count < no_digit; count++) {
                          var digit = parseInt(cardNumber.charAt(count));
                          if (!((count & 1) ^ oddoeven)) {
                              digit *= 2;
                              if (digit > 9) digit -= 9;
                          };
                          sum += digit;
                      };
                      if (sum == 0) return false;
                      if (sum % 10 == 0) return true;
                  };
                  return false;
              }
  
              function isLuhnNum(argvalue) {
                  argvalue = argvalue.toString();
                  if (argvalue.length == 0) {
                      return false;
                  }
                  for (var n = 0; n < argvalue.length; n++) {
                      if ((argvalue.substring(n, n+1) < "0") ||
                          (argvalue.substring(n,n+1) > "9")) {
                          return false;
                      }
                  }
                  return true;
              }]]>
           </javascript>
  
        </validator>
  
  
        <validator name="email"
              classname="org.apache.struts.validator.FieldChecks"
                 method="validateEmail"
           methodParams="java.lang.Object,
                         org.apache.commons.validator.ValidatorAction,
                         org.apache.commons.validator.Field,
                         org.apache.struts.action.ActionErrors,
                         javax.servlet.http.HttpServletRequest"
                depends=""
                    msg="errors.email">
  
           <javascript><![CDATA[
              function validateEmail(form) {
                  var bValid = true;
                  var focusField = null;
                  var i = 0;
                  var fields = new Array();
                  oEmail = new email();
                  for (x in oEmail) {
                      if ((form[oEmail[x][0]].type == 'text' ||
                           form[oEmail[x][0]].type == 'textarea') &&
                          (form[oEmail[x][0]].value.length > 0)) {
                          if (!checkEmail(form[oEmail[x][0]].value)) {
                              if (i == 0) {
                                  focusField = form[oEmail[x][0]];
                              }
                              fields[i++] = oEmail[x][1];
                              bValid = false;
                          }
                      }
                  }
                  if (fields.length > 0) {
                      focusField.focus();
                      alert(fields.join('\n'));
                  }
                  return bValid;
              }
  
              /**
               * Reference: Sandeep V. Tamhankar (stamhankar at hotmail.com),
               * http://javascript.internet.com
               */
              function checkEmail(emailStr) {
                 if (emailStr.length == 0) {
                     return true;
                 }
                 var emailPat=/^(.+)@(.+)$/;
                 var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
                 var validChars="\[^\\s" + specialChars + "\]";
                 var quotedUser="(\"[^\"]*\")";
                 var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
                 var atom=validChars + '+';
                 var word="(" + atom + "|" + quotedUser + ")";
                 var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
                 var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
                 var matchArray=emailStr.match(emailPat);
                 if (matchArray == null) {
                     return false;
                 }
                 var user=matchArray[1];
                 var domain=matchArray[2];
                 if (user.match(userPat) == null) {
                     return false;
                 }
                 var IPArray = domain.match(ipDomainPat);
                 if (IPArray != null) {
                     for (var i = 1; i <= 4; i++) {
                        if (IPArray[i] > 255) {
                           return false;
                        }
                     }
                     return true;
                 }
                 var domainArray=domain.match(domainPat);
                 if (domainArray == null) {
                     return false;
                 }
                 var atomPat=new RegExp(atom,"g");
                 var domArr=domain.match(atomPat);
                 var len=domArr.length;
                 if ((domArr[domArr.length-1].length < 2) ||
                     (domArr[domArr.length-1].length > 3)) {
                     return false;
                 }
                 if (len < 2) {
                     return false;
                 }
                 return true;
              }]]>
           </javascript>
  
        </validator>
  
     </global>
  
  </form-validation>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/web.xml
  
  Index: web.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
  <web-app>
    <display-name>GeoServer</display-name>
    <description>Web Mapping and Feature Services</description>
  
    <context-param>
      <param-name>serviceStratagy</param-name>
      <!-- Meaning of the different values :
      	 
      	 PARTIAL-BUFFER
      	 - Partially buffers the first xKb to disk. Once that has buffered, the the 
      	   result is streamed to the user. This will allow for most errors to be caught
      	   early.
      	   
           BUFFER
           - stores the entire response in memory first, before sending it off to
             the user (may run out of memory)
  
           SPEED
           - outputs directly to the response (and cannot recover in the case of an
             error)
  
           FILE
           - outputs to the local filesystem first, before sending it off to the user
        -->
      <param-value>PARTIAL-BUFFER</param-value>
    </context-param>
    
    <context-param>
  	<!-- see comments on the PARTIAL-BUFFER strategy -->
  	<!-- this sets the size of the buffer.  default is "50" = 50kb -->
  
  	<param-name>PARTIAL_BUFFER_STRATEGY_SIZE</param-name>
  	<param-value>50</param-value>
    </context-param>
    
  	<!-- pick up all spring application contexts -->
  	<context-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath*:/applicationContext.xml</param-value>
  	</context-param>
  
     <!--
  	  <context-param>
  		   <param-name>GEOSERVER_DATA_DIR</param-name>
  		    <param-value>C:\eclipse\workspace\geoserver_trunk\cite\confCiteWFSPostGIS</param-value>
  	  </context-param> 
     -->
     
    <filter>
      <filter-name>Set Character Encoding</filter-name>
      <filter-class>org.vfny.geoserver.filters.SetCharacterEncodingFilter</filter-class>
      <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
    </filter>
  
    <filter-mapping>
      <filter-name>Set Character Encoding</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
  
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
  	
    <!-- spring dispatcher servlet, dispatches incoming requests to controllers -->
    <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>	
    </servlet>
  	
     <!-- Struts config needs to load before all the other servlets. -->
     <servlet>
      <servlet-name>action</servlet-name>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/struts-config.xml</param-value>
      </init-param>
      <init-param>
        <param-name>debug</param-name>
        <param-value>2</param-value>
      </init-param>
      <init-param>
        <param-name>detail</param-name>
        <param-value>2</param-value>
      </init-param>
      <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet>
     <servlet-name>TestWfsPost</servlet-name>
     <servlet-class>org.vfny.geoserver.wfs.servlets.TestWfsPost</servlet-class>
    </servlet>
    
  	<!-- JD: we dont declare servlets in the web.xml anymore -->
    <!--servlet>
      <servlet-name>DescribeFeatureType</servlet-name>
      <servlet-class>org.vfny.geoserver.wfs.servlets.Describe</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>Dispatcher</servlet-name>
      <servlet-class>org.vfny.geoserver.servlets.Dispatcher</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>WmsDispatcher</servlet-name>
      <servlet-class>org.vfny.geoserver.wms.servlets.WmsDispatcher</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>WfsDispatcher</servlet-name>
      <servlet-class>org.vfny.geoserver.wfs.servlets.WfsDispatcher</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>FreefsLog</servlet-name>
      <servlet-class>org.vfny.geoserver.servlets.FreefsLog</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
      <servlet-name>GetFeature</servlet-name>
      <servlet-class>org.vfny.geoserver.wfs.servlets.Feature</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>GetFeatureWithLock</servlet-name>
      <servlet-class>org.vfny.geoserver.wfs.servlets.FeatureWithLock</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>GetMap</servlet-name>
      <servlet-class>org.vfny.geoserver.wms.servlets.GetMap</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>KMLReflector</servlet-name>
      <servlet-class>org.vfny.geoserver.wms.servlets.KMLReflector</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>PutStyles</servlet-name>
      <servlet-class>org.vfny.geoserver.sld.servlets.PutStyles</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>LockFeature</servlet-name>
      <servlet-class>org.vfny.geoserver.wfs.servlets.Lock</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>Transaction</servlet-name>
      <servlet-class>org.vfny.geoserver.wfs.servlets.Transaction</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>WFSGetCapabilities</servlet-name>
      <servlet-class>org.vfny.geoserver.wfs.servlets.Capabilities</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>GetFeatureInfo</servlet-name>
      <servlet-class>org.vfny.geoserver.wms.servlets.GetFeatureInfo</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>DescribeLayer</servlet-name>
      <servlet-class>org.vfny.geoserver.wms.servlets.DescribeLayer</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>WMSGetCapabilities</servlet-name>
      <servlet-class>org.vfny.geoserver.wms.servlets.Capabilities</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>GetLegendGraphic</servlet-name>
      <servlet-class>org.vfny.geoserver.wms.servlets.GetLegendGraphic</servlet-class>
    </servlet-->
    
    <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
     </servlet-mapping>
    <servlet-mapping>
    	<servlet-name>dispatcher</servlet-name>
  	<url-pattern>/wms/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    	<servlet-name>dispatcher</servlet-name>
  	<url-pattern>/wfs/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    	<servlet-name>dispatcher</servlet-name>
    	<url-pattern>/ows/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
     <servlet-name>TestWfsPost</servlet-name>
     <url-pattern>/TestWfsPost/*</url-pattern>
    </servlet-mapping>
  	<!-- the new dispatch system gets all of the following -->
    <!--servlet-mapping>
      <servlet-name>Dispatcher</servlet-name>
      <url-pattern>/dispatcher/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>WFSGetCapabilities</servlet-name>
      <url-pattern>/wfs/GetCapabilities/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>GetFeature</servlet-name>
      <url-pattern>/wfs/GetFeature/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>GetFeatureWithLock</servlet-name>
      <url-pattern>/wfs/GetFeatureWithLock/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>LockFeature</servlet-name>
      <url-pattern>/wfs/LockFeature/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>Transaction</servlet-name>
      <url-pattern>/wfs/Transaction/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>WMSGetCapabilities</servlet-name>
      <url-pattern>/wms/GetCapabilities</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>GetMap</servlet-name>
      <url-pattern>/wms/GetMap</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>KMLReflector</servlet-name>
      <url-pattern>/wms/kml_reflect</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>DescribeLayer</servlet-name>
      <url-pattern>/wms/DescribeLayer</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>GetFeatureInfo</servlet-name>
      <url-pattern>/wms/GetFeatureInfo</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>GetLegendGraphic</servlet-name>
      <url-pattern>/wms/GetLegendGraphic</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>PutStyles</servlet-name>
      <url-pattern>/sld</url-pattern>
    </servlet-mapping-->
      
    <mime-mapping>
     <extension>xsl</extension>
     <mime-type>text/xml</mime-type>
    </mime-mapping>
  		      
    <welcome-file-list>
      <welcome-file>/WEB-INF/pages/index.jsp</welcome-file>
    </welcome-file-list>
   
    <error-page>
    	<exception-type>java.lang.Exception</exception-type>
  		<location>/WEB-INF/pages/errors/Exception.jsp</location>
    </error-page>
    <error-page>
    	<exception-type>javax.servlet.ServletException</exception-type>
  		<location>/WEB-INF/pages/errors/Exception.jsp</location>
    </error-page>
    <error-page>
    	<exception-type>org.vfny.geoserver.global.ConfigurationException</exception-type>
  		<location>/WEB-INF/pages/errors/Exception.jsp</location>
    </error-page>
  
    <taglib>
      <taglib-uri>/tags/struts-bean</taglib-uri>
      <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
    </taglib>
  
    <taglib>
      <taglib-uri>/tags/struts-html</taglib-uri>
      <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
    </taglib>
  
    <taglib>
      <taglib-uri>/tags/struts-logic</taglib-uri>
      <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
    </taglib>
  
    <taglib>
      <taglib-uri>/tags/struts-nested</taglib-uri>
      <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
    </taglib>
  
    <taglib>
      <taglib-uri>/tags/struts-tiles</taglib-uri>
      <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
    </taglib>  
    
    <!-- spring taglib -->
    <taglib>
    	<taglib-uri>/tags/spring</taglib-uri>
    	<taglib-location>/WEB-INF/tld/spring.tld</taglib-location>
    </taglib>
  </web-app>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/ApplicationResources.properties
  
  Index: ApplicationResources.properties
  ===================================================================
  # Jody Here I cannot make sense of this file!
  #
  # I have organized the remainder of this file by application subsection,
  # this should probably be done by splitting this file into separate files?
  #
  #       Sections (Similar comments are present in struts-config.xml)
  #       --------
  #        WELCOME
  # ADMINISTRATION
  #  CONFIGURATION
  #           DATA
  #
  # Within each section resources are organizing by page,
  # the page names agree forwards in the struts-config.xml
  #
  # Implementation Notes:
  # - 'key' from tiles-def is the same as page name, when someone explains to
  #   to me how to get at page name we can get rid of 'key'.
  # 
  # resource    value                          Example
  # --------    -----                          -------
  # key.label   display label for page links   Contact
  # key.title   page title & window title      Contact Information
  # key.short   short description              Contact information for webmaster
  # key.words   key words                      (Contact Information) (webmaster)
  #
  # We have a few additional resources grouping in the same section as the pages
  # that use them. These appear to be grouped by use.
  #
  # resource    value                           Example
  # --------    -----                           -------
  # label.*     Label for datum, or field       Prefix
  # help.*      Tooltip for datum, or field     Namespace prefix used for GML
  # message.*   Used for information messages   Spatial information loaded
  # error.*     Used for error messages         Namespace URI malformed: {0}
  # errors.*    As abvoe w/ Exception?
  #
  # If you need aditional resources, please just invent a convention
  # make a note of them above
  #
  # Here are my additional resource entries
  # resource    value                           Example
  # --------    -----                           -------
  # text.*(0-9) Long text passage               text.welcome1=GeoServer is ....
  #
  # This is not the best solution, I have not found a decent example of how to
  # internationalize page content. Apparently this is something JSP land is
  # working on - there are some JCP open on this issue.
  #
  
  # -- standard errors --
  errors.header=<UL>
  errors.prefix=<LI>
  errors.suffix=</LI>
  errors.footer=</UL>
  
  # -- validator --
  errors.invalid={0} is invalid.
  errors.maxlength={0} can not be greater than {1} characters.
  errors.minlength={0} can not be less than {1} characters.
  errors.range={0} is not in the range {1} through {2}.
  errors.required={0} is required.
  errors.byte={0} must be an byte.
  errors.date={0} is not a date.
  errors.double={0} must be an double.
  errors.float={0} must be an float.
  errors.integer={0} must be an integer.
  errors.long={0} must be an long.
  errors.short={0} must be an short.
  errors.creditcard={0} is not a valid credit card number.
  errors.email={0} is an invalid e-mail address.
  
  # -- other --
  errors.cancel=Operation cancelled.
  errors.detail={0}
  errors.general=The process did not complete. Details should follow.
  errors.token=Request could not be completed. Operation is not in sequence.
  
  label.validationConfig=Validation Configuration
  label.wfsConfig=WFS Configuration
  label.wmsConfig=WMS Configuration
  label.dataConfig=Data Configuration
  label.name=Name
  label.title=Title
  label.accessConstraints=Access Constraints
  label.fees=Fees
  label.maintainer=Maintainer
  label.keywords=Keywords
  label.abstract=Abstract
  label.description=Description
  label.contents=Contents
  label.login=Login
  label.logout=Logout
  label.help=Help
  label.actions=Actions
  label.buttons=Configuration
  label.context=Context
  label.toGeoserver=To GeoServer
  label.saveXML=Save XML
  label.loadXML=Load XML
  label.onlineResource=Online Resource
  label.featureTypes=Feature Types
  label.namespace=Namespace
  label.namespaceID=Namespace ID
  label.namespaces=Namespaces
  label.new=New
  label.edit=Edit
  label.delete=Delete
  label.dataStoreID=DataStore ID
  label.enabled=Enabled
  label.srsXmlStyle=srsName as XML
  label.username=Username
  label.server=Server
  label.port=Port
  label.password=Password
  label.password.confirm=Confirm Password
  label.URI=URI
  label.default=Default
  label.prefix=Prefix
  label.filename=Filename
  label.SRS=SRS
  label.latLonBoundingBox=LatLon Bounding Box
  label.connectionParameters=Connection Parameters
  label.dataStoreDescription=DataStore Description
  label.attributeTypes=Attribute Types
  label.attributeTypeName=Attribute Type Name
  label.isNillible=Nillible
  label.isRef=isRef
  label.minOccurs=Min Occurs
  label.maxOccurs=Max Occurs
  label.type=Type
  label.url=URL
  label.messages=Messages
  label.mainMenu=Main Menu
  label.status=Status
  label.configStatus=Configuration Status
  label.configChangedTrue=Changed
  label.configChangedFalse=Unchanged
  label.geoServerStatus=GeoServer Status
  label.geoServerChangedTrue=Changed
  label.geoServerChangedFalse=Unchanged
  label.submit=Submit
  label.reset=Reset
  label.credits=Credits
  label.credits.url=http://docs.codehaus.org/display/GEOS/Contributors
  label.newLoginAndPassword=Enter new login/password
  label.wms.svgRenderer=SVG Rendering
  label.wms.svgSimple=Simple (Fast, but limited styling)
  label.wms.svgBatik=Batik (Slow, but full styling)
  label.wms.svgAntiAlias=Antialias
  label.wms.path=WMS Path
  label.cacheMaxAge=Cache Time
  label.cachingEnabled=Caching Enabled?
  
  help.name_service=This is the name of the service
  help.title_service=This is the title of the service
  help.accessConstraints_service=The constraints of the service
  help.fees_service=Fees required
  help.maintainer_service=Name of the maintaining body
  help.keywords_service=A list of keywords associated with the service.
  help.dataFeatureTypeKeywords_service=Keywords for FeatureTypes
  help.abstract_service=A short abstract about the service
  help.onlineResource_service=Online Reference URL for the web service.
  help.serviceType_service=The type of service
  help.cacheControl_defaultMaxAge=The time (in seconds) to instruct external caches to save generated maps.
  
  help.dataStore_id=A unique datastore identifier.
  help.dataStore_enabled=Checked to enable this datastore
  help.dataStore_nameSpace=A namespace Prefix to associate with this DataStore.
  help.dataStore_description=A short description about this data store.
  help.dataStore_server=The name of the server to connect to.
  help.dataStore_port=The connection port on the server.
  help.dataStore_username=The username to login to the server with.
  help.dataStore_password=The password to login to the server with.
  
  help.namespace.default=Checked if this namespace should be assumed when none is specified
  help.namespace.prefix=The prefix used to identify this namespace in a GML document
  help.namespace.uri=URI of document describing namespace definition
  
  
  help.dataFeatureTypeAbstract_service=A Description for a FeatureType
  
  help.dataFeatureTypeKeywords=BLAH
  help.dataFeatureTypeAbstract=BLAH
  
  help.wms.path=The position into the WMS Capabilities tree structure.
  
  error.name.required=Name Required
  error.title.required=Title Required
  error.fees.required=Fees Required
  error.maintainer.required=Maintainer Required
  error.keywords.required=Keywords Required
  error.abstract.required=Abstract Required
  error.accessConstraints.required=Access Constraints Required
  
  error.dataStoreId.invalid=Data Store ID '(0}' must contain only alphanumeric characters (A-Z, a-z, 0-9)
  error.dataStoreId.required=Data Store ID is required.
  error.dataStoreFactory.invalid=Invalid DataStore Factory (Please choose one from the list)
  error.dataStoreEditor.param.required={0} is a required parameter
  error.dataStoreEditor.param.parse={0} must be a valid {1}: {2}
  error.datastoreEditor.validation=Provided parameters can not be processed
  errors.buttonAction.invalid=Invalid button pressed.
  errors.factory.invalid=Invalid DataStoreID selected.
  error.dataStoreEditor.param.missing=Could not locate {0} for {1}
  error.exception={0}
  error.invalidConnectionParams=Connection Parameters are invalid
  error.cannotProcessConnectionParams=Unable to connect with provided parameters
  error.badCharSet=The Character Set provided is not valid - the name must follow conventions documented in the IANA Charset Registry
  error.cannotRunValidation=Unable to run validation: {0}
  error.password.mismatch=Password must match the Confirm Password field, try again.
  error.prefix.invalid=Namespace prefix '(0}' must contain only alphanumeric characters (A-Z, a-z, 0-9)
  error.prefix.required=Namespace prefix is required.
  error.uri.malformed=Namespace URI malformed: {0}
  error.uri.required=Namespace URI is required
  
  error.style.required=Selected style required
  error.style.invalid=Selected style not defined
  
  error.noWritePermission=No write permissions to: {0}
  error.couldNotCreateFile=Could not create file: {0}. Possible case: {1}
  
  welcome.heading=Welcome
  
  geoserver.logo=GeoServer
  
  label.defaultTitle=GeoServer
  label.featureTypeName=Feature Type Name
  label.moveUp=Move Down
  label.moveDown=Move Up
  label.attributeTypeName=Attribute-Type Name
  label.testSuite=Test Suite
  label.testName=Test Name
  label.testDescription=Test Description
  label.newName=New Name
  label.currentTestSuite=Currently working in test suite
  label.plugInType=PlugIn Type
  label.plugInDescription=PlugIn Description
  label.maxFeatures=Maximum Features
  label.verbose=Verbose
  label.verboseExceptions=VerboseExceptions
  label.numDecimals=Number of Decimals
  label.charset=Character Set
  label.baseURL=Base URL
  label.schemaBaseURL=Schema-Base URL
  label.loggingLevel=Logging Level
  label.loggingToFile=Write Logs to File
  label.logLocation=Log Location
  label.contactInformation=Contact Information
  label.contactPerson=Contact Person
  label.contactOrganization=Organization
  label.contactPosition=Position
  label.addressType=Address Type
  label.address=Address
  label.addressCity=City
  label.addressState=State/Province
  label.addressPostalCode=Postal Code
  label.addressCountry=Country
  label.contactVoice=Phone Number
  label.contactFacsimile=Fax Number
  label.contactEmail=Email Address
  label.wfs=Web Feature Server
  label.wms=Web Map Server
  label.data=Data
  label.wfsStatus=WFS Status
  label.wmsStatus=WMS Status
  label.dataStatus=Data Status
  label.apply=Apply
  label.save=Save
  label.load=Load
  label.actions=Actions
  label.calculateBoundingBox=Calculate Bounding Box
  label.wfsDescription=WFS Description
  label.wfsContent=WFS Content
  label.wmsDescription=WMS Description
  label.wmsContent=WMS Content
  label.wmsRendering=WMS Rendering
  label.dataStores=Data Stores
  label.featureTypes=Feature Types
  label.createNewDataStore=Create a new Data Store
  label.createNewNamespace=Create a new Namespace
  label.serviceLevel=Service Level
  label.serviceLevel.basic=Basic
  label.serviceLevel.transactional=Transactional
  label.serviceLevel.complete=Complete 
  label.server=Server
  label.validation=Validation
  label.contact=Contact
  label.none=None
  label.phoneNumber=Phone Number
  label.faxNumber=Fax Number
  label.email=E-mail
  label.info=info
  label.cacheControl_defaultMaxAge=CacheControl-header max-age
  
  help.enabled=Enables/disables the service
  help.srsXmlStyle=Check if the srsName in the returned GML should be xml style (as in spec), uncheck if just EPSG: should be returned.
  help.featureList=Allows enabling/disabling of individual feature types within the service.
  help.global.maxFeatures=Sets the max number of Features returned by GetFeature.
  help.global.verbose=Sets whether newlines and indents should be returned in XML responses.
  help.global.verboseExceptions=Sets whether the Service Exceptions returned to users should have full java stack traces
  help.global.numDecimals=Number of decimal places returned in a GetFeature response.
  help.global.charset=Sets the global character set.
  help.global.baseURL=The base URL where this servlet will run.
  help.global.schemaBaseURL=Define a base url for the location of the WFS schemas.
  help.global.loggingLevel=Defines the Application logging level.
  help.global.loggingToFile=Enable/Disable logging to file.
  help.global.logLocation=Specify log location. May be a directory or a file. The above must be checked for this value to take effect. 
  
  help.global.contactPerson=The name of the contact person;
  help.global.contactOrganization=The name of the organization with which the contact is affiliated.
  help.global.contactPosition=The position of the contact within their organization.
  help.global.addressType=The type of address specified, such as postal.
  help.global.address=The actual street address.
  help.global.addressCity=The city of the address.
  help.global.addressState=The state/prov. of the address.
  help.global.addressPostalCode=The postal code for the address.
  help.global.addressCountry=The country of the address.
  help.global.contactVoice=The contact phone number.
  help.global.contactFacsimile=The contact Fax number.
  help.global.contactEmail=The contact email address.
  
  help.serviceLevel=Defines the level of service that the WFS provides
  
  help.wms.svgRenderer=Select the SVG renderer to use when servicing WMS SVG requests
  
  tab.description=Description
  tab.content=Content
  tab.dataStores=DataStores
  tab.namespaces=Namespaces
  tab.styles=Styles
  tab.featureTypes=Feature Types
  
  error.login.invalidCombo=Invalid username/password combination.
  error.login.required=You must be logged in to access this feature.
  
  error.latLonBoundingBox.required=All elements on the LatLonBoundingBox are required.
  error.latLonBoundingBox.invalid=Invalid LatLonBoundingBox: {0}
  error.serviceLevel.invalid=Invalid service level selected
  
  link.geoserver=http://geoserver.sourceforge.net/
  link.license=http://geoserver.sourceforge.net/documentation/developer/license.htm
  
  # --- changed ----
  label.geoServerConfiguration=GeoServer Configuration
  message.login.hint=(The default user is 'admin' with password is 'geoserver')
  message.noContact=No contact information has been provided
  message.notLoaded=Application resources not loaded -- check servlet container logs for error messages.
  message.noTitle=Metacat Spatial - GeoServer
  message.dataOkay=Data loaded without incident
  
  
  # WELCOME
  welcome.label=Welcome
  welcome.title=Welcome to GeoServer
  welcome.short=Welcome to GeoServer 1.4.0.  Thanks for using GeoServer!
  welcome.words=(GeoServer) (GIS) (Geographic Information Systems) (WFS)
  
  welcome.contact.label=Contact
  welcome.contact.title=Contact Information
  welcome.contact.short=Contact information for site webmaster
  welcome.contact.words=(WebMaster) (Contact Information) 
  
  welcome.demo.label=Demo
  welcome.demo.title=Demo
  welcome.demo.short=Here is the demo page for Geoserver. Look here for examples on how to use Geoserver on its own and with other tools.
  welcome.demo.words=(GeoServer) (Demo)
  welcome.demo.wmsexample.title=WMS Example
  welcome.demo.wmsexample.label=WMS view of New York
  welcome.demo.wmsexample.short=This is a WMS view of Manhattan, New York. It allows you to pan, zoom, and even click on images to pop up a larger view. It is written in Javascript and the code can be found under: [geoserver]/data/demo/popup_map
  welcome.demo.mappreview.title=Map Preview
  welcome.demo.mappreview.label=WMS previews of your enabled FeatureTypes
  welcome.demo.mappreview.short=The Map Preview page will display each FeatureType that is enabled and gives you a link to each one allowing you to view it in WMS form with MapBuilder.
  welcome.demo.requests.title=Sample Requests
  welcome.demo.requests.label=Example WMS and WFS requests
  welcome.demo.requests.short=This page has example WMS and WFS requests that you can use, examine, and change. It is very useful for seeing how to talk with Geoserver and how you can make your own, custom, requests.
  welcome.demo.documentation.title=Documentation
  welcome.demo.documentation.label=Main documentation page
  welcome.demo.documentation.short=Here is the main documentation page for Geoserver. It is a WIKI so feel free to add any documentation, walkthroughs, tutorials, or information that you think will benefit other users.
  welcome.demo.wfst.title=WFS-T demo
  welcome.demo.wfst.label=Example WFS-T (transactional) page
  welcome.demo.wfst.short=This page, powered by MapBuilder, is an example of WFS-T (transactional) requests that you can use. It allows you to insert points and lines into the various layers of the map.
  
  welcome.demoRequest.label=Demo Request
  welcome.demoRequest.title=Demo Request
  welcome.demoRequest.short=Example requests for GeoServer (using the TestServlet).  Select a request from the drop down list, and then hit 'Change'.  This will display the request url (and body if an xml request).  Hit submit to send the request to GeoServer.
  welcome.demoRequest.words=(GeoServer) (Demo)
  
  # WELCOME resources
  # MPTODO: configure the geoserver welcome text so metacat users will have an easier time
  text.welcome1=The GeoServer project is a full transactional Java (J2EE) implementation of the OpenGIS Consortium's Web Feature Server specification, with an integrated Web Map Server.
  text.welcome2=GeoServer is free software, available under the GPL 2.0 license.
  text.welcome3=Users who would like to access and modify their geographic data over the Internet using flexible, industry-approved standards should take a look at GeoServer.
  text.welcome4=The text describing your WFS and WMS may be edited using the Config link above. You must login (link top right) to change the GeoServer configuration (including contact information), or administer the running GeoServer application.
  text.welcome5=The documentation for this release is available online at the following link.  The GeoServer wiki is used for the latest updates; please share your experiences, hints and tips with GeoServer there.  The task tracker is the place to report feature requests and bugs.  Also please take a moment to add yourself to the User Map to show your support for GeoServer.
  
  text.welcome.mapbuilder=Mapbuilder Demo
  text.welcome.mapbuilder.detail= <a href='http://mapbuilder.sourceforge.net/'>Mapbuilder</a> is a java-script WFS-T client.  You can use Mapbuilder to edit the data in this Geoserver install.
  
  # NEW features
  text.visitDemoPage=Visit the <b><a href="../../../demo.do">demo</a></b> page for examples of GeoServer in action. This includes an integrated <b><a href="../../../mapPreview.do"/>Mapbuilder client</a></b>.
  text.newFeatureLogo=<b><font color='red'>NEW!</font></b>
  text.newFeature1=See WMS layers in new MapBuilder GUI.
  text.newFeature2=Check out the Demos page for some neat WMS and WFS demos.
  
  # ADMIN
  admin.label=Admin
  admin.title=GeoServer Administration
  admin.short=Administration of running GeoServer application
  admin.words=(Administration)
  
  admin.login.label=Login
  admin.login.title=Login
  admin.login.short=Login to GeoServer (user: admin and password: geoserver is the default, you can change it from Config->Server->Password).
  admin.login.words=(GeoServer) (Login)
  
  admin.freeLocks.label=Free Locks
  admin.freeLocks.title=Free All Feature Locks
  admin.freeLocks.short=Free All Feature Locks currently held by the server
  admin.freeLocks.words=(FeatureLock) (Free) (Admin)
  
  admin.freeMemory.label=Free Memory
  admin.freeMemory.title=Free Available Memory
  admin.freeMemory.short=Free Available memory by runing the garbage collector
  admin.freeMemory.words=(Memory) (Free) (Admin)
  
  # resources for Admin
  label.locks=Locks
  label.connections=Connections
  label.memory=Memory
  help.locks=Number of Feature Locks
  help.connections=Number of Data Connections
  help.memory=Amount of available memory
  text.admin=This Administration page is currently at the idea stage, it is intended to show the runtime status (and allow interaction with) the running GeoSever application.
  message.freeLocks=Locks released ({0} were held)
  message.memory=Memory released ({0}K released)
  
  # CONFIG
  config.label=Config
  config.title=GeoServer Configuration
  config.short=Configuration of GeoServer application
  config.words=(Configure)
  
  # CONFIG Server
  config.server.label=Server
  config.server.title=Server Configuration
  config.server.short=Configuration of Server and Contact information
  config.server.words=(Configure) (Contact) (Server)
  
  # CONFIG Server Login
  config.server.login.label=Password
  config.server.login.title=Change Password
  config.server.login.short=Page for editing the username/password
  config.server.login.words=(GeoServer) (Login) (Admin)
  
  # CONFIG validation
  config.validation.label=Validation
  config.validation.title=Validation Configuration
  config.validation.short=Configuration of the GeoServer Validation Processor
  config.validation.words=(Configuration) (Validation)
  
  config.validation.suite.label=Test Suite
  config.validation.suite.title=Validation Test Suite Configuration
  config.validation.suite.short=Configuraiton of Test Suites for the Validaiton Processor
  config.validation.suite.words=(Validation Processor) (Test Suites)
  
  config.validation.suite.doit.label=Try Tests
  config.validation.suite.doit.title=Try Test Suite
  config.validation.suite.doit.short=Try running test suite
  config.validation.suite.doit.words=(Validation Processor) (Test Suites)
  
  config.validation.test.label=Tests
  config.validation.test.title=Validation Test Configuration
  config.validation.test.short=Configuration of validation tests
  config.validation.test.words=(Validation Processor) (Validation) (Test)
  
  config.validation.suite.editor.label=Editor
  config.validation.suite.editor.title=Validation Test Suite Editor
  config.validation.suite.editor.short=Editor for validation test suites
  config.validation.suite.editor.words=(Validation Processor) (Validation) (TestSuite)
  
  config.validation.test.editor.label=Editor
  config.validation.test.editor.title=Validation Test Editor
  config.validation.test.editor.short=Editor for validation tests
  config.validation.test.editor.words=(Validation Processor) (Validation) (Test)
  
  config.validation.test.doit.label=Try Test
  config.validation.test.doit.title=Try Validation Test 
  config.validation.test.doit.short=Try running validation test
  config.validation.test.doit.words=(Validation Processor) (Test)
  
  config.validation.displayResults.label=Display Results
  config.validation.displayResults.title=Results of the test run
  config.validation.displayResults.short=Displays results of the test run
  config.validation.displayResults.words=(Validation Processor) (Validation) (TestSuite) (Results)
  config.validation.displayResults.errors=Errors
  config.validation.displayResults.runCompleted=Run Completed
  config.validation.displayResults.runNotCompleted=Run Not Completed
  config.validation.displayResults.stop=Stop
  
  # CONFIG wfs
  config.wfs.label=WFS
  config.wfs.title=Web Feature Server Configuration
  config.wfs.short=Configuration of Web Feature Server
  config.wfs.words=(WFS) (Web Feature Server) (Configure)
  
  config.wfs.content.label=Contents
  config.wfs.content.title=Web Feature Server Contents
  config.wfs.content.short=Configuration of Web Feature Server functionality
  config.wfs.content.words=(WFS) (Web Feature Server) (Configure)
  
  config.wfs.description.label=Description
  config.wfs.description.title=Web Feature Server Description
  config.wfs.description.short=Configuration of Web Feature Server information and metadata
  config.wfs.description.words=(WFS) (Web Feature Server) (Configure)
  
  error.wfs.onlineResource.required=Online Resource is required.
  error.wfs.onlineResource.malformed=Online Resource is malformed: {0}
  
  # CONFIG wms
  config.wms.label=WMS
  config.wms.title=Web Map Server Configuration
  config.wms.short=Configuration of Web Map Server
  config.wms.words=(WMS) (Web Map Server) (Configure)
  
  config.wms.content.label=Contents
  config.wms.content.title=Web Map Server Contents
  config.wms.content.short=Configuration of Web Map Server functionality
  config.wms.content.words=(WMS) (Web Map Server) (Configure)
  
  config.wms.description.label=Description
  config.wms.description.title=Web Map Server Description
  config.wms.description.short=Configuration of Web Map Server information and metadata
  config.wms.description.words=(WMS) (Web Map Server) (Configuration)
  
  config.wms.rendering.label=Rendering
  config.wms.rendering.title=Web Map Server Rendering
  config.wms.rendering.short=Configuration of Web Map Server Rendering
  config.wms.rendering.words=(WMS) (Web Map Server) (Rendering)
  
  error.wms.onlineResource.required=Online Resource is required.
  error.wms.onlineResource.malformed=Online Resource is malformed: {0}
  
  # DATA
  config.data.label=Data
  config.data.title=GeoServer Data Configuration
  config.data.short=Configure GeoServer Application config.data access and representation
  config.data.words=(Configure) (Data) (Spatial Data)
  
  # DATA - config.dataStores
  config.data.store.label=Stores
  config.data.store.title=DataStore Configuration
  config.data.store.short=Select data store for configuration
  config.data.store.words=(Configure) (Database) (Shapefile) (Spatial Data) (Data)
  
  config.data.store.new.label=New
  config.data.store.new.title=Create New DataStore
  config.data.store.new.short=Create source of spatial information
  config.data.store.new.words=(Configure) (Database) (Shapefile) (Spatial Data) (Data)
  
  config.data.store.editor.label=Edit
  config.data.store.editor.title=DataStore Editor
  config.data.store.editor.short=Edit a source of spatial information
  config.data.store.editor.words=(Configure) (Database) (Shapefile) (Spatial Data) (Data)
  config.data.store.editor.requiredField=required field
  
  # DATA namespace
  config.data.namespace.label=Namespace
  config.data.namespace.title=Namespace Configuration
  config.data.namespace.short=Configure GML Namespace used for generated GML
  config.data.namespace.words=(GML) (Namespace) (prefix)
  
  config.data.namespace.new.label=New
  config.data.namespace.new.title=Create New Namespace
  config.data.namespace.new.short=Create a new namespace for GML content
  config.data.namespace.new.words=(GML) (Namespace) (prefix)
  
  config.data.namespace.editor.label=Edit
  config.data.namespace.editor.title=Namespace Editor
  config.data.namespace.editor.short=Edit prefix and uri for GML namespace
  config.data.namespace.editor.words=(GML) (Namespace) (prefix)
  
  text.namespace=Select a namespace from the list, an astrix is used to indicate the Default namespace.
  # DATA styles
  # -----------
  config.data.style.label=Style
  config.data.style.title=Styles Configuration
  config.data.style.short=Define available styles
  config.data.style.words=(WMS) (Web Map Server) (Style)
  config.data.sldWizard.label=Create new SLD
  
  config.data.style.new.label=New
  config.data.style.new.title=New Style
  config.data.style.new.short=Create New Style
  config.data.style.new.words=(WMS) (Web Map Server) (Style)
  
  config.data.style.editor.label=Edit
  config.data.style.editor.title=Style Editor
  config.data.style.editor.short=Edit selected styles
  config.data.style.editor.words=(WMS) (Web Map Server) (Style)
  
  # Resources for styles
  label.styles=Styles
  label.styleID=StyleID
  help.styles=List of available Styles
  help.styleID=Identifier used for Style
  error.style.exists=StyleID {0} already exists
  error.file.required=Filename is required
  # didier, 2004-04-20, not anymore used :
  error.file.nonexistent=File {0} does not exist
  # didier, 2004-04-20, FormFile :
  error.file.maxLengthExceeded=Maximum upload length of SLD document exceeded ({0} bytes allowed)
  error.action.invalid=Action '{0}' was not understood
  error.styleID.required=StyleID is required
  error.styleID.invalid=StyleID must begin with an alpha-numeric character.
  error.style.sldFileExists=There is already a style by the name of {0} stored on GeoServer.  Please rename the file and try again.
  
  
  error.namespace.namespaceInUse=The namespace you are trying to delete is in use by a Datastore.  Please delete the Datastore(s) first.
  error.namespace.namespaceInUse=L'espace de nommage que vous tentez de détruire est en cours d'utilisation par un de vos entrepôts.  Commencer par détruire ces entrepôts en premier lieu.
  
  
  # DATA featureType
  # -----------
  config.data.type.label=FeatureType
  config.data.type.title=FeatureType Configuration
  config.data.type.short=Define FeatureTypes made available through this service
  config.data.type.words=(FeatureType) (Spatial Information)
  
  config.data.type.new.label=New
  config.data.type.new.title=Create New FeatureType
  config.data.type.new.short=Create a new FeatureType from an available DataStore
  config.data.type.new.words=(FeatureType) (Spatial Information)
  
  config.data.type.editor.label=Edit
  config.data.type.editor.title=FeatureType Editor
  config.data.type.editor.short=Edit Feature Type definition and schema
  config.data.type.editor.words=(FeatureType) (Spatial Information)
  
  config.data.calculateBoundingBox.label=Generate
  config.data.calculateBoundingBox.title=Calculate Bounding Box
  config.data.calculateBoundingBox.short=Calculates the Bounding Box for a Feature Type definition
  config.data.calculateBoundingBox.words=(FeatureType) (Spatial Information) (Bounding Box)
  
  error.data.nullBBOX=The FeatureType '{0}' has a NULL extent. <br> HINT: the dataset is empty or has no default geometry attribute.
  error.data.couldNotFindSRSAuthority=Could not find an SRS Authority that understands your SRS.  Please verify that your SRS is correct - you might need to consult the SRS authority plug ins to ensure that your SRS is listed. <br> {0} <br> {1} 
  error.data.factoryException=Could not construct a SRS transformation - {0}
  error.data.transformException=Could not perform the coordinate transformation
  error.style.noParse=Could not parse the style - {0}
  
  
  label.SRSHelp=SRS Help
  
  #might want the other langages to point to a different url!
  label.SRSHelp.URL=http://docs.codehaus.org/display/GEOS/crshelp
  
  label.SRSList=SRS List
  
  
  label.type.dataminx=Data min X
  label.type.dataminy=Data min Y
  label.type.datamaxx=Data max X
  label.type.datamaxy=Data max Y
  
  help.type.dataminx=Min value of X the coordinate in the SRS of your Datastore
  help.type.dataminy=Min value of Y the coordinate in the SRS of your Datastore
  help.type.datamaxx=Max value of X the coordinate in the SRS of your Datastore
  help.type.datamaxy=Max value of Y the coordinate in the SRS of your Datastore
  
  error.badsrc=Could not find a definition for your SRS - {0}
  
  label.type.srswkt=SRS WKT
  help.type.srswkt=The OGC Well Known Text Definition of your SRS's EPSG number
  
  # Resources for FeatureType
  label.bbox=Bounding Box
  label.type.minx=Min Long
  label.type.miny=Min Lat
  label.type.maxx=Max Long
  label.type.maxy=Max Lat
  label.base=Schema Base
  label.schemaName=Schema Name
  label.style=Style
  label.change=Change
  label.add=Add
  label.nillable=nillable
  label.min=min
  label.max=max
  help.type.name=Name of FeatureType
  help.type.style=Default style used to render feature type
  help.type.srs=Spatial Reference System for FeatureType
  help.type.title=Title for end users of this FeatureType
  help.type.bbox=Bounding Box for entire Feature Type
  help.type.minx=Minimum Lat value for Feature Type
  help.type.miny=Minimum Long value for Feature Type
  help.type.maxx=Maximum Lat value for Feature Type
  help.type.maxy=Maximum Long value for Feature Type
  help.type.base=Base XMLSchema element (define manditory attributes or -- to generate)
  help.type.schemaName=Name of XMLSchema element describing Type
  help.type.cachingEnabled=Instruct other servers to cache maps generated from this featuretype?
  help.type.cacheMaxAge=Time (in seconds) other servers should cache maps generated from this featuretype.
  error.styleId.notFound=Style Id '{0}' not defined
  
  type.title.up=Move this type up one level.
  type.title.down=Move this type down one level.
  type.title.delete=Delete this type.
  label.jai=JAI is available
  
  help.jai=JAI (Java Advanced Imaging) extention is used to support image rendering for the WMS
  
  label.jvm=Version of JVM
  
  help.jvm=Denotes which version of the JVM is been used to power the server
  
  
  srsList.title=List of Spatial Referencing System Numbers
  srsList.tableTitle=EPSG WKT Definition
  
  mapPreview.title=Mini-map preview of the enabled FeatureTypes.
  
  sldValididity.title=Your .SLD file does not conform to the SLD Schema
  sldValiditity.help.text=More help is available here
  sldValiditity.help.url=http://docs.codehaus.org/display/GEOS/SLD+Validation
  
  help.citeConformanceHacks=Check if you want strict CITE test conformance.  Unless you are running CITE tests, you probably do not want to check this.
  label.citeConformanceHacks=Strict CITE Test Conformance 
  
  help.featureBounding=Check if you want the bounds for the default geometry of your feature to be automatically included in the GetFeature gml output.  Not recommended, as most clients don't need it and takes up extra bandwidth.
  label.featureBounding=Generate feature bounds
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/ApplicationResources_es.properties
  
  Index: ApplicationResources_es.properties
  ===================================================================
  
  
  # I have organized the remainder of this file by application subsection,
  # this should probably be done by splitting this file into separate files?
  #
  #       Sections (Similar comments are present in struts-config.xml)
  #       --------
  #        WELCOME
  # ADMINISTRATION
  #  CONFIGURATION
  #           DATA
  #
  # Within each section resources are organizing by page,
  # the page names agree forwards in the struts-config.xml
  #
  # Implementation Notes:
  # - 'key' from tiles-def is the same as page name, when someone explains to
  #   to me how to get at page name we can get rid of 'key'.
  # 
  # resource    value                          Example
  # --------    -----                          -------
  # key.label   display label for page links   Contact
  # key.title   page title & window title      Contact Information
  # key.short   short description              Contact information for webmaster
  # key.words   key words                      (Contact Information) (webmaster)
  #
  # We have a few additional resources grouping in the same section as the pages
  # that use them. These appear to be grouped by use.
  #
  # resource    value                           Example
  # --------    -----                           -------
  # label.*     Label for datum, or field       Prefix
  # help.*      Tooltip for datum, or field     Namespace prefix used for GML
  # message.*   Used for information messages   Spatial information loaded
  # error.*     Used for error messages         Namespace URI malformed: {0}
  # errors.*    As abvoe w/ Exception?
  #
  # If you need aditional resources, please just invent a convention
  # make a note of them above
  #
  # Here are my additional resource entries
  # resource    value                           Example
  # --------    -----                           -------
  # text.*(0-9) Long text passage               text.welcome1=GeoServer is ....
  #
  # This is not the best solution, I have not found a decent example of how to
  # internationalize page content. Apparently this is something JSP land is
  # working on - there are some JCP open on this issue.
  #
  
  # -- standard errors --
  errors.header=<UL>
  errors.prefix=<LI>
  errors.suffix=</LI>
  errors.footer=</UL>
  
  # -- validator --
  errors.invalid={0} no es v&aacute;lido.
  errors.maxlength={0} no puede tener m&aacute;s de {1} caracteres.
  errors.minlength={0} no puede tener menos de {1} caracteres.
  errors.range={0} no est&aacute; entre {1} y {2}.
  errors.required={0} es obligatorio.
  errors.byte={0} debe ser un byte.
  errors.date={0} no es una fecha.
  errors.double={0} debe ser un double.
  errors.float={0} debe ser un n&uacute;mero de punto flotante.
  errors.integer={0} debe ser un n&uacute;mero entero.
  errors.long={0} debe ser un n&uacute;mero long.
  errors.short={0} debe ser un n&uacute;mero short.
  errors.creditcard={0} no es un n&uacute;mero de tarjeta de cr&eacute;dito v&aacute;lido.
  errors.email={0} no es una direcci&oacute;n de correo electr&oacute;nico v&aacutelida.
  
  # -- other --
  errors.cancel=Operaci&oacute;n cancelada.
  errors.detail={0}
  errors.general=El proceso no se ha completado. A continuaci&oacute;n puede ver los detalles.
  errors.token=La petici&oacute;n no ha podido ser completada. La operaci&oacute;n no es una secuencia.
  
  label.validationConfig=Configuraci&oacute;n de Validaci&oacute;n
  label.wfsConfig=Configuraci&oacute;n del WFS
  label.wmsConfig=Configuraci&oacute;n del WMS
  label.dataConfig=Configuraci&oacute;n de los Datos
  label.name=Nombre
  label.title=T&iacute;tulo
  label.accessConstraints=Restricciones de Acceso
  label.fees=Tasas
  label.maintainer=Mantenedor
  label.keywords=Palabras Clave
  label.abstract=Extracto
  label.description=Descripci&oacute;n
  label.contents=Contenidos
  label.login=Iniciar Sesi&oacute;n
  label.logout=Cerrar Sesi&oacute;n
  label.help=Ayuda
  label.actions=Acciones
  label.buttons=Configuraci&oacute;n
  label.context=Contexto
  label.toGeoserver=A GeoServer
  label.saveXML=Guardar XML
  label.loadXML=Cargar XML
  label.onlineResource=Recursos en l&iacute;nea
  label.featureTypes=Entidades
  label.namespace=Espacio de nombres
  label.namespaceID=ID del espacio de nombres
  label.namespaces=Espacios de nombres
  label.new=Nuevo
  label.edit=Editar
  label.delete=Eliminar
  label.dataStoreID=ID del almac&eacute;n de datos
  label.enabled=Disponible
  label.srsXmlStyle=Nombre del SRS como XML
  label.username=Nombre de usuario
  label.server=Servidor
  label.port=Puerto
  label.password=Contrase&ntilde;a
  label.password.confirm=Confirmar Contrase&ntilde;a
  label.URI=URI
  label.default=Por defecto
  label.prefix=Prefijo
  label.filename=Nombre del fichero
  label.SRS=Sistema de Referencia Espacial
  label.latLonBoundingBox=M&aacute;xima extensi&oacute;n en LatLon
  label.connectionParameters=Par&aacute;metros de conexi&oacute;n
  label.dataStoreDescription=Descripci&oacute;n del almac&eacute;n de datos
  label.attributeTypes=Tipos de Atributos
  label.attributeTypeName=Nombre del Tipo de Atributo
  label.isNillible=Valor nulo v&aacute;lido
  label.isRef=es Referenciable
  label.minOccurs=N&uacute;mero m&iacute;nimo de apariciones
  label.maxOccurs=N&uacute;mero m&aacute;ximo de apariciones
  label.type=Tipo
  label.messages=Mensajes
  label.mainMenu=Men&uacute; Principal
  label.status=Estado
  label.configStatus=Configuraci&oacute;n de Estado
  label.configChangedTrue=Modificado
  label.configChangedFalse=Sin modificar
  label.geoServerStatus=Estado de GeoServer
  label.geoServerChangedTrue=Modificado
  label.geoServerChangedFalse=Sin modificar
  label.submit=Enviar
  label.reset=Reinicializar
  label.credits=Creditos
  label.credits.url=http://docs.codehaus.org/display/GEOS/Contributors
  label.newLoginAndPassword=Introduzca un nuevo nombre de usuario y contrase&ntilde;a
  label.wms.svgRenderer=Renderizado SVG
  label.wms.svgSimple=Simple (R&aacute;pido, pero con estilos limitados)
  label.wms.svgBatik=Batik (Lento, pero con estilos completos)
  label.wms.svgAntiAlias=Antialias
  label.cacheMaxAge=Tiempo para Cache
  label.cachingEnabled=Habilitar Caching?
  
  help.name_service=Este es el nombre del servicio
  help.title_service=Este es el t&iacute;tulo del servicio
  help.accessConstraints_service=Las restricciones del servicio
  help.fees_service=Niveles de accesos
  help.maintainer_service=Nombre de la persona u organizaci&oacute;n que mantiene el servicio
  help.keywords_service=Una lista de palabras clave asociada al servicio.
  help.dataFeatureTypeKeywords_service=Palabras claves para las entidades
  help.abstract_service=Una breve descripci&oacute;n del servicio
  help.onlineResource_service=URL de acceso al servicio web.
  help.serviceType_service=El tipo de servicio
  help.cacheControl_defaultMaxAge=Tiempo (en segundos) que deben permanecer los mapas generados para indicar a los sistemas externos de cache.
  
  help.dataStore_id=Identificador &uacute;nico del almac&eacute;n de datos.
  help.dataStore_enabled=Seleccionar para habilitar el almac&eacute; de datos.
  help.dataStore_nameSpace=Un prefijo para el espacio de nombres asociado al almac&eacute;n de datos.
  help.dataStore_description=Una breve descripci&oacute;n del almac&eacute;n de datos.
  help.dataStore_server=El nombre del servidor al que hay que conectarse.
  help.dataStore_port=El puerto de conexi&oacute;n con el servidor.
  help.dataStore_username=El nombre de usuario para conectarse con el servidor.
  help.dataStore_password=La contrase&ntilde;a para conectarse con el servidor.
  
  help.namespace.default=Seleccionar si este espacio de nombres debe usarse por defecto si no se indica otro
  help.namespace.prefix=El prefijo usado para identificar este espacio de nombres en un documento GML
  help.namespace.uri=URI del documento que describe la definici&oacute;n del espacio de nombres
  
  
  help.dataFeatureTypeAbstract_service=Descripci&oacute;n de la entidad
  
  help.dataFeatureTypeKeywords=BLAH
  help.dataFeatureTypeAbstract=BLAH
  
  error.name.required=El nombre es obligatorio
  error.title.required=El t&iacute;tulo es obligatorio
  error.fees.required=El nivel de acceso es obligatorio
  error.maintainer.required=El mantenedor es obligatorio
  error.keywords.required=Las palabras clave son obligatorias
  error.abstract.required=El resumen es obligatorio
  error.accessConstraints.required=Las restricciones de acceso son obligatorias
  
  error.dataStoreId.invalid=La identificaci&oacute;n del almac&eacute;n de datos '{0}' debe contener s&oacute;lo caracteres alfanum&eacute;ricos (A-Z, a-z, 0-9)
  error.dataStoreId.required=La identificaci&oacute;n del almac&eacute;n de datos es obligatoria.
  error.dataStoreFactory.invalid=La f&aacute;brica de almacenes de datos no es correcta (Por favor, elija una de la lista).
  error.dataStoreEditor.param.required={0} es un par&aacute;metro obligatorio
  error.dataStoreEditor.param.parse={0} debe ser un v&aacute;lido {1}: {2}
  error.datastoreEditor.validation=Los par&aacute;metros introducidos no pueden ser procesados
  errors.buttonAction.invalid=Ha presionado un bot&oacute;n no v&aacute;lido.
  errors.factory.invalid=La identificaci&oacute;n del almac&eacute;n de datos seleccionada no es v&aacute;lida.
  error.dataStoreEditor.param.missing=No puedo localizar {0} para {1}
  error.exception={0}
  error.invalidConnectionParams=Los par&aacute;metros de conexi&oacute;n no son v&aacute;lidos
  error.cannotProcessConnectionParams=No es posible realizar la conexi&oacute;n con los par&aacute;metros introducidos
  error.badCharSet=El juego de caracteres introducido no es v&aacute;lido - el nombre debe cumplir las reglas documentadas en el registro de caracteres del IANA
  error.cannotRunValidation=Imposible realizar la validaci&oacute;n: {0}
  error.password.mismatch=La contrase&ntilde;a debe coincidir con la confirmaci&oacute;n de contrase&ntilde;a. Intente de nuevo.
  error.prefix.invalid=El prefijo del espacio de nombres '{0}' debe estar formado s&oacute;lo por caracteres alfanum&eacute;ricos (A-Z, a-z, 0-9)
  error.prefix.required=El prefijo del espacio de nombres es obligatorio
  error.uri.malformed=La URI del espacio de nombres est&aacute; mal formada: {0}
  error.uri.required=La URI del espacio de nombres es obligatoria
  
  error.style.required=El Estilo seleccionado es obligatorio
  error.style.invalid=No est&aacute; definido el Estilo seleccionado
  
  error.noWritePermission=Si permisos de escritura para: {0}
  error.couldNotCreateFile=No se pudo crear el fichero: {0}. Posible causa: {1}
  
  welcome.heading=Bienvenido
  
  geoserver.logo=GeoServer
  
  label.defaultTitle=GeoServer
  label.featureTypeName=Nombre de la entidad
  label.moveUp=Subir
  label.moveDown=Bajar
  label.testSuite=Conjunto de pruebas
  label.testName=Nombre de la prueba
  label.testDescription=Descripci&oacute;n de la prueba
  label.newName=Nuevo nombre
  label.currentTestSuite=Conjunto de pruebas en proceso
  label.plugInType=Tipo de m&oacute;dulo adicional
  label.plugInDescription=Descripci&oacute;n del m&oacute;dulo adicional
  label.maxFeatures=N&uacute;mero m&aacute;ximo de objetos devueltos
  label.verbose=Nivel de mensajes
  label.verboseExceptions=Excepciones del nivel de mensajes
  label.numDecimals=N&uacute;mero de decimales
  label.charset=Juego de caracteres
  label.baseURL=URL base
  label.schemaBaseURL=Esquema de la URL base
  label.loggingLevel=Nivel de log
  label.loggingToFile=Write Logs to File
  label.logLocation=Log Location
  label.contactInformation=Informaci&oacute;n de contacto
  label.contactPerson=Persona de contacto
  label.contactOrganization=Organizaci&oacute;n
  label.contactPosition=Puesto
  label.addressType=Tipo de direcci&oacute;n
  label.address=Direcci&oacute;n
  label.addressCity=Ciudad
  label.addressState=Estado/Provincia
  label.addressPostalCode=C&oacute;digo Postal
  label.addressCountry=Pa&iacute;s
  label.contactVoice=N&uacute;mero de tel&eacute;fono
  label.contactFacsimile=N&uacute;mero de fax
  label.contactEmail=Direcci&oacute;n de correo electr&oacute;nico
  label.wfs=WFS
  label.wms=WMS
  label.data=Datos
  label.wfsStatus=Estado del WFS
  label.wmsStatus=Estado del WMS
  label.dataStatus=Estado de los datos
  label.apply=Aplicar
  label.save=Guardar
  label.load=Cargar
  label.calculateBoundingBox=Calcular caja de encuadre
  label.wfsDescription=Descripci&oacute;n del WFS
  label.wfsContent=Contenido del WFS
  label.wmsDescription=Descripci&oacute;n del WMS
  label.wmsContent=Contenido del WMS
  label.wmsRendering=WMS Rendering
  label.dataStores=Almacenes de datos
  label.createNewDataStore=Crear un nuevo almac&eacute;n de datos
  label.createNewNamespace=Crear un nuevo espacio de nombres
  label.serviceLevel=Nivel de servicio
  label.serviceLevel.basic=B&aacute;sico
  label.serviceLevel.transactional=Transaccional
  label.serviceLevel.complete=Complete 
  label.validation=Validaci&oacute;n
  label.contact=Contacto
  label.none=Ninguno
  label.phoneNumber=N&uacute;mero de tel&eacute;fono
  label.faxNumber=N&uacute;mero de fax
  label.email=Correo electr&oacute;nico
  label.info=Informaci&oacute;n
  label.cacheControl_defaultMaxAge=Tiempo de vida de las im&aacute;genes para encabezados de control de cache
  
  help.enabled=Habilita/Deshabilita el servicio
  help.srsXmlStyle=Seleccionar si el nombre del sistema de referencia espacial del GML devuelto debe ser xml (como en la especificaci&oacute;n), no marcar si s&oacute;lo deber&iacute;a devolver EPGS.
  help.featureList=Permite habilitar/deshabilitar entidades individuales dentro del servicio.
  help.global.maxFeatures=Establece el n&uacute;mero m&aacute;ximo de objetos devueltos por GetFeature.
  help.global.verbose=Indica si deben a&ntilde;adirse l&iacute;neas e indentaciones a las respuestas XML.
  help.global.verboseExceptions=Indica si las excepciones de servicio que se devuelven al usuario deber&iacute;an incluir los volcados de pila java
  help.global.numDecimals=N&uacute;mero de posiciones decimales devueltas en la respuesta GetFeature.
  help.global.charset=Establece el juego de caracteres global.
  help.global.baseURL=La URL base donde va a ejecutarse este servlet.
  help.global.schemaBaseURL=Define la URL base para la localizaci&oacute;n de los esquemas WFS.
  help.global.loggingLevel=Define el nivel de mensajes en el fichero de registro de la aplicaci&oacute;n.
  help.global.loggingToFile=Habilitar/Deshabilitar el fichero de registro.
  help.global.logLocation=Especificar la ubicaci&oacute;n del fichero de registro. Puede ser un directorio o un fichero. Lo anterior debe ser seleccionado para que este valor tenga efecto.
  
  help.global.contactPerson=El nombre de la persona de contacto;
  help.global.contactOrganization=El nombre de la organizaci&oacute;n a la que est&aacute; afiliada la persona de contacto.
  help.global.contactPosition=El cargo de la persona de contacto en su organizaci&oacute;n.
  help.global.addressType=El tipo de direcci&oacute;n especificada, como, p.e., postal.
  help.global.address=Calle.
  help.global.addressCity=Ciudad.
  help.global.addressState=Estado/Provincia.
  help.global.addressPostalCode=C&oacute;digo postal.
  help.global.addressCountry=Pa&iacute;s.
  help.global.contactVoice=N&uacute;mero de tel&eacute;fono de la persona de contacto.
  help.global.contactFacsimile=N&uacute;mero de fax de la persona de contacto.
  help.global.contactEmail=Direcci&oacute;n de correo electr&oacute;nico de la persona de contacto.
  
  help.serviceLevel=Define el nivel de servicio que proporciona el WFS
  
  help.wms.svgRenderer=Seleccione el renderizador SVG a usar al servir peticiones WMS con SVG
  
  tab.description=Descripci&oacute;n
  tab.content=Contenido
  tab.dataStores=Almacenes de datos
  tab.namespaces=Espacios de nombres
  tab.styles=Estilos
  tab.featureTypes=Entidades
  
  error.login.invalidCombo=El usuario y/&oacute; la contrase&ntilde;a son incorrectos.
  error.login.required=Debe iniciar sesi&oacute;n para acceder a esta caracter&iacute;stica.
  
  error.latLonBoundingBox.required=Todos los elementos de la caja de encuadre LatLon son obligatorios.
  error.latLonBoundingBox.invalid=Caja de encuadre LatLon no v&aacute;lida: {0}
  error.serviceLevel.invalid=El nivel de servicio seleccionado es incorrecto.
  
  link.geoserver=http://geoserver.org/
  link.license=http://docs.codehaus.org/display/GEOSDOC/License
  
  # --- changed ----
  label.geoServerConfiguration=Configuraci&oacute;n de GeoServer
  message.login.hint=(El usuario por defecto es 'admin' y la contrase&ntilde;a es 'geoserver')
  message.noContact=No se ha proporcionado informaci&oacute;n de contacto
  message.notLoaded=No se ha cargado el fichero de recursos de la aplicaci&oacute;n -- compruebe si existen mensajes de error en los logs del contenedor de servlets
  message.noTitle=Mi GeoServidor
  message.dataOkay=Datos cargados sin incidentes
  
  
  # WELCOME
  welcome.label=Bienvenido
  welcome.title=Bienvenido a GeoServer
  welcome.short=Bienvenido a GeoServer 1.4.0.  ¡Gracias por usar GeoServer!
  welcome.words=(GeoServer) (GIS) (SIG) (Sistemas de Informaci&oacute;n Geogr&aacute;fica) (WFS)
  
  welcome.contact.label=Persona de contacto
  welcome.contact.title=Informaci&oacute;n de contacto
  welcome.contact.short=Informaci&oacute;n de contacto con el administrador de la p&aacute;gina web
  welcome.contact.words=(WebMaster) (Informaci&oacute;n de contacto) 
  
  welcome.demo.label=Demostraci&oacute;n
  welcome.demo.title=Demostraci&oacute;n
  welcome.demo.short=Peticiones a GeoServer de ejemplo (usando el TestServlet).  Seleccione una petici&oacute;n de la lista desplegable, y pulse 'Cambiar'.  Se mostrar&aacute; la url de la petici&oacute;n (y el cuerpo si se trate de una petici&oacute;n XML). Pulse 'Enviar' para enviar la petici&oacute;n a GeoServer.
  welcome.demo.words=(GeoServer) (Demostraci&oacute;n)
  welcome.demo.wmsexample.title=Ejemplo WMS
  welcome.demo.wmsexample.label=Vista WMS de Nueva York
  welcome.demo.wmsexample.short=Esta es una vista WMS de Manhattan, New York. Le permite mover, acercar, y hasta hacer clic en las im&aacute;genes para verla en una vista mas grande. Esta escrito en JavaScript y el c&oacute;digo se encuentra en el directorio: [geoserver]/data/demo/popup_map
  welcome.demo.mappreview.title=Vista Preliminar de Mapas
  welcome.demo.mappreview.label=Vistas preliminares WMS de los FeatureTypes habilitados
  welcome.demo.mappreview.short=La vista preliminar de mapa le muestra cada FeatureType habilitada y le muestra un enlace a cada una, permitiendole verla en la forma WMS usando MapBuilder.
  welcome.demo.requests.title=Peticiones de ejemplo
  welcome.demo.requests.label=Ejemplos de peticiones WMS y WFS
  welcome.demo.requests.short=Esta p&aacute;gina muestra ejemplos de peticiones WMS y WFS qe puede usar, examinar, y cambiar. Es muy &uacute;til para observar como dialogar con Geoserver y como ud puede hacre su propiaas peticiones personalizadas.
  welcome.demo.documentation.title=Documentaci&oacute;n
  welcome.demo.documentation.label=P&aacute;gina principal del documentai&oacute;n.
  welcome.demo.documentation.short=Aqu&iacute; esta la p&aacute;gina principalde la documentaci&oacute;n de Geoserver. Es un sistema WIKI, de modo que podr&aacute; agregar cualquier documento, tutorial, manual, etc que cre que pude beneficiar a otros usuarios.
  welcome.demo.wfst.title=Demo WFS-T
  welcome.demo.wfst.label=P&aacute;gina de Ejemplo de WFS-T (transactional)
  welcome.demo.wfst.short=Esta p&aacute;gina, que utiliza MapBuilder, es una ejemplo de las peticiones WFS-T (transaccional) que puede usar. Le permite insertar puntos y l&iacute;neas en varias capas del mapa.
  
  welcome.demoRequest.label=Demostraci&oacute;n de peticiones
  welcome.demoRequest.title=Demostraci&oacute;n de peticiones
  welcome.demoRequest.short=Peticiones de ejemplo para Geoserver (ussando TestServlet).  Elija una petici&oacute; de la lista y oprima 'Cambiar'.  Esto mostrar&aacute; la URL de la petici&oacute;n (y el cuerpo si es una petici&oacute;n XML).  Oprima *Enviar* para enviar la petici&oacute;n a GeoServer.
  welcome.demoRequest.words=(GeoServer) (Demostraci&oacute;n)
  
  # WELCOME resources
  text.welcome1=El proyecto GeoServer es una implementaci&oacute;n Java completamente transaccional de la especificaci&oacute;n para servidores WFS del consorcio OpenGIS, e incluye un Servidor Web de Mapas (WMS) integrado.
  text.welcome2=GeoServer es software libre, disponible bajo la licencia GPL 2.0.
  text.welcome3=Los usuarios que deseen acceder y modificar sus datos geogr&aacute;ficos a trav&eacute;s de Internet usando est&aacute;ndares flexibles y aprobados por la industria, deber&iacute;an echarle un vistazo GeoServer.
  text.welcome4=El texto que describe a su WFS y a su WMS puede editarse usando el enlace de Configuraci&oacute;n. Debes entrar como usuario (enlace de la esquina superior derecha) para cambiar la configuraci&oacute;n de GeoServer (incluyendo la informaci&oacute;n de contacto), o administrar la aplicaci&oacute;n de GeoServer que est&aacute; ya iniciada.
  text.welcome5=La documentaci&oacute;n asociada a esta distribuci&oacute;n est&aacute; disponible en internet en el siguiente enlace. El wiki de GeoServer se usa para distribuir las &uacute;ltimas actualizaciones; por favor, comparte tus experiencias, vivencias y trucos all&iacute;. El rastreador de tareas es el lugar donde se puede solicitar nuevas caracter&iacute;sticas o informar de errores. Tambi&eacute;n t&oacute;mese algo de tiempo para a&ntilde;adirse al Mapa de Usuarios para mostrar su apoyo a GeoServer.
  
  text.welcome.mapbuilder=Demo de Mapbuilder
  text.welcome.mapbuilder.detail= <a href='http://mapbuilder.sourceforge.net/'>Mapbuilder</a> es un cliente JavaScript para WFS-T. Puede utilizar Mapbuilder para editar los datos de esta instalaci&oacute;n de Geoserver.
  
  # NEW features
  text.visitDemoPage=Visite la <b><a href="../../../demo.do">p&aacute;gina de demos</a></b> para ver ejemplos de GeoServer en acci&oacute;n. Este incluye un cliente integrado de <b><a href="../../../mapPreview.do"/>Mapbuilder</a></b>.
  text.newFeatureLogo=<b><font color='red'>NUEVO!</font></b>
  text.newFeature1=ver las capas WMS en la nueva GUI MapBuilder.
  text.newFeature2=Visite la p&aacute;gina de Demos para ver algunos demos WMS y WFS.
  
  # ADMIN
  admin.label=Administrar
  admin.title=Administraci&oacute;n de GeoServer
  admin.short=Administraci&oacute;n de un Geoservidor en funcionamiento
  admin.words=(Administraci&oacute;n)
  
  admin.login.label=Conexi&oacute;n
  admin.login.title=Conexi&oacute;n
  admin.login.short=Conexi&oacute;n a GeoServer (Usuario: admin y contrase&ntilde;a: geoserver son los valores por defecto, puede modificarlo en Configuraci&oacute;n->Servidor->Contrase&ntilde;a).
  admin.login.words=(GeoServer) (Conexi&oacute;n)
  
  admin.freeLocks.label=Liberar bloqueos
  admin.freeLocks.title=Liberar todos los bloqueos de objetos
  admin.freeLocks.short=Libera todos los bloquos de objetos mantenidos actualmente por el servidor
  admin.freeLocks.words=(FeatureLock) (Liberar) (Administraci&oacute;n)
  
  admin.freeMemory.label=Memoria libre
  admin.freeMemory.title=Memoria libre disponible
  admin.freeMemory.short=Liberar la memoria disponible usando el recolector de basura
  admin.freeMemory.words=(Memoria) (Liberar) (Administraci&oacute;n)
  
  # Recursos para el Administrador
  label.locks=Bloqueos
  label.connections=Conexiones
  label.memory=Memoria
  help.locks=N&uacute;mero de bloqueos de objetos
  help.connections=N&uacute;mero de conexiones a datos
  help.memory=Cantidad de memoria disponible
  text.admin=Esta p&aacute;gina de administraci&oacute;n est&aacute; actualmente en fase de desarrollo, se tiene la intenci&oacute;n de que muestre el estado de funcionamiento (y la interacci&oacute;n con la misma) de la aplicaci&oacute;n GeoServer.
  message.freeLocks=Bloqueos liberados ({0} fueron mantenidos)
  message.memory=Memoria liberada ({0}K liberados)
  
  # CONFIG
  config.label=Configuraci&oacute;n
  config.title=Configuraci&oacute;n de GeoServer
  config.short=Configuraci&oacute;n de la aplicaci&oacute;n GeoServer
  config.words=(Configuraci&oacute;n)
  
  # CONFIG Server
  config.server.label=Servidor
  config.server.title=Configuraci&oacute;n del servidor
  config.server.short=Configuraci&oacute;n del servidor e informaci&oacute;n de contacto
  config.server.words=(Configuraci&oacute;n) (Contacto) (Servidor)
  
  # CONFIG Server Login
  config.server.login.label=Contrase&ntilde;a
  config.server.login.title=Cambiar contrase&ntilde;a
  config.server.login.short=P&aacute;gina para editar el usuario y la contrase&ntilde;a
  config.server.login.words=(GeoServer) (Conexi&oacute;n) (Administraci&oacute;n)
  
  # CONFIG validation
  config.validation.label=Validaci&oacute;n
  config.validation.title=Configuraci&oacute;n de la validaci&oacute;n
  config.validation.short=Configuraci&oacute;n del procesador de validaci&oacute;n de GeoServer
  config.validation.words=(Configuraci&oacute;n) (Validaci&oacute;n)
  
  config.validation.suite.label=Conjunto de pruebas
  config.validation.suite.title=Configuraci&oacute;n del conjunto de pruebas de validaci&oacute;n
  config.validation.suite.short=Configuraci&oacute;n del conjunto de pruebas para el proceso de validaci&oacute;n
  config.validation.suite.words=(Proceso de validaci&oacute;n) (Conjunto de pruebas)
  
  config.validation.suite.doit.label=Ejecutar pruebas
  config.validation.suite.doit.title=Ejecutar conjunto de pruebas
  config.validation.suite.doit.short=Intentar la ejecuci&oacute;n del conjunto de pruebas
  config.validation.suite.doit.words=(Proceso de validaci&oacute;n) (Conjuntos de pruebas)
  
  config.validation.test.label=Pruebas
  config.validation.test.title=Configuraci&oacute;n de la prueba de validaci&oacute;n
  config.validation.test.short=Configuration of validation tests
  config.validation.test.words=(Proceso de validaci&oacute;n) (Validaci&oacute;n) (Prueba)
  
  config.validation.suite.editor.label=Editor
  config.validation.suite.editor.title=Editor del conjunto de pruebas de validaci&oacute;n
  config.validation.suite.editor.short=Editor para los conjuntos de pruebas de validaci&oacute;n
  config.validation.suite.editor.words=(Proceso de validaci&oacute;n) (Validaci&oacute;n) (Conjunto de pruebas)
  
  config.validation.test.editor.label=Editor
  config.validation.test.editor.title=Editor de la prueba de validaci&oacute;n
  config.validation.test.editor.short=Editor para pruebas de validaci&oacute;n
  config.validation.test.editor.words=(Proceso de validaci&oacute;n) (Validaci&oacute;n) (Prueba)
  
  config.validation.test.doit.label=Ejecutar prueba
  config.validation.test.doit.title=Ejecutar prueba de validaci&oacute;n 
  config.validation.test.doit.short=Intentar la ejecuci&oacute;n de la prueba de validaci&oacute;n
  config.validation.test.doit.words=(Proceso de validaci&oacute;n) (Prueba)
  
  config.validation.displayResults.label=Mostrar resultados
  config.validation.displayResults.title=Resultados de la prueba de ejecuci&oacute;n
  config.validation.displayResults.short=Mostrar los resultados de la prueba de ejecuci&oacute;n
  config.validation.displayResults.words=(Proceso de validaci&oacute;n) (Validaci&oacute;n) (Conjunto de pruebas) (Resultados)
  config.validation.displayResults.errors=Errores
  config.validation.displayResults.runCompleted=Ejecuci&oacute;n completa
  config.validation.displayResults.runNotCompleted=Ejecuci&oacute;n no completa
  config.validation.displayResults.stop=Detener
  
  # CONFIG wfs
  config.wfs.label=WFS
  config.wfs.title=Configuraci&oacute;n del WFS
  config.wfs.short=Configuraci&oacute;n del WFS
  config.wfs.words=(WFS) (Configuraci&oacute;n)
  
  config.wfs.content.label=Contenidos
  config.wfs.content.title=Contenidos del Web Feature Server
  config.wfs.content.short=Configuraci&oacute;n de la funcionalidad del Web Feature Server
  config.wfs.content.words=(WFS) (Web Feature Server) (Configuraci&oacute;n)
  
  config.wfs.description.label=Descripci&oacute;n
  config.wfs.description.title=Descripci&oacute;n del Web Feature Server
  config.wfs.description.short=Configuraci&oacute;n de la informaci&oacute;n y los metadatos del Web Feature Server
  config.wfs.description.words=(WFS) (Web Feature Server) (Configuraci&oacute;n)
  
  error.wfs.onlineResource.required=El Recurso en l&iacute;nea es obligatorio.
  error.wfs.onlineResource.malformed=El Recurso en l&iacute;nea est&aacute; malformado: {0}
  
  # CONFIG wms
  config.wms.label=WMS
  config.wms.title=Configuraci&oacute;n del Web Map Server
  config.wms.short=Configuraci&oacute;n del Web Map Server
  config.wms.words=(WMS) (Web Map Server) (Configuraci&oacute;n)
  
  config.wms.content.label=Contenidos
  config.wms.content.title=Contenidos del Web Map Server
  config.wms.content.short=Configuraci&oacute;n de la funcionalidad Web Map Server
  config.wms.content.words=(WMS) (Web Map Server) (Configuraci&oacute;n)
  
  config.wms.description.label=Descripci&oacute;n
  config.wms.description.title=Descripci&oacute;n del Web Map Server
  config.wms.description.short=Configuraci&oacute;n de la informaci&oacute;n y los metadatos del Web Map Server
  config.wms.description.words=(WMS) (Web Map Server) (Configuraci&oacute;n)
  
  config.wms.rendering.label=Rendering
  config.wms.rendering.title=Web Map Server Rendering
  config.wms.rendering.short=Configuration of Web Map Server Rendering
  config.wms.rendering.words=(WMS) (Web Map Server) (Rendering)
  
  error.wms.onlineResource.required=El Recurso en l&iacute;nea es obligatorio.
  error.wms.onlineResource.malformed=El Recurso en l&iacute;nea est&aacute; malformado: {0}
  
  # DATA
  config.data.label=Datos
  config.data.title=Configuraci&oacute;n de los datos de GeoServer
  config.data.short=Configuraci&oacute;n del acceso a config.data y la representaci&oacute;n de la aplicaci&oacute;n de GeoServer
  config.data.words=(Configurar) (Datos) (Datos espaciales)
  
  # DATA - config.dataStores
  config.data.store.label=Almacenes
  config.data.store.title=Configuraci&oacute;n de los almacenes de datos
  config.data.store.short=Seleccione el almac&eacute;n de datos para su configuraci&oacute;n
  config.data.store.words=(Configurar) (Base de datos) (fichero shape) (Datos espaciales) (Datos)
  
  config.data.store.new.label=Nuevo
  config.data.store.new.title=Crear un nuevo almac&eacute;n de datos
  config.data.store.new.short=Crear un origen de informaci&oacute;n espacial
  config.data.store.new.words=(Configurar) (Base de datos) (fichero shape) (Datos espaciales) (Datos)
  
  config.data.store.editor.label=Editar
  config.data.store.editor.title=Editor del almac&eacute;n de datos
  config.data.store.editor.short=Editar un origen de informaci&oacute;n espacial
  config.data.store.editor.words=(Configurar) (Base de datos) (fichero shape) (Datos espaciales) (Datos)
  config.data.store.editor.requiredField=campo requerido
  
  # DATA namespace
  config.data.namespace.label=Espacio de nombres
  config.data.namespace.title=Configuraci&oacute;n del espacio de nombres
  config.data.namespace.short=Configurar el espacio de nombres GML que se usa para el GML generado
  config.data.namespace.words=(GML) (Espacio de nombres) (prefijo)
  
  config.data.namespace.new.label=Nuevo
  config.data.namespace.new.title=Crear un nuevo espacio de nombres
  config.data.namespace.new.short=Crear un nuevo espacio de nombres para el contenido GML
  config.data.namespace.new.words=(GML) (Espacio de nombres) (prefijo)
  
  config.data.namespace.editor.label=Editar
  config.data.namespace.editor.title=Editor del espacio de nombres
  config.data.namespace.editor.short=Editar el prefijo y el URI para el espacio de nombres GML
  config.data.namespace.editor.words=(GML) (Espacio de nombres) (prefijo)
  
  text.namespace=Seleccione un espacio de nombres de la lista (un asterisco indica el espacio de nombres por defecto).
  # DATA styles
  # -----------
  config.data.style.label=Estilo
  config.data.style.title=Configuraci&oacute;n de los estilos
  config.data.style.short=Defina los estilos disponibles
  config.data.style.words=(WMS) (Web Map Server) (Estilo)
  config.data.sldWizard.label=Crear nuevo SLD
  
  config.data.style.new.label=Nuevo
  config.data.style.new.title=Nuevo estilo
  config.data.style.new.short=Crear un nuevo estilo
  config.data.style.new.words=(WMS) (Web Map Server) (Estilo)
  
  config.data.style.editor.label=Editar
  config.data.style.editor.title=Editor de estilos
  config.data.style.editor.short=Editar los estilos seleccionados
  config.data.style.editor.words=(WMS) (Web Map Server) (Estilo)
  
  # Resources for styles
  label.styles=Estilos
  label.styleID=Identificador de estilo
  help.styles=Lista de estilos disponibles
  help.styleID=Identificador usado para el estilo
  error.style.exists=El identificador de estilo {0} ya existe
  error.file.required=El nombre del fichero es obligatorio
  # didier, 2004-04-20, not anymore used :
  error.file.nonexistent=El fichero {0} no existe
  # didier, 2004-04-20, FormFile :
  error.file.maxLengthExceeded=Se ha superado la longitud m&aacute;xima de subida para el documento SLD ({0} bytes permitidos)
  error.action.invalid=La acci&oacute;n '{0}' no se comprende
  error.styleID.required=La identificaci&oacute;n del estilo es obligatoria
  error.styleID.invalid=La identificaci&oacute;n del estilo debe empezar con un caracter alfanum&eacute;rico.
  error.style.sldFileExists=Ya existe un estilo con el nombre {0} almacenado en GeoServer.  Por favor renombre el fichero e intente de nuevo.
  
  
  error.namespace.namespaceInUse=El espacio de nombres que intenta eliminar se encuentra en uso por un DataStore. Por favor elimine primero el DataStore.
  
  
  
  # DATA featureType
  # -----------
  config.data.type.label=Entidades
  config.data.type.title=Configuraci&oacute;n de las entidades
  config.data.type.short=Define las entidades disponibles a trav&eacute;s de este servicio
  config.data.type.words=(Entidad) (Informaci&oacute;n espacial)
  
  config.data.type.new.label=Nuevo
  config.data.type.new.title=Crear una nueva entidad
  config.data.type.new.short=Crear una nueva entidad a partir de un almac&eacute;n de datos
  config.data.type.new.words=(Entidad) (Informaci&oacute;n espacial)
  
  config.data.type.editor.label=Editar
  config.data.type.editor.title=Editor de entidades
  config.data.type.editor.short=Edita la definici&oacute;n y el esquema de la entidad
  config.data.type.editor.words=(Entidad) (Informaci&oacute;n espacial)
  
  config.data.calculateBoundingBox.label=Generar
  config.data.calculateBoundingBox.title=Calcular caja de encuadre
  config.data.calculateBoundingBox.short=Calcula el rect&aacute;ngulo que circunscribe una entidad
  config.data.calculateBoundingBox.words=(Entidad) (Informaci&oacute;n espacial) (Caja de encuadre)
  
  error.data.nullBBOX=El  FeatureType '{0}' tiene extensi&oactute;n NULL.  HINT: el conjunto de datos est&aacute; vac&iacute;o o no contiene un atributo geom&eacute;trico por defecto.
  error.data.couldNotFindSRSAuthority=No se ha encontrado una Autoridad SRS que comprenda su SRS. Por favor verifique que el SRS es correcto - es posible que necesite consultar las 'Autoridades SRS' disponibles para asegurarse que su SRS se encuentra inclu&iacute;do. <br> {0} <br> {1}
  error.data.factoryException=Imposible construir una transformaci&oacute;n de SRS - {0}
  error.data.transformException=Imposible realizar la transformaci&oacute;n de coordenadas.
  error.style.noParse=Imposible procesar el estilo - {0}
  
  
  label.SRSHelp=Ayuda sobre Sistemas de referencia Espacial
  
  #might want the other langages to point to a different url!
  label.SRSHelp.URL=http://docs.codehaus.org/display/GEOS/crshelp
  
  label.SRSList=Lista de Sistemas de Referencia Espacial
  
  
  label.type.dataminx=M&iacute;n X
  label.type.dataminy=M&iacute;n Y
  label.type.datamaxx=M&aacute;x X
  label.type.datamaxy=M&aacute;x Y
  
  help.type.dataminx=M&iacute;nimo valor de la coordenada X en el SRS de su DataStore
  help.type.dataminy=M&iacute;nimo valor de la coordenada Y en el SRS de su DataStore
  help.type.datamaxx=M&aacute;ximo valor de la coordenada X en el SRS de su DataStore
  help.type.datamaxy=M&aacute;ximo valor de la coordenada Y en el SRS de su DataStore
  
  error.badsrc=No se ha encontrado la definici&oacute;n de su SRS - {0}
  
  label.type.srswkt=SRS WKT
  help.type.srswkt=La &apos;Well Known Text Definition&apos; del n&uacute;mero EPSG de su  SRS
  
  # Resources for FeatureType
  label.bbox=Encuadre
  label.type.minx=Longitud m&iacute;nima
  label.type.miny=Latitud m&iacute;nima
  label.type.maxx=Longitud m&aacute;xima
  label.type.maxy=Latitud m&aacute;xima
  label.base=Esquema base
  label.schemaName=Nombre del esquema
  label.style=Estilo
  label.change=Modificar
  label.add=A&ntilde;adir
  label.nillable=puede ser nulo
  label.min=m&iacute;nimo
  label.max=m&aacute;ximo
  help.type.name=Nombre de la entidad
  help.type.style=Estilo por defecto para dibujar la entidad
  help.type.srs=Sistema de Referencia Espacial de una entidad
  help.type.title=T&iacute;tulo para los usuarios finales de esta entidad
  help.type.bbox=Caja de encuadre de la entidad completa
  help.type.minx=Valor m&iacute;nimo de la longitud de la entidad
  help.type.miny=Valor m&iacute;nimo de la latitud de la entidad
  help.type.maxx=Valor m&aacute;ximo de la longitud de la entidad
  help.type.maxy=Valor m&aacute;ximo de la latitud de la entidad
  help.type.base=Elemento base del XMLSchema (define los atributos obligatorios o -- para los generados)
  help.type.schemaName=Nombre del elemento del XMLSchema que describe Type
  help.type.cachingEnabled=Instruye a otros servidores a conservar en el cache los mapas generados por este featuretype?
  help.type.cacheMaxAge=Tiempo (en segundos) que otros servidores deben almacenar en cache los mapas generados por este featuretype.
  error.styleId.notFound=El identificador de estilo '{0}' no est&aacute; definido
  
  type.title.up=Subir un nivel este tipo
  type.title.down=Bajar un nivel este tipo
  type.title.delete=Eliminar este tipo
  label.jai=JAI est&aacute; disponible
  
  help.jai=La extensi&oacute;n JAI (Java Advanced Imaging) se usa para que el WMS pueda generar im&aacute;genes
  
  label.jvm=Versi&oacute;n de la m&aacute;quina virtual de Java (JVM)
  
  help.jvm=Indica qu&eacute; versi&oacute;n de la JVM est&aacute; siendo usada por el servidor
  
  
  srsList.title=Lista de n&uacute;meros de Sistemas de Referencias Espaciales
  srsList.tableTitle=Definici&oacute; WKT de EPSG
  
  mapPreview.title=Vista previa en miniatura de los FeatureTypes habilitados
  
  sldValididity.title=Su fichero .SLD no se ajusta al esquema xml para SLD.
  sldValiditity.help.text=M&aacute;s ayuda dispobile aqu&iacute;
  sldValiditity.help.url=http://docs.codehaus.org/display/GEOS/SLD+Validation
  
  help.citeConformanceHacks=Seleccioe si desea una adhesi&oacute;n estricta a las pruebas CITE. A menos que est&eacute; ejecutando las pruebas de conformidad CITE, es probable que no desee habilitar esta opci&oacute;n
  label.citeConformanceHacks=Adherencia estricta a Pruebas CITE
  
  help.featureBounding=Seleccione si desea que la caja de encuadre de la geometr&iacute;a por defecto de la entidad sea incluida autom&aacute;ticamente en la slida GetFeature gml.  No recomendado, dado que la mayor&iacute;a de los clientes no lo necesitan y esto desgasta ancho de banda extra.
  label.featureBounding=Generate feature bounds
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/ApplicationResources_fr.properties
  
  Index: ApplicationResources_fr.properties
  ===================================================================
  # Jody Here I cannot make sense of this file!
  #
  # I have organized the remainder of this file by application subsection,
  # this should probably be done by splitting this file into separate files?
  #
  #       Sections (Similar comments are present in struts-config.xml)
  #       --------
  #        WELCOME
  # ADMINISTRATION
  #  CONFIGURATION
  #           DATA
  #
  # Within each section resources are organizing by page,
  # the page names agree forwards in the struts-config.xml
  #
  # Implementation Notes:
  # - 'key' from tiles-def is the same as page name, when someone explains to
  #   to me how to get at page name we can get rid of 'key'.
  #
  # resource    value                          Example
  # --------    -----                          -------
  # key.label   display label for page links   Contact
  # key.title   page title & window title      Contact Information
  # key.short   short description              Contact information for webmaster
  # key.words   key words                      (Contact Information) (webmaster)
  #
  # We have a few additional resources grouping in the same section as the pages
  # that use them. These appear to be grouped by use.
  #
  # resource    value                           Example
  # --------    -----                           -------
  # label.*     Label for datum, or field       Prefix
  # help.*      Tooltip for datum, or field     Namespace prefix used for GML
  # message.*   Used for information messages   Spatial information loaded
  # error.*     Used for error messages         Namespace URI malformed: {0}
  # errors.*    As abvoe w/ Exception?
  #
  # If you need aditional resources, please just invent a convention
  # make a note of them above
  #
  # Here are my additional resource entries
  # resource    value                           Example
  # --------    -----                           -------
  # text.*(0-9) Long text passage               text.welcome1=GeoServer is ....
  #
  # This is not the best solution, I have not found a decent example of how to
  # internationalize page content. Apparently this is something JSP land is
  # working on - there are some JCP open on this issue.
  #
  
  # -- standard errors --
  errors.header=<UL>
  errors.prefix=<LI>
  errors.suffix=</LI>
  errors.footer=</UL>
  
  # -- validator --
  errors.invalid={0} est incorrect.
  errors.maxlength={0} ne peut contenir plus de {1} caractères.
  errors.minlength={0} doit au moins contenir {1} caractères.
  errors.range={0} n'est pas dans l'intervalle {1} à {2}.
  errors.required={0} est obligatoire.
  errors.byte={0} doit être du type byte.
  errors.date={0} doit être du type date.
  errors.double={0} doit être du type double.
  errors.float={0} doit être du type float.
  errors.integer={0} doit être du type integer.
  errors.long={0} doit être du type long.
  errors.short={0} doit être du type short.
  errors.creditcard={0} n'est pas un numéro de carte de crédit valide.
  errors.email={0} n'est pas une adresse de courriel valide.
  
  # -- other --
  errors.cancel=Opération annulée.
  errors.detail={0}
  errors.general=Le processus ne s'est pas terminé correctement. Des détails devraient suivre.
  errors.token=La requête n'a pas pu être exécutée. L'opération n'est pas dans l'ordre attendu.
  
  label.validationConfig=Configuration des jeux de tests
  label.wfsConfig=Configuration du WFS
  label.wmsConfig=Configuration du WMS
  label.dataConfig=Configuration des entrepôts
  label.name=Nom
  label.title=Titre
  label.accessConstraints=Droits d'accès
  label.fees=Frais d'accès
  label.maintainer=Mainteneur
  label.keywords=Mots clefs
  label.abstract=Résumé
  label.description=Description
  label.contents=Contenu
  label.login=Connexion
  label.logout=Déconnexion
  label.help=Aide
  label.actions=Actions
  label.buttons=Configuration
  label.context=Contexte
  label.toGeoserver=Vers GeoServer
  label.saveXML=Enregistrer en XML
  label.loadXML=Charger depuis XML
  label.onlineResource=Accès en ligne
  label.featureTypes=Entités
  label.namespace=Espace de nommage
  label.namespaceID=ID de l'espace de nommage
  label.namespaces=Espaces de nommages
  label.new=Nouveau
  label.edit=Éditer
  label.delete=Supprimer
  label.dataStoreID=ID entrepôt
  label.enabled=Disponible
  label.srsXmlStyle=srsName comme URL
  label.username=Nom de l'utilisateur
  label.server=Serveur
  label.port=Port
  label.password=Mot de passe
  label.password.confirm=Confirmation du mot de passe
  label.URI=URI
  label.default=Défaut
  label.prefix=Préfixe
  label.filename=Nom du fichier
  label.SRS=Système de référence de coordonnées
  label.latLonBoundingBox=Emprise géographique
  label.connectionParameters=Paramètres de connexion
  label.dataStoreDescription=Description de l'entrepôt
  label.attributeTypes=Types d'attributs
  label.attributeTypeName=Nom du type d'attribut
  label.isNillible=Valeur nulle autorisée
  label.isRef=Référence
  label.minOccurs=Occurences minimales
  label.maxOccurs=Occurences maximales
  label.type=Type
  label.messages=Messages
  label.mainMenu=Menu principal
  label.status=Statut
  label.configStatus=Statut de la configuration
  label.configChangedTrue=Modifié
  label.configChangedFalse=Inchangé
  label.geoServerStatus=Statut de GeoServer
  label.geoServerChangedTrue=Modifié
  label.geoServerChangedFalse=Inchangé
  label.submit=Envoyer
  label.reset=Réinitialiser
  label.credits=Remerciements
  label.credits.url=http://docs.codehaus.org/display/GEOS/Contributors
  label.newLoginAndPassword=Entrer les nouveaux nom d'administrateur et mot de passe
  label.wms.svgRenderer=Rendu en SVG
  label.wms.svgSimple=Simple (Rapide, mais cartographie limitée)
  label.wms.svgBatik=Batik (Lent, mais cartographie complète)
  label.wms.svgAntiAlias=Antialias
  label.cacheMaxAge=Durée de rétention en cache
  label.cachingEnabled=Activer le cache ?
  
  help.name_service=C'est le nom du service
  help.title_service=C'est le titre du service
  help.accessConstraints_service=Les droits associés au service
  help.fees_service=Frais d'accès requis
  help.maintainer_service=Nom de l'organisme ou de la personne fournissant le service
  help.keywords_service=Une liste des mots clefs associés au service.
  help.dataFeatureTypeKeywords_service=Mots clefs pour les entités
  help.abstract_service=Un court descriptif du service
  help.onlineResource_service=URL d'accès en ligne au service Web.
  help.serviceType_service=Le type du service
  help.cacheControl_defaultMaxAge=La durée (en secondes) pour instruire les caches externes à sauvegarder les cartes générées.
  
  help.dataStore_id=Identifiant unique pour un entrepôt de données.
  help.dataStore_enabled=Cocher pour activer cet entrepôt
  help.dataStore_nameSpace=Un préfixe d'espace de nommage à associer avec cet entrepôt.
  help.dataStore_description=Un court descriptif de cet entrepôt.
  help.dataStore_server=Le nom du serveur sur lequel se connecter.
  help.dataStore_port=Le port de connexion sur ce serveur (ex: 5432=postgreSQL).
  help.dataStore_username=Le nom de l'utilisateur pour se connecter à ce serveur.
  help.dataStore_password=Le mot de passe pour se connecter à ce serveur.
  
  help.namespace.default=Sélectionné si cet espace de nommage est celui utilisé quand aucun autre n'est spécifié
  help.namespace.prefix=Le préfixe utilisé pour identifier cet espace de nommage dans GML
  help.namespace.uri=URI du document décrivant l'espace de nommage
  
  
  help.dataFeatureTypeAbstract_service=Une description de l'entité
  
  help.dataFeatureTypeKeywords=désignant l'entité ...
  help.dataFeatureTypeAbstract=en quelques mots : objectifs, raison d'être, etc ...
  
  error.name.required=Le nom est obligatoire
  error.title.required=Le titre est obligatoire
  error.fees.required=Les frais d'accès sont obligatoires
  error.maintainer.required=Le mainteneur est obligatoire
  error.keywords.required=Les mots clefs sont obligatoires
  error.abstract.required=Le résumé est obligatoire
  error.accessConstraints.required=Les droits d'accès sont obligatoires
  
  error.dataStoreId.invalid=L'ID de l'entrepôt (0} ne peut être composé que de caractères alphanumériques (A-Z, a-z, 0-9)
  error.dataStoreId.required=l'ID de l'entrepôt est obligatoire.
  error.dataStoreFactory.invalid=DataStore Factory invalide (En choisir une dans la liste proposée)
  error.dataStoreEditor.param.required={0} est un paramètre obligatoire
  error.dataStoreEditor.param.parse={0} doit être un (ou une) {1} valide : {2}
  error.datastoreEditor.validation=Les paramètres fournis n'ont pas pu être utilisés
  errors.buttonAction.invalid=Action interdite ici.
  errors.factory.invalid=Entrepôt sélectionné incorrect.
  error.dataStoreEditor.param.missing=Impossible de trouver {0} pour {1}
  error.exception={0}
  error.invalidConnectionParams=Les paramètres de connexion sont incorrects
  error.cannotProcessConnectionParams=Impossible de se connecter avec les paramètres fournis
  error.badCharSet=Le jeu de caractères fourni n'est pas valide - le nom doit suivre la syntaxe définie dans le registre IANA des jeux de caractères
  error.cannotRunValidation=Impossible de lancer la validation : {0}
  error.password.mismatch=Les mots de passe fournis ne sont pas identiques, essayer à nouveau.
  error.prefix.invalid=Le préfixe de l'espace de nommage '{0}' doit seulement contenir des caractères alphanumériques (A-Z, a-z, 0-9)
  error.prefix.required=Le préfixe de l'espace de nommage est obligatoire.
  error.uri.malformed=L'URI de l'espace de nommage est incorrecte : {0}
  error.uri.required=L'URI de l'espace de nommage est obligatoire.
  
  error.style.required=Style sélectionné obligatoire
  error.style.invalid=Style sélectionné non défini
  
  error.noWritePermission=Aucune permission d'écriture sur: {0}
  error.couldNotCreateFile=Impossible de créer le fichier: {0}. Cas probable: {1}
  
  welcome.heading=Bienvenue
  
  geoserver.logo=GeoServer
  
  label.defaultTitle=GeoServer
  label.featureTypeName=Nom de l'entité
  label.moveUp=Descendre
  label.moveDown=Monter
  label.testSuite=Processus de test
  label.testName=Nom du test
  label.testDescription=Description du test
  label.newName=Nouveau nom
  label.currentTestSuite=En cours de travail en mode test
  label.plugInType=Type du module additionnel
  label.plugInDescription=Description du module additionnel
  label.maxFeatures=Nombre maximum d'objets retournés
  label.verbose=Mode verbeux
  label.verboseExceptions=VerboseExceptions
  label.numDecimals=Nombre de chiffres après la virgule
  label.charset=Jeu de caractères
  label.baseURL=URL de base
  label.schemaBaseURL=URL de base des schémas
  label.loggingLevel=Niveau d'information
  label.loggingToFile=Écrire les traces applicatives sur disque
  label.logLocation=Localisation des traces applicatives
  label.contactInformation=Qui contacter ?
  label.contactPerson=Personne à contacter
  label.contactOrganization=Organisation
  label.contactPosition=Fonction
  label.addressType=Type d'adresse
  label.address=Adresse
  label.addressCity=Ville
  label.addressState=État/Province
  label.addressPostalCode=Code postal
  label.addressCountry=Pays
  label.contactVoice=Numéro de téléphone
  label.contactFacsimile=Numéro de télécopieur
  label.contactEmail=Adresse de courriel
  label.wfs=WFS
  label.wms=WMS
  label.data=Données
  label.wfsStatus=Statut du WFS
  label.wmsStatus=Statut du WMS
  label.dataStatus=Statut des données
  label.apply=Appliquer
  label.save=Sauvegarder
  label.load=Charger
  label.calculateBoundingBox=Calculer l'emprise
  label.wfsDescription=Description du WFS
  label.wfsContent=Contenu du WFS
  label.wmsDescription=Description du WMS
  label.wmsContent=Contenu du WMS
  label.wmsRendering=Rendu WMS
  label.dataStores=Entrepôts
  label.createNewDataStore=Créer un nouvel entrepôt
  label.createNewNamespace=Créer un nouvel espace de nommage
  label.serviceLevel=Niveau de service
  label.serviceLevel.basic=Élémentaire
  label.serviceLevel.transactional=Transactionnel
  label.serviceLevel.complete=Complet
  label.validation=Validation
  label.contact=contact
  label.none=Aucun
  label.phoneNumber=Numéro de téléphone
  label.faxNumber=Numéro de télécopieur
  label.email=Courriel
  label.info=information
  label.cacheControl_defaultMaxAge=CacheControl-header max-age
  
  help.enabled=Active/Désactive le service
  help.srsXmlStyle=À cocher si le srsName retourné dans GML doit être une URL xml (comme dans les spècs.), à décocher si seulement EPSG: doit être retourné (URI).
  help.featureList=Autorise l'activation/désactivation d'entités pour le service.
  help.global.maxFeatures=Fournit le nombre maximum d'entités retournées par getFeature.
  help.global.verbose=Indique si des sauts de ligne et des indentations sont à retourner par les réponses XML.
  help.global.verboseExceptions=Indique si les exceptions renvoyées au client doivent comprendre l'intégralité de la trace Java
  help.global.numDecimals=Nombre de chiffres après la virgule retourné dans une réponse getFeature.
  help.global.charset=Donne le jeu de caractères global.
  help.global.baseURL=L'URL de base où cette servlet sera lancée.
  help.global.schemaBaseURL=Définit une URL de base pour la localisation des schémas WFS.
  help.global.loggingLevel=Définit le niveau d'information de l'application.
  help.global.loggingToFile=Active/Désactive l'enregistrement des traces applicatives sur fichier.
  help.global.logLocation=Spécifie la localisation des traces. Peut être un répertoire ou un fichier. L'option ci-dessus doit être cochée pour activer cette fonctionnalité.
  
  help.global.contactPerson=Le nom du contact.
  help.global.contactOrganization=Le nom de l'organisation où contacter la personne.
  help.global.contactPosition=La fonction du contact dans son organisation.
  help.global.addressType=Le type d'adresse spécifiée, comme "code postal".
  help.global.address=L'adresse postale actuelle.
  help.global.addressCity=La ville où est située cette adresse.
  help.global.addressState=L'État/province de l'adresse.
  help.global.addressPostalCode=Le code postal de cette adresse.
  help.global.addressCountry=Le pays de cette adresse.
  help.global.contactVoice=Le numéro de téléphone du contact.
  help.global.contactFacsimile=Le numéro de télécopieur du contact.
  help.global.contactEmail=L'adresse courriel du contact.
  
  help.serviceLevel=Définit le niveau de service que le WFS fournit
  
  help.wms.svgRenderer=Sélectionner le moteur de rendu à utiliser pour servir les requêtes WMS SVG
  
  tab.description=Description
  tab.content=Contenu
  tab.dataStores=Entrepôts
  tab.namespaces=Espaces de nommage
  tab.styles=Styles
  tab.featureTypes=Entités
  
  error.login.invalidCombo=Couple nom d'utilisateur / mot de passe incorrect.
  error.login.required=Vous devez être connecté pour accéder à cette fonction.
  
  error.latLonBoundingBox.required=Chacun des éléments de l'emprise est nécessaire.
  error.latLonBoundingBox.invalid=Emprise Longitude./Latitude invalide : {0}
  error.serviceLevel.invalid=Niveau du service sélectionné incorrect.
  
  link.geoserver=http://geoserver.sourceforge.net/
  link.license=http://geoserver.sourceforge.net/documentation/developer/license.htm
  
  # --- changed ----
  label.geoServerConfiguration=Configuration de GeoServer
  message.login.hint=(l'utilisateur par défaut est 'admin' avec le mot de passe 'geoserver')
  message.noContact=Aucune information sur le contact n'a été fournie
  message.notLoaded=Les ressources d'application n'ont pas été chargées -- vérifier les messages d'erreurs de la servlet.
  message.noTitle=Mon GeoServer
  message.dataOkay=Données chargées sans incident
  
  
  # WELCOME
  welcome.label=Bienvenue
  welcome.title=Bienvenue sur GeoServer
  welcome.short=Bienvenue sur GeoServer 1.4.0.  Merci d'utiliser GeoServer!
  welcome.words=(GeoServer) (SIG) (Systèmes d'information géographique)
  
  welcome.contact.label=Contact
  welcome.contact.title=Information sur le contact
  welcome.contact.short=Information pour contacter sur le webmestre du site
  welcome.contact.words=(WebMestre) (Information du contact)
  
  welcome.demo.label=Démonstration
  welcome.demo.title=Démonstration
  welcome.demo.short=Exemple de requêtes avec GeoServer (utilise TestServlet).  Sélectionnez une requête de menu déroulant, puis appuyez sur 'Modifier'.  Cette action affichera l'URL de requête (ainsi que son contenu si c'est une requête XML). Appuyez sur 'Envoyer' pour soumettre la requête à GeoServer.
  welcome.demo.words=(GeoServer) (Démonstration)
  welcome.demo.wmsexample.title=Exemple de WMS
  welcome.demo.wmsexample.label=Carte de New York via WMS
  welcome.demo.wmsexample.short=C'est une carte de Manhattan (New York) générée via WMS. Elle interagit avec vous par déplacement, zoom et, par un clic souris sur les images, ouvre une carte à plus grande échelle. Elle est écrite en Javascript et le code peut être trouvé sous : [geoserver]/data/demo/popup_map
  welcome.demo.mappreview.title=Prévisualisation de cartes
  welcome.demo.mappreview.label=Prévisualisation WMS de vos entités
  welcome.demo.mappreview.short=La page de prévisualisation affichera chaque entité qui est disponible et génèrera un hyperlien pour un affichage cartographique WMS sous MapBuilder.
  welcome.demo.requests.title=Échantillon de Requêtes
  welcome.demo.requests.label=Exemples de requêtes WMS et WFS
  welcome.demo.requests.short=Cette page contient des exemples de requêtes WMS et WFS requests que vous pouvez utiliser, examiner et modifier. C'est très utile pour comprendre comment discuter avec Geoserver et comment fabriquer ses propres requêtes.
  welcome.demo.documentation.title=Documentation
  welcome.demo.documentation.label=Page de documentation principale
  welcome.demo.documentation.short=C'est la page principale de la documentation pour Geoserver. C'est un WIKI. Vous pouvez librement ajouter de la documentation, tutoriels, ou toute information que vous estimez être utile aux autres utilisateurs.
  welcome.demo.wfst.title=Démonstration WFS-T
  welcome.demo.wfst.label=Page d'exemple WFS-T (transactionnel)
  welcome.demo.wfst.short=Cette page, instrumentée par MapBuilder, constitue un exemple d'utilisation de requêtes WFS-T (transactionnel). Elle vous permet d'insérer des points et des lignes dans les couches de la carte.
  
  welcome.demoRequest.label=Requêtes de démonstration
  welcome.demoRequest.title=Requêtes de démonstration
  welcome.demoRequest.short=Exemples de requêtes pour GeoServer (utilisant la TestServlet).  Sélectionner une requête depuis la liste déroulante, puis cliquer sur 'Changer'.  Cela affichera l'URL de la requête (ainsi que son corps si c'est une requête XML).  Cliquer sur 'Soumettre' pour envoyer la requête à Geoserver.
  welcome.demoRequest.words=(GeoServer) (Démonstration)
  
  # WELCOME resources
  text.welcome1=Le projet GeoServer est une implémentation Java (J2EE) complètement transactionnelle mettant en oeuvre les spécifications Web Feature Server de l'OpenGIS Consortium, et intégrant un Web Map Server.
  text.welcome2=GeoServer est un logiciel libre, disponible sous licence GPL 2.0.
  text.welcome3=Les utilisateurs qui souhaiteraient accéder et modifier leurs données géographiques au travers du réseau en utilisant une solution flexible et basée sur des standards industriels éprouvés, devraient jeter un oeil à GeoServer.
  text.welcome4=Le texte décrivant nos WFS et WMS peut être édité en utilisant l'hyperlien ci-dessus. Vous devez être connecté (hyperlien en haut à droite) pour modifier la configuration de GeoServer (y compris les informations de contact), ou pour administrer une application GeoServer.
  text.welcome5=La documentation de ce logiciel est disponible en ligne à l'adresse qui suit.  Le wiki GeoServer est utilisé pour les dernières mises à jour; faîtes partager votre expérience, astuces et conseils sur GeoServer dans cet espace.  Le gestionnaire des tâches vous permet d'envoyer vos requêtes et boggues.  N'hésiter pas à vous inscrire sur la liste des utilisateurs pour montrer votre support à GeoServer.
  
  text.welcome.mapbuilder=Démonstration avec Mapbuilder
  text.welcome.mapbuilder.detail= <a href='http://mapbuilder.sourceforge.net/'>Mapbuilder</a> est un client WMS, WFS-T écrit en JavaScript.  Vous pouvez utiliser Mapbuilder pour accéder/éditer les données disponibles au travers de GeoServer.
  
  # NEW features
  text.visitDemoPage=Visiter la page de <b><a href="../../../demo.do">démonstration</a></b> des exemples de GeoServer en action. Elle contient un <b><a href="../../../mapPreview.do"/>client Mapbuilder</a> intégré</b>.
  text.newFeatureLogo=<b><font color='red'>NOUVEAU!</font></b>
  text.newFeature1=Voir les entitées dessinées par WMS au travers du client MapBuilder.
  text.newFeature2=Voir les pages de démonstrations pour de jouer avec WMS et WFS.
  
  # ADMIN
  admin.label=Administration
  admin.title=Administration de GeoServer
  admin.short=Administration de l'application GeoServer
  admin.words=(Administration)
  
  admin.login.label=Connexion
  admin.login.title=Connexion
  admin.login.short=Connexion au GeoServer (utilisateur : admin et mot de passe : geoserver sont modifiables via Configuration->Serveur->Mot de passe).
  admin.login.words=(GeoServer) (Connexion)
  
  admin.freeLocks.label=Libération des verrous
  admin.freeLocks.title=Libération de tous les verrous sur les objets
  admin.freeLocks.short=Libération de tous les verrous sur les objets couramment posés par le serveur
  admin.freeLocks.words=(Verrou) (Libération) (Administration)
  
  admin.freeMemory.label=Libération de la mémoire
  admin.freeMemory.title=Libération de la mémoire
  admin.freeMemory.short=Libération de la mémoire via le ramasse-miettes
  admin.freeMemory.words=(Mémoire) (Libération) (Administration)
  
  # resources for Admin
  label.locks=Verrous
  label.connections=Connexions
  label.memory=Mémoire
  help.locks=Nombre de verrous sur entités
  help.connections=Nombre de connexions
  help.memory=Quantité de mémoire disponible
  text.admin=Cette page d'administration n'est qu'une ébauche, elle tente de montrer (et permet d'interagir avec) l'état en fonctionnement de l'application GeoServer.
  message.freeLocks=Verrous relâchés ({0} étaient posés)
  message.memory=Mémoire libérée ({0}K libérés)
  
  # CONFIG
  config.label=Configuration
  config.title=Configuration de GeoServer
  config.short=Configuration de l'application GeoServer
  config.words=(Configuration)
  
  # CONFIG Server
  config.server.label=Serveur
  config.server.title=Configuration du Serveur
  config.server.short=Configuration du Serveur et des informations sur le contact
  config.server.words=(Configuration) (Contact) (Serveur)
  
  # CONFIG Server Login
  config.server.login.label=Mot de passe
  config.server.login.title=Modification du mot de passe
  config.server.login.short=Édition du compte administrateur et de son mot de passe
  config.server.login.words=(GeoServer) (Compte) (Administration)
  
  # CONFIG validation
  config.validation.label=Contrôle
  config.validation.title=Configuration des contrôles
  config.validation.short=Configuration du processus GeoServer de validation
  config.validation.words=(Configuration) (Validation)
  
  config.validation.suite.label=Jeu de tests
  config.validation.suite.title=Configuration des jeux de tests
  config.validation.suite.short=Configuration des jeux de tests pour le processus de validation
  config.validation.suite.words=(Processus de validation) (Jeux de tests)
  
  config.validation.suite.doit.label=Lancer les jeux de tests
  config.validation.suite.doit.title=Lancement des jeux de tests
  config.validation.suite.doit.short=Exécution des jeux de tests
  config.validation.suite.doit.words=(Processus de validation) (Jeux de tests)
  
  config.validation.test.label=Tests
  config.validation.test.title=Configuration des tests de contrôle
  config.validation.test.short=Configuration des tests de contrôle
  config.validation.test.words=(Processus de validation) (Validation) (Test)
  
  config.validation.suite.editor.label=Éditeur
  config.validation.suite.editor.title=Éditeur des tests de contrôle
  config.validation.suite.editor.short=Éditeur des tests de contrôle
  config.validation.suite.editor.words=(Processus de validation) (Validation) (Test)
  
  config.validation.test.editor.label=Éditeur
  config.validation.test.editor.title=Éditeur de jeux de tests
  config.validation.test.editor.short=Éditeur de jeux de tests
  config.validation.test.editor.words=(Processus de validation) (Validation) (Test)
  
  config.validation.test.doit.label=Lancer un test
  config.validation.test.doit.title=Lancement d'un test
  config.validation.test.doit.short=Exécution d'un test
  config.validation.test.doit.words=(Processus de validation) (Test)
  
  config.validation.displayResults.label=Afficher les résultats
  config.validation.displayResults.title=Résultats du test
  config.validation.displayResults.short=Afficher les résultats du test
  config.validation.displayResults.words=(Processus de validation) (Validation) (Test) (Résultats)
  config.validation.displayResults.errors=Erreurs
  config.validation.displayResults.runCompleted=Exécution terminée correctement
  config.validation.displayResults.runNotCompleted=Exécution terminée en erreur
  config.validation.displayResults.stop=Arrêt
  
  # CONFIG wfs
  config.wfs.label=WFS
  config.wfs.title=Configuration du 'Web Feature Service'
  config.wfs.short=Configuration du 'Web Feature Service'
  config.wfs.words=(WFS) (Web Feature Server) (Configuration)
  
  config.wfs.content.label=Contenu
  config.wfs.content.title=Contenu du 'Web Feature Service'
  config.wfs.content.short=Configuration des fonctions du 'Web Feature Service'
  config.wfs.content.words=(WFS) (Web Feature Service) (Configuration)
  
  config.wfs.description.label=Description
  config.wfs.description.title=Description du 'Web Feature Service'
  config.wfs.description.short=Configuration des informations et métadonnées du 'Web Feature Service'
  config.wfs.description.words=(WFS) (Web Feature Service) (Configuration)
  
  error.wfs.onlineResource.required=Ressource en ligne est obligatoire.
  error.wfs.onlineResource.malformed=Ressource en ligne est mal libellée : {0}
  
  # CONFIG wms
  config.wms.label=WMS
  config.wms.title=Configuration du 'Web Map Service'
  config.wms.short=Configuration du 'Web Map Service'
  config.wms.words=(WMS) (Web Map Service) (Configuration)
  
  config.wms.content.label=Contenu
  config.wms.content.title=Contenu du 'Web Map Service'
  config.wms.content.short=Configuration des fonctions du 'Web Map Service'
  config.wms.content.words=(WMS) (Web Map Service) (Configuration)
  
  config.wms.description.label=Description
  config.wms.description.title=Description du 'Web Map Service'
  config.wms.description.short=Configuration des informations et métadonnées du 'Web Map Service'
  config.wms.description.words=(WMS) (Web Map Service) (Configuration)
  
  config.wms.rendering.label=Rendu cartographique
  config.wms.rendering.title=Moteur de rendu Web Map Service
  config.wms.rendering.short=Configuration du moteur de rendu Web Map Service
  config.wms.rendering.words=(WMS) (Web Map Service) (Rendu)
  
  error.wms.onlineResource.required=Ressource en ligne est obligatoire.
  error.wms.onlineResource.malformed=Ressource en ligne est mal libellée : {0}
  
  # DATA
  config.data.label=Données
  config.data.title=Configuration des données de GeoServer
  config.data.short=Configuration des informations et accès aux données de GeoServer
  config.data.words=(Configuration) (Données) Données spatiales)
  
  # DATA - config.dataStores
  config.data.store.label=Entrepôts
  config.data.store.title=Configuration des Entrepôts
  config.data.store.short=Configuration de l'accès aux données de l'application GeoServer
  config.data.store.words=(Configuration) (Base de données) (Shapefile) (Données spatiales) (Données)
  
  config.data.store.new.label=Nouveau
  config.data.store.new.title=Créer un nouvel entrepôt
  config.data.store.new.short=Créer une nouvelle source de données spatiales
  config.data.store.new.words=(Configuration) (Base de données) (Shapefile) (Données spatiales) (Données)
  
  config.data.store.editor.label=Éditer
  config.data.store.editor.title=Éditeur d'entrepôt
  config.data.store.editor.short=Éditer une source de données spatiales
  config.data.store.editor.words=(Configuration) (Base de données) (Shapefile) (Données spatiales) (Données)
  config.data.store.editor.requiredField=Champ obligatoire
  
  # DATA namespace
  config.data.namespace.label=Espaces de nommage
  config.data.namespace.title=Configuration des espaces de nommage
  config.data.namespace.short=Configurer l'espace de nommage GML
  config.data.namespace.words=(GML) (Espace de nommage) (préfixe)
  
  config.data.namespace.new.label=Nouveau
  config.data.namespace.new.title=Créer un nouvel espace de nommage
  config.data.namespace.new.short=Créer un nouvel espace de nommage GML
  config.data.namespace.new.words=(GML) (Espace de nommage) (préfixe)
  
  config.data.namespace.editor.label=Éditer
  config.data.namespace.editor.title=Éditeur d'espace de nommage
  config.data.namespace.editor.short=Éditer le préfixe et l'URI d'un espace de nommage GML
  config.data.namespace.editor.words=(GML) (Espace de nommage) (préfixe)
  
  text.namespace=Sélectionnez un espace de nommage dans la liste, un astérix indique l'espace par défaut.
  # DATA styles
  # -----------
  config.data.style.label=Styles
  config.data.style.title=Configuration des styles
  config.data.style.short=Définir les styles applicables
  config.data.style.words=(WMS) (Web Map Service) (Style)
  config.data.sldWizard.label=Créer un nouvel SLD
  
  config.data.style.new.label=Nouveau
  config.data.style.new.title=Nouveau Style
  config.data.style.new.short=Créer un nouveau style
  config.data.style.new.words=(WMS) (Web Map Service) (Style)
  
  config.data.style.editor.label=Éditer
  config.data.style.editor.title=Éditeur de style
  config.data.style.editor.short=Éditer les styles sélectionnés
  config.data.style.editor.words=(WMS) (Web Map Service) (Style)
  
  # Resources for styles
  label.styles=Styles
  label.styleID=StyleID
  help.styles=Liste des styles disponibles
  help.styleID=Identifiant utilisé pour les styles
  error.style.exists=StyleID {0} existe déjà
  error.file.required=Le nom du fichier est obligatoire
  # didier, 2004-04-20, not anymore used :
  error.file.nonexistent=Le fichier {0} n'existe pas
  # didier, 2004-04-20, FormFile :
  error.file.maxLengthExceeded=Taille maximale du document SLD dépassée ({0} octets autorisés)
  error.action.invalid=L'action '{0}' est invalide
  error.styleID.required=StyleID est obligatoire
  error.styleID.invalid=StyleID doit seulement contenir des caractères alphanumériques (A-Z, a-z, 0-9)
  error.style.sldFileExists=Un style portant le nom {0} existe déjà.  Renommer le fichier et essayer de nouveau.
  
  
  error.namespace.namespaceInUse=L'espace de nommage que vous essayez de supprimer est actuellement utilisé pour un entrepôt.  Supprimer l'entrepôt en premier.
  
  
  # DATA featureType
  # -----------
  config.data.type.label=Entités
  config.data.type.title=Configuration des entités
  config.data.type.short=Définir les entités rendues disponibles au travers de ce service
  config.data.type.words=(Entités) (Information localisée)
  
  config.data.type.new.label=Nouveau
  config.data.type.new.title=Créer une nouvelle entité
  config.data.type.new.short=Créer une nouvelle entité pour un entrepôt en ligne
  config.data.type.new.words=(Entités) (Information localisée)
  
  config.data.type.editor.label=Éditer
  config.data.type.editor.title=Éditeur d'entité
  config.data.type.editor.short=Éditer le fragment de schéma XML d'une entité
  config.data.type.editor.words=(Entités) (Information localisée)
  
  config.data.calculateBoundingBox.label=Générer
  config.data.calculateBoundingBox.title=Calculer l'emprise
  config.data.calculateBoundingBox.short=Calcule le rectangle englobant d'une entité
  config.data.calculateBoundingBox.words=(Entités) (Information localisée) (Emprise)
  
  error.data.nullBBOX=L'emprise de l'entité '{0}' est NULL.  Causes possibles : le jeu de données est soit vide, soit ne comporte aucun attribut géométrique.
  error.data.couldNotFindSRSAuthority=Impossible de trouver une autorié capable de comprendre votre SRS.  Veuillez vérifier que votre SRS soit correct - Vous pourriez être amener à consulter les modules de gestion des autorotiés de SRS pour vous assurer que votre SRS y est listé.<br> {0}<br> {1} 
  error.data.factoryException=Impossible de déterminer une transformation avec votre SRS - {0}
  error.data.transformException=Impossible d'effectuer la transformation de coordonnées
  error.style.noParse=Impossible d'analyser le style - {0}
  
  
  label.SRSHelp=Aide SRS
  
  #might want the other langages to point to a different url!
  label.SRSHelp.URL=http://docs.codehaus.org/display/GEOS/crshelp-fr
  
  label.SRSList=Liste SRS
  
  
  label.type.dataminx=X min des données
  label.type.dataminy=Y min des données
  label.type.datamaxx=X max des données
  label.type.datamaxy=Y max des données
  
  help.type.dataminx=Valeur minimale des abscisses exprimée dans le SRS de votre entrepôt de données
  help.type.dataminy=Valeur minimale des ordonnées exprimée dans le SRS de votre entrepôt de données
  help.type.datamaxx=Valeur maximale des abscisses exprimée dans le SRS de votre entrepôt de données
  help.type.datamaxy=Valeur maximale des ordonnées exprimée dans le SRS de votre entrepôt de données
  
  error.badsrc=Impossible de trouver la définition de votre SRS - {0}
  
  label.type.srswkt=WKT SRS
  help.type.srswkt=La définition encodée en format WKT de l'OGC de l'identifiant EPSG de votre SRS
  
  # Resources for FeatureType
  label.bbox=Emprise
  label.type.minx=Lon min
  label.type.miny=Lat min
  label.type.maxx=Lon max
  label.type.maxy=Lat max
  label.base=Accès au schéma
  label.schemaName=Nom du Schéma
  label.style=Style
  label.change=Modifier
  label.add=Ajouter
  label.nillable=valeur nulle autorisée
  label.min=min
  label.max=max
  help.type.name=Nom de l'entité
  help.type.style=Style par défaut utilisé pour représenter une entité
  help.type.srs=Système de référence de coordonnées de l'entité
  help.type.title=Titre de cette entité pour l'utilisateur final
  help.type.bbox=Emprise pour l'ensemble de l'entité
  help.type.minx=Valeur de la latitude minimale pour l'entité
  help.type.miny=Valeur de la longitude minimale pour l'entité
  help.type.maxx=Valeur de la latitude maximale pour l'entité
  help.type.maxy=Valeur de la longitude maximale pour l'entité
  help.type.base=Schéma XML (défini les attributs obligatoires ou -- pour les générer)
  help.type.schemaName=Nom de l'élément du schéma XML décrivant un type d'entité
  help.type.cachingEnabled=Informe les autres serveurs de stocker les cartes générées à partir de cette entité
  help.type.cacheMaxAge=Durée (en secondes) de rétention que les autres serveurs doivent appliquer pour les cartes générées pour cette entité.
  error.styleId.notFound=Style Id '{0}' non défini
  
  type.title.up=Déplacer ce type d'un cran vers le haut
  type.title.down=Déplacer ce type d'un cran vers le bas
  type.title.delete=Détruire ce type.
  label.jai=JAI est disponible
  
  help.jai=l'extension JAI (Java Advanced Imaging) est utilisée dans le calcul du rendu des images pour WMS
  
  label.jvm=Version de la JVM
  
  help.jvm=Indique quelle version de la JVM a été utilisée pour le serveur
  
  
  srsList.title=Liste des numéros de Systèmes de réfeacute;rences spatiales
  srsList.tableTitle=Définition EPSG (format WKT)
  
  mapPreview.title=Mini-carte de prévisualisation des entités activées.
  
  sldValididity.title=Votre fichier de style (SLD) n'est pas conforme au schéma SLD défini par l'OGC
  sldValiditity.help.text=Davantage d'information est disponible ici
  sldValiditity.help.url=http://docs.codehaus.org/display/GEOS/SLD+Validation
  
  help.citeConformanceHacks=Cocher si vous souhaitez un test CITE de conformité stricte.  Si vous n'utilisez pas les tests CITE, vous n'avez probablement pas besoin de cocher cette option.
  label.citeConformanceHacks=Test CITE de conformité stricte
  
  help.featureBounding=Cocher si vous souhaitez l'emprise de la géométrie de vos entités être automatiquement fournie par la requête GetFeatureCheck.  Cette option n'est pas vraiment nécessaire pour la plupart des clients et nécessite plus de bande passante ; il n'est donc pas recommandé de l'utiliser.
  label.featureBounding=Générer l'emprise géographique des entités
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/ApplicationResources_ja.properties
  
  Index: ApplicationResources_ja.properties
  ===================================================================
  # Jody Here I cannot make sense of this file!
  #
  # I have organized the remainder of this file by application subsection,
  # this should probably be done by splitting this file into separate files?
  #
  #       Sections (Similar comments are present in struts-config.xml)
  #       --------
  #        WELCOME
  # ADMINISTRATION
  #  CONFIGURATION
  #           DATA
  #
  # Within each section resources are organizing by page,
  # the page names agree forwards in the struts-config.xml
  #
  # Implementation Notes:
  # - 'key' from tiles-def is the same as page name, when someone explains to
  #   to me how to get at page name we can get rid of 'key'.
  # 
  # resource    value                          Example
  # --------    -----                          -------
  # key.label   display label for page links   Contact
  # key.title   page title & window title      Contact Information
  # key.short   short description              Contact information for webmaster
  # key.words   key words                      (Contact Information) (webmaster)
  #
  # We have a few additional resources grouping in the same section as the pages
  # that use them. These appear to be grouped by use.
  #
  # resource    value                           Example
  # --------    -----                           -------
  # label.*     Label for datum, or field       Prefix
  # help.*      Tooltip for datum, or field     Namespace prefix used for GML
  # message.*   Used for information messages   Spatial information loaded
  # error.*     Used for error messages         Namespace URI malformed: {0}
  # errors.*    As abvoe w/ Exception?
  #
  # If you need aditional resources, please just invent a convention
  # make a note of them above
  #
  # Here are my additional resource entries
  # resource    value                           Example
  # --------    -----                           -------
  # text.*(0-9) Long text passage               text.welcome1=GeoServer is ....
  #
  # This is not the best solution, I have not found a decent example of how to
  # internationalize page content. Apparently this is something JSP land is
  # working on - there are some JCP open on this issue.
  #
  
  # -- standard errors --
  errors.header=<UL>
  errors.prefix=<LI>
  errors.suffix=</LI>
  errors.footer=</UL>
  
  # -- validator --
  errors.invalid={0}\u306f\u7121\u52b9\u3067\u3059\u3002
  errors.maxlength={0}\u306f{1}\u6587\u5b57\u4ee5\u4e0a\u3067\u306f\u3044\u3051\u307e\u305b\u3093\u3002
  errors.minlength={0}\u306f{1}\u6587\u5b57\u4ee5\u4e0b\u3067\u306f\u3044\u3051\u307e\u305b\u3093\u3002
  errors.range={0}\u306f{1}\u304b\u3089{2}\u306e\u7bc4\u56f2\u306b\u3042\u308a\u307e\u305b\u3093\u3002
  errors.required={0}\u306f\u5fc5\u8981\u3067\u3059\u3002
  errors.byte={0}\u306f\u30d0\u30a4\u30c8\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  errors.date={0}\u306f\u65e5\u4ed8\u3067\u3042\u308a\u307e\u305b\u3093\u3002
  errors.double={0}\u306f\u500d\u7cbe\u5ea6(double)\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  errors.float={0}\u306f\u6d6e\u52d5\u5c0f\u6570\u70b9(float)\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  errors.integer={0}\u306f\u6574\u6570(integer\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  errors.long={0}\u306f\u9577\u6574\u6570(long)\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  errors.short={0}\u306f\u77ed\u6574\u6570(short)\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  errors.creditcard={0}\u306f\u6709\u52b9\u306a\u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9\u756a\u53f7\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
  errors.email={0}\u306f\u7121\u52b9\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3067\u3059\u3002
  
  # -- other --
  errors.cancel=\u64cd\u4f5c\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002
  errors.detail={0}
  errors.general=\u30d7\u30ed\u30bb\u30b9\u304c\u5b8c\u4e86\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u8a73\u7d30\u306f\u6b21\u3067\u3059\u3002
  errors.token=\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u5b8c\u6210\u3057\u307e\u305b\u3093\u3067\u3057\u305f. \u64cd\u4f5c\u304c\u9806\u756a\u3069\u304a\u308a\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
  
  label.validationConfig=\u691c\u8a3c\u8a2d\u5b9a
  label.wfsConfig=WFS\u8a2d\u5b9a
  label.wmsConfig=WMS\u8a2d\u5b9a
  label.dataConfig=\u30c7\u30fc\u30bf\u8a2d\u5b9a
  label.name=\u540d\u524d
  label.title=\u30bf\u30a4\u30c8\u30eb
  label.accessConstraints=\u30a2\u30af\u30bb\u30b9\u5236\u9650
  label.fees=\u30e9\u30a4\u30bb\u30f3\u30b9\u6599\u91d1\u7b49
  label.maintainer=\u4fdd\u5b88\u62c5\u5f53\u8005
  label.keywords=\u30ad\u30fc\u30ef\u30fc\u30c9
  label.abstract=\u8981\u7d04
  label.description=\u8aac\u660e
  label.contents=\u5185\u5bb9
  label.login=\u30ed\u30b0\u30a4\u30f3
  label.logout=\u30ed\u30b0\u30a2\u30a6\u30c8
  label.help=\u30d8\u30eb\u30d7
  label.actions=\u30a2\u30af\u30b7\u30e7\u30f3
  label.buttons=\u8a2d\u5b9a
  label.context=\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8
  label.toGeoserver=GeoServer\u3078
  label.saveXML=XML\u306e\u4fdd\u5b58
  label.loadXML=XML\u306e\u8aad\u8fbc
  label.onlineResource=\u30aa\u30f3\u30e9\u30a4\u30f3\u30fb\u30ea\u30bd\u30fc\u30b9
  label.featureTypes=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc(\u5730\u7269)\u306e\u30bf\u30a4\u30d7
  label.namespace=\u540d\u524d\u7a7a\u9593
  label.namespaceID=\u540d\u524d\u7a7a\u9593ID
  label.namespaces=\u540d\u524d\u7a7a\u9593
  label.new=\u65b0\u898f
  label.edit=\u7de8\u96c6
  label.delete=\u524a\u9664
  label.dataStoreID=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2ID
  label.enabled=\u6709\u52b9
  label.srsXmlStyle=XML\u306esrsName
  label.username=\u30e6\u30fc\u30b6\u30fc\u540d
  label.server=\u30b5\u30fc\u30d0\u30fc
  label.port=\u30dd\u30fc\u30c8
  label.password=\u30d1\u30b9\u30ef\u30fc\u30c9
  label.password.confirm=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u78ba\u8a8d
  label.URI=URI
  label.default=\u30c7\u30d5\u30a9\u30eb\u30c8
  label.prefix=\u30d7\u30ea\u30d5\u30c3\u30af\u30b9
  label.filename=\u30d5\u30a1\u30a4\u30eb\u540d
  label.SRS=SRS
  label.latLonBoundingBox=\u7d4c\u7def\u5ea6\u5883\u754c\u30dc\u30c3\u30af\u30b9
  label.connectionParameters=\u63a5\u7d9a\u30d1\u30e9\u30e1\u30fc\u30bf
  label.dataStoreDescription=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u306e\u8aac\u660e
  label.attributeTypes=\u5c5e\u6027\u30bf\u30a4\u30d7
  label.attributeTypeName=\u5c5e\u6027\u30bf\u30a4\u30d7\u540d
  label.isNillible=\u30cc\u30eb\u53ef
  label.isRef=isRef
  label.minOccurs=\u6700\u5c0f\u304c\u5b58\u5728
  label.maxOccurs=\u6700\u5927\u304c\u5b58\u5728
  label.type=\u30bf\u30a4\u30d7
  label.messages=\u30e1\u30c3\u30bb\u30fc\u30b8
  label.mainMenu=\u30e1\u30a4\u30f3\u30e1\u30cb\u30e5\u30fc
  label.status=\u30b9\u30c6\u30fc\u30bf\u30b9
  label.configStatus=\u8a2d\u5b9a\u30b9\u30c6\u30fc\u30bf\u30b9
  label.configChangedTrue=\u5909\u66f4\u6e08
  label.configChangedFalse=\u672a\u5909\u66f4
  label.geoServerStatus=GeoServer\u306e\u30b9\u30c6\u30fc\u30bf\u30b9
  label.geoServerChangedTrue=\u5909\u66f4\u6e08
  label.geoServerChangedFalse=\u672a\u5909\u66f4
  label.submit=\u5b9f\u884c
  label.reset=\u30ea\u30bb\u30c3\u30c8
  label.credits=\u30af\u30ec\u30b8\u30c3\u30c8
  label.credits.url=http://docs.codehaus.org/display/GEOS/Contributors
  label.newLoginAndPassword=\u65b0\u3057\u3044\u30ed\u30b0\u30a4\u30f3\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  label.wms.svgRenderer=SVG\u63cf\u753b
  label.wms.svgSimple=\u30b7\u30f3\u30d7\u30eb(\u65e9\u3044\u3001\u9650\u5b9a\u3055\u308c\u305f\u30b9\u30bf\u30a4\u30eb)
  label.wms.svgBatik=\u30d0\u30c1\u30c3\u30af(\u9045\u3044\u3001\u30d5\u30eb\u30b9\u30bf\u30a4\u30eb)
  label.wms.svgAntiAlias=\u30a2\u30f3\u30c1\u30fb\u30a2\u30ea\u30a2\u30b9
  
  help.name_service=\u30b5\u30fc\u30d3\u30b9\u540d\u3067\u3059\u3002
  help.title_service=\u30b5\u30fc\u30d3\u30b9\u306e\u30bf\u30a4\u30c8\u30eb\u3067\u3059\u3002
  help.accessConstraints_service=\u30b5\u30fc\u30d3\u30b9\u306e\u5236\u7d04
  help.fees_service=\u30e9\u30a4\u30bb\u30f3\u30b9\u6599\u91d1\u7b49\u304c\u5fc5\u8981\u3067\u3059\u3002
  help.maintainer_service=\u4fdd\u5b88\u5bfe\u8c61\u306e\u540d\u524d
  help.keywords_service=\u30b5\u30fc\u30d3\u30b9\u306b\u95a2\u3059\u308b\u30ad\u30fc\u30ef\u30fc\u30c9\u306e\u30ea\u30b9\u30c8
  help.dataFeatureTypeKeywords_service=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u30ad\u30fc\u30ef\u30fc\u30c9
  help.abstract_service=\u30b5\u30fc\u30d3\u30b9\u306b\u3064\u3044\u3066\u306e\u77ed\u3044\u8981\u7d04
  help.onlineResource_service=Web\u30b5\u30fc\u30d3\u30b9\u306e\u30aa\u30f3\u30e9\u30a4\u30f3\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9URL
  help.serviceType_service=\u30b5\u30fc\u30d3\u30b9\u30bf\u30a4\u30d7
  
  help.dataStore_id=\u30e6\u30cb\u30fc\u30af\u306a\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u8b58\u5225\u5b50
  help.dataStore_enabled=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u306b\u30c1\u30a7\u30c3\u30af\u3055\u308c\u307e\u3059\u3002
  help.dataStore_nameSpace=\u3053\u306e\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u306b\u95a2\u9023\u3059\u308b\u540d\u524d\u7a7a\u9593\u306e\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9
  help.dataStore_description=\u3053\u306e\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u306b\u3064\u3044\u3066\u306e\u77ed\u3044\u8aac\u660e
  help.dataStore_server=\u63a5\u7d9a\u3059\u308b\u30b5\u30fc\u30d0\u30fc\u540d
  help.dataStore_port=\u30b5\u30fc\u30d0\u30fc\u306e\u63a5\u7d9a\u30dd\u30fc\u30c8
  help.dataStore_username=\u30b5\u30fc\u30d0\u30fc\u306b\u30ed\u30b0\u30a4\u30f3\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u540d
  help.dataStore_password=\u30b5\u30fc\u30d0\u30fc\u306b\u30ed\u30b0\u30a4\u30f3\u3059\u308b\u30d1\u30b9\u30ef\u30fc\u30c9
  
  help.namespace.default=\u4f55\u3082\u6307\u5b9a\u304c\u306a\u3044\u6642\u306b\u3053\u306e\u540d\u524d\u7a7a\u9593\u3092\u4eee\u5b9a\u3059\u308b\u306a\u3089\u3070\u3001\u30c1\u30a7\u30c3\u30af\u3055\u308c\u307e\u3059\u3002
  help.namespace.prefix=\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u306fGML\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u4e2d\u3067\u3053\u306e\u540d\u524d\u7a7a\u9593\u3092\u8b58\u5225\u3059\u308b\u306e\u306b\u4f7f\u308f\u308c\u307e\u3059\u3002
  help.namespace.uri=\u540d\u524d\u7a7a\u9593\u306e\u5b9a\u7fa9\u3092\u8a18\u8ff0\u3057\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306eURI
  
  
  help.dataFeatureTypeAbstract_service=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u8aac\u660e
  
  help.dataFeatureTypeKeywords=BLAH
  help.dataFeatureTypeAbstract=BLAH
  
  error.name.required=\u540d\u524d\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.title.required=\u30bf\u30a4\u30c8\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.fees.required=\u30e9\u30a4\u30bb\u30f3\u30b9\u6599\u91d1\u7b49\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.maintainer.required=\u4fdd\u5b88\u62c5\u5f53\u8005\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.keywords.required=\u30ad\u30fc\u30ef\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.abstract.required=\u8981\u7d04\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.accessConstraints.required=\u30a2\u30af\u30bb\u30b9\u5236\u9650\u304c\u5fc5\u8981\u3067\u3059\u3002
  
  error.dataStoreId.invalid=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2ID '{0}'\u306f\u82f1\u6570\u5b57\u306b\u5236\u9650\u3055\u308c\u3066\u307e\u3059\u3002(A-Z, a-z, 0-9)
  error.dataStoreId.required=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2ID\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.dataStoreFactory.invalid=\u7121\u52b9\u306a\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u30fb\u30d5\u30a1\u30af\u30c8\u30ea\u3067\u3059\u3002(\u30ea\u30b9\u30c8\u304b\u3089\u4e00\u3064\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044)
  error.dataStoreEditor.param.required={0}\u306f\u5fc5\u9808\u30d1\u30e9\u30e1\u30fc\u30bf\u3067\u3059\u3002
  error.dataStoreEditor.param.parse={0}\u306f\u59a5\u5f53\u306a{1}: {2}\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  error.datastoreEditor.validation=\u4e0e\u3048\u3089\u308c\u305f\u30d1\u30e9\u30e1\u30bf\u3092\u51e6\u7406\u3067\u304d\u307e\u305b\u3093\u3002
  errors.buttonAction.invalid=\u7121\u52b9\u306a\u30dc\u30bf\u30f3\u304c\u62bc\u3055\u308c\u307e\u3057\u305f\u3002
  errors.factory.invalid=\u7121\u52b9\u306a\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2ID\u304c\u9078\u629e\u3055\u308c\u307e\u3057\u305f\u3002
  error.dataStoreEditor.param.missing={1}\u306b\u5bfe\u3057\u3066{0}\u304c\u898b\u3064\u3051\u3089\u308c\u307e\u305b\u3093\u3002
  error.exception={0}
  error.invalidConnectionParams=\u63a5\u7d9a\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u7121\u52b9\u3067\u3059\u3002
  error.cannotProcessConnectionParams=\u4e0e\u3048\u3089\u308c\u305f\u30d1\u30e9\u30e1\u30fc\u30bf\u3067\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3002
  error.badCharSet=\u4e0e\u3048\u3089\u308c\u305f\u6587\u5b57\u30bb\u30c3\u30c8\u304c\u7121\u52b9\u3067\u3059 - \u540d\u524d\u306fIANA\u30ad\u30e3\u30e9\u30af\u30bf\u30bb\u30c3\u30c8\u30fb\u30ec\u30b8\u30b9\u30c8\u30ea\u306b\u8a18\u8ff0\u3055\u308c\u305f\u898f\u7d04\u306b\u5f93\u308f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  error.cannotRunValidation=\u59a5\u5f53\u6027\u691c\u8a3c\u304c\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002: {0}
  error.password.mismatch=\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u78ba\u8a8d\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002\u518d\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  error.prefix.invalid=\u540d\u524d\u7a7a\u9593\u306e\u30d7\u30ec\u30d5\u30c3\u30af\u30b9 '(0}' \u306f\u82f1\u6570\u5b57\u306e\u307f\u3067\u3059\u3002(A-Z, a-z, 0-9)
  error.prefix.required=\u540d\u524d\u7a7a\u9593\u306e\u30d7\u30ec\u30d5\u30c3\u30af\u30b9\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.uri.malformed=\u540d\u524d\u7a7a\u9593\u306eURI\u304c\u5947\u5999\u3067\u3059\u3002: {0}
  error.uri.required=Nam\u540d\u524d\u7a7a\u9593\u306eURI\u304c\u5fc5\u8981\u3067\u3059\u3002
  
  error.style.required=\u9078\u629e\u3055\u308c\u305f\u30b9\u30bf\u30a4\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.style.invalid=\u9078\u629e\u3055\u308c\u305f\u30b9\u30bf\u30a4\u30eb\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
  
  error.noWritePermission={0}\u306b\u66f8\u304d\u8fbc\u307f\u8a31\u53ef\u304c\u3042\u308a\u307e\u305b\u3093\u3002
  
  welcome.heading=Welcome\u3000\u3088\u3046\u3053\u305d
  
  geoserver.logo=GeoServer
  
  label.defaultTitle=GeoServer
  label.featureTypeName=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u540d
  label.moveUp=\u4e0b\u306b\u79fb\u52d5
  label.moveDown=\u4e0a\u306b\u79fb\u52d5
  label.testSuite=\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8
  label.testName=\u30c6\u30b9\u30c8\u540d
  label.testDescription=\u30c6\u30b9\u30c8\u306e\u8aac\u660e
  label.newName=\u65b0\u3057\u3044\u540d\u524d
  label.currentTestSuite=\u73fe\u5728\u306e\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8
  label.plugInType=\u30d7\u30e9\u30b0\u30a4\u30f3\u30fb\u30bf\u30a4\u30d7
  label.plugInDescription=\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u8aac\u660e
  label.maxFeatures=\u6700\u5927\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u6570
  label.verbose=\u30d0\u30fc\u30dc\u30fc\u30ba
  label.verboseExceptions=\u4f8b\u5916\u306e\u30d0\u30fc\u30dc\u30fc\u30ba
  label.numDecimals=\u5c0f\u6570\u70b9\u4ee5\u4e0b\u306e\u6841\u6570
  label.charset=\u30ad\u30e3\u30e9\u30af\u30bf\u30bb\u30c3\u30c8
  label.baseURL=\u30d9\u30fc\u30b9URL
  label.schemaBaseURL=\u30b9\u30ad\u30fc\u30de\u30fb\u30d9\u30fc\u30b9\u306eURL
  label.loggingLevel=\u30ed\u30ae\u30f3\u30b0\u30fb\u30ec\u30d9\u30eb
  label.loggingToDisk=\u30c7\u30a3\u30b9\u30af\u3078\u30ed\u30b0\u3092\u66f8\u8fbc\u307f\u307e\u3059
  label.logLocation=\u30ed\u30b0\u306e\u4fdd\u5b58\u5834\u6240
  label.contactInformation=\u9023\u7d61\u5148
  label.contactPerson=\u62c5\u5f53\u8005
  label.contactOrganization=\u7d44\u7e54
  label.contactPosition=\u5f79\u8077\u540d
  label.addressType=\u4f4f\u6240\u30bf\u30a4\u30d7
  label.address=\u4f4f\u6240
  label.addressCity=\u5e02\u533a\u753a\u6751
  label.addressState=\u90fd\u9053\u5e9c\u770c
  label.addressPostalCode=\u90f5\u4fbf\u756a\u53f7
  label.addressCountry=\u56fd
  label.contactVoice=\u96fb\u8a71\u756a\u53f7
  label.contactFacsimile=\u30d5\u30a1\u30c3\u30af\u30b9\u756a\u53f7
  label.contactEmail=E\u30e1\u30fc\u30eb
  label.wfs=Web\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30fb\u30b5\u30fc\u30d0
  label.wms=Web\u30de\u30c3\u30d7\u30fb\u30b5\u30fc\u30d0\u30fc
  label.data=\u30c7\u30fc\u30bf
  label.wfsStatus=WFS \u30b9\u30c6\u30fc\u30bf\u30b9
  label.wmsStatus=WMS \u30b9\u30c6\u30fc\u30bf\u30b9
  label.dataStatus=Data \u30b9\u30c6\u30fc\u30bf\u30b9
  label.apply=\u9069\u7528
  label.save=\u4fdd\u5b58
  label.load=\u8aad\u8fbc
  label.calculateBoundingBox=\u5883\u754c\u77e9\u5f62\u306e\u8a08\u7b97
  label.wfsDescription=WFS\u306e\u8aac\u660e
  label.wfsContent=WFS\u30b3\u30f3\u30c6\u30f3\u30c4
  label.wmsDescription=WMS\u306e\u8aac\u660e
  label.wmsContent=WMS\u30b3\u30f3\u30c6\u30f3\u30c4
  label.wmsRendering=WMS\u63cf\u753b
  label.dataStores=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2
  label.createNewDataStore=\u65b0\u3057\u3044\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002
  label.createNewNamespace=\u65b0\u3057\u3044\u540d\u524d\u7a7a\u9593\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002
  label.serviceLevel=\u30b5\u30fc\u30d3\u30b9\u30ec\u30d9\u30eb
  label.serviceLevel.basic=\u30d9\u30fc\u30b7\u30c3\u30af
  label.serviceLevel.transactional=\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3
  label.serviceLevel.complete=\u5b8c\u5168
  label.validation=\u59a5\u5f53\u6027\u691c\u8a3c
  label.contact=\u9023\u7d61\u5148
  label.none=\u306a\u3057
  label.phoneNumber=\u96fb\u8a71\u756a\u53f7
  label.faxNumber=\u30d5\u30a1\u30c3\u30af\u30b9\u756a\u53f7
  label.email=E\u30e1\u30fc\u30eb
  label.info=\u7a93\u53e3
  
  help.enabled=\u30b5\u30fc\u30d3\u30b9\u306e\u6709\u52b9/\u7121\u52b9
  help.srsXmlStyle=\u3082\u3057\u8fd4\u3055\u308c\u305fGML\u306esrsName\u304c(\u4ed5\u69d8\u306e\u3088\u3046\u306b)xml\u30b9\u30bf\u30a4\u30eb\u3067\u3042\u308b\u306a\u3089\u3070\u30c1\u30a7\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002EPSG\u3067\u3042\u308b\u306a\u3089\u30c1\u30a7\u30c3\u30af\u3092\u5916\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  help.featureList=\u30b5\u30fc\u30d3\u30b9\u306e\u4e2d\u3067\u500b\u3005\u306e\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u3092\u6709\u52b9\u3001\u7121\u52b9\u306b\u3059\u308b\u306e\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002
  help.global.maxFeatures=GetFeature\u306b\u3088\u3063\u3066\u8fd4\u3055\u308c\u305f\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u306e\u6700\u5927\u6570\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  help.global.verbose=XML\u5fdc\u7b54\u3067\u6539\u884c\u3068\u30a4\u30f3\u30c7\u30f3\u30c8\u304c\u8fd4\u3055\u308c\u308b\u304b\u3069\u3046\u304b\u306b\u95a2\u4fc2\u306a\u304f\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  help.global.verboseExceptions=\u30e6\u30fc\u30b6\u306b\u8fd4\u3055\u308c\u305f\u30b5\u30fc\u30d3\u30b9\u4f8b\u5916\u304c\u3001\u30d5\u30eb\u306bjava\u30b9\u30bf\u30c3\u30af\u30c8\u30ec\u30fc\u30b9\u3092\u6301\u3063\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u306b\u95a2\u4fc2\u306a\u304f\u30bb\u30c3\u30c8\u3057\u307e\u3059\u3002
  help.global.numDecimals=\u5341\u9032\u306e\u6841\u6570\u306fGetFeature\u306e\u5fdc\u7b54\u3067\u8fd4\u3055\u308c\u307e\u3059\u3002
  help.global.charset=\u30af\u30ed\u30fc\u30d0\u30eb\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u30bb\u30c3\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  help.global.baseURL=\u30b5\u30fc\u30d6\u30ec\u30c3\u30c8\u3092\u5b9f\u884c\u3059\u308b\u30d9\u30fc\u30b9URL
  help.global.schemaBaseURL=WFS\u30b9\u30ad\u30fc\u30de\u306e\u4f4d\u7f6e\u306b\u5bfe\u3059\u308b\u30d9\u30fc\u30b9URL\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002
  help.global.loggingLevel=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30ed\u30ae\u30f3\u30b0\u30ec\u30d9\u30eb\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002
  help.global.loggingToDisk=\u30c7\u30a3\u30b9\u30af\u3078\u306e\u30ed\u30ae\u30f3\u30b0\u3092\u6709\u52b9/\u7121\u52b9\u306b\u3057\u307e\u3059\u3002
  help.global.logLocation=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304b\u30d5\u30a1\u30a4\u30eb\u306e\u30ed\u30b0\u4f4d\u7f6e\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u7a7a\u767d\u306e\u72b6\u614b\u306e\u307e\u307e\u3060\u3068\u30ed\u30ae\u30f3\u30b0\u306f\u7121\u52b9\u3068\u306a\u308a\u307e\u3059\u3002
  
  help.global.contactPerson=\u9023\u7d61\u5148\u306e\u62c5\u5f53\u8005\u540d;
  help.global.contactOrganization=\u9023\u7d61\u304c\u63d0\u643a\u5148\u3067\u3042\u308b\u7d44\u7e54\u306e\u540d\u524d
  help.global.contactPosition=\u7d44\u7e54\u5185\u306e\u9023\u7d61\u62c5\u5f53\u8005\u306e\u5f79\u8077
  help.global.addressType=\u6307\u5b9a\u3055\u308c\u305f\u30a2\u30c9\u30ec\u30b9\u306e\u30bf\u30a4\u30d7\u3001\u3059\u306a\u308f\u3061\u90f5\u4fbf\u306e\u3088\u3046\u306a
  help.global.address=\u5b9f\u969b\u306e\u30b9\u30c8\u30ea\u30fc\u30c8\u30fb\u30a2\u30c9\u30ec\u30b9
  help.global.addressCity=\u5e02
  help.global.addressState=\u5dde
  help.global.addressPostalCode=\u90f5\u4fbf\u756a\u53f7
  help.global.addressCountry=\u56fd
  help.global.contactVoice=\u9023\u7d61\u5148\u96fb\u8a71\u756a\u53f7
  help.global.contactFacsimile=\u30d5\u30a1\u30c3\u30af\u30b9\u756a\u53f7
  help.global.contactEmail=e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
  
  help.serviceLevel=WFS\u304c\u63d0\u4f9b\u3059\u308b\u30b5\u30fc\u30d3\u30b9\u30ec\u30d9\u30eb\u306e\u5b9a\u7fa9
  
  help.wms.svgRenderer=WMS SVG\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u30b5\u30fc\u30d3\u30b9\u3059\u308b\u6642\u306b\u4f7f\u7528\u3059\u308bsvg \u63cf\u753b\u65b9\u6cd5\u3092\u9078\u629e\u3057\u307e\u3059\u3002
  
  tab.description=\u8aac\u660e
  tab.content=\u30b3\u30f3\u30c6\u30f3\u30c4
  tab.dataStores=\u30c7\u30fc\u30bf\u30fb\u30b9\u30c8\u30a2
  tab.namespaces=\u540d\u524d\u7a7a\u9593
  tab.styles=\u30b9\u30bf\u30a4\u30eb
  tab.featureTypes=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30fb\u30bf\u30a4\u30d7
  
  error.login.invalidCombo=\u7121\u52b9\u306a\u30e6\u30fc\u30b6\u30fc\u540d\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u7d44\u5408\u305b\u3067\u3059\u3002
  error.login.required=\u3053\u306e\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306b\u306f\u30ed\u30b0\u30a4\u30f3\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  
  error.latLonBoundingBox.required=\u7d4c\u7def\u5ea6\u5883\u754c\u4e0a\u306e\u5168\u30a8\u30ec\u30e1\u30f3\u30c8\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.latLonBoundingBox.invalid=\u7121\u52b9\u306a\u7d4c\u7def\u5ea6\u5883\u754c\u3067\u3059\u3002: {0}
  error.serviceLevel.invalid=\u7121\u52b9\u306a\u30b5\u30fc\u30d3\u30b9\u30ec\u30d9\u30eb\u304c\u9078\u629e\u3055\u308c\u307e\u3057\u305f\u3002
  
  link.geoserver=http://geoserver.sourceforge.net/
  link.license=http://geoserver.sourceforge.net/documentation/developer/license.htm
  
  # --- changed ----
  label.geoServerConfiguration=GeoServer \u8a2d\u5b9a
  message.login.hint=(\u30c7\u30d5\u30a9\u30eb\u30c8\u30e6\u30fc\u30b6\u30fc\u306f'admin'\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306f'geoserver'\u3067\u3059)
  message.noContact=\u9023\u7d61\u5148\u306f\u63d0\u4f9b\u3055\u308c\u3066\u304a\u308a\u307e\u305b\u3093\u3002
  message.notLoaded=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30ea\u30bd\u30fc\u30b9\u304c\u30ed\u30fc\u30c9\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002--\u30b5\u30fc\u30d6\u30ec\u30c3\u30c8\u30b3\u30f3\u30c6\u30ca\u30fb\u30ed\u30b0\u306e\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30c1\u30a7\u30c3\u30af\u3057\u306a\u3055\u3044\u3002
  message.noTitle=Metacat Spatial - Geoserver
  message.dataOkay=\u30c7\u30fc\u30bf\u304c\u969c\u5bb3\u306a\u304f\u8aad\u8fbc\u307e\u308c\u307e\u3057\u305f\u3002
  
  
  # WELCOME
  welcome.label=Welcome
  welcome.title=Welcome GeoServer
  welcome.short=\u3088\u3046\u3053\u305d\u3000GeoServer 1.4.0\u3078\u3000\u3000GeoServer\u306e\u3054\u5229\u7528\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3059!
  welcome.words=(GeoServer) (GIS) (Geographic Information Systems) (WFS)
  
  welcome.contact.label=\u9023\u7d61\u5148
  welcome.contact.title=\u9023\u7d61\u5148
  welcome.contact.short=\u30b5\u30a4\u30c8\u7ba1\u7406\u8005\u306e\u9023\u7d61\u5148\u3067\u3059
  welcome.contact.words=(Web\u30de\u30b9\u30bf\u30fc) (\u9023\u7d61\u5148) 
  
  welcome.demo.label=\u30c7\u30e2
  welcome.demo.title=\u30c7\u30e2
  welcome.demo.short=Geoserver\u306e\u30c7\u30e2\u30da\u30fc\u30b8\u3000Geoserver\u3068\u30c4\u30fc\u30eb\u306e\u4f7f\u7528\u65b9\u6cd5\u306f\u4f8b\u3092\u3054\u89a7\u4e0b\u3055\u3044\u3002
  welcome.demo.words=(GeoServer) (\u30c7\u30e2)
  welcome.demo.wmsexample.title=WMS\u3000\u4e8b\u4f8b
  welcome.demo.wmsexample.label=WMS\u3000\u30cb\u30e5\u30fc\u30e8\u30fc\u30af\u3092\u898b\u308b
  welcome.demo.wmsexample.short=\u30cb\u30e5\u30fc\u30e8\u30fc\u30af\u30fb\u30de\u30f3\u30cf\u30c3\u30bf\u30f3\u306eWMS\u8868\u793a\u3067\u3059\u3002\u30d1\u30f3\u3001\u30ba\u30fc\u30e0\u304c\u3067\u304d\u3066\u3001\u30a4\u30e1\u30fc\u30b8\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u62e1\u5927\u753b\u50cf\u304c\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7\u3057\u307e\u3059\u3002\u3053\u308c\u306fJavascript\u3067\u66f8\u304b\u308c\u3066\u304a\u308a\u3001\u30b3\u30fc\u30c9\u306f[geoserver]/data/demo/popup_map\u306e\u4e0b\u3067\u898b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002
  welcome.demo.mappreview.title=\u5730\u56f3\u30d7\u30ec\u30d3\u30e5\u30fc
  welcome.demo.mappreview.label=\u6709\u52b9\u306a\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306eWMS\u30d7\u30ec\u30d3\u30e5\u30fc
  welcome.demo.mappreview.short=\u5730\u56f3\u30d7\u30ec\u30d3\u30e5\u30fc\u30da\u30fc\u30b8\u30da\u30fc\u30b8\u306f\u3001\u6709\u52b9\u306a\u5404\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u3092\u8868\u793a\u3057\u3001MapBuilder\u306eWMS\u30d5\u30a9\u30fc\u30e0\u3067\u898b\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u30ea\u30f3\u30af\u3092\u4e0e\u3048\u307e\u3059\u3002
  welcome.demo.requests.title=\u30b5\u30f3\u30d7\u30eb\u30fb\u30ea\u30af\u30a8\u30b9\u30c8
  welcome.demo.requests.label=Example WMS\u3068WFS\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u4f8b
  welcome.demo.requests.short=\u3053\u306e\u30da\u30fc\u30b8\u306f\u3001\u4f7f\u7528\u3084\u8a66\u9a13\u3001\u5909\u66f4\u304c\u3067\u304d\u308bWMS\u3068WFS\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u4f8b\u304c\u3042\u308a\u307e\u3059\u3002Geoserver\u3068\u306e\u5bfe\u8a71\u65b9\u6cd5\u3084\u3001\u81ea\u5206\u3067\u30ab\u30b9\u30bf\u30e0\u3084\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u4f5c\u308b\u65b9\u6cd5\u3092\u898b\u308b\u306b\u306f\u5927\u5909\u5f79\u306b\u7acb\u3061\u307e\u3059\u3002
  welcome.demo.documentation.title=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3
  welcome.demo.documentation.label=\u30e1\u30a4\u30f3\u30fb\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30da\u30fc\u30b8
  welcome.demo.documentation.short=\u3053\u308c\u304cGeoserver\u306e\u30e1\u30a4\u30f3\u30fb\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30da\u30fc\u30b8\u3067\u3059\u3002\u305d\u308c\u306f \u3001\u3042\u3089\u3086\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3084\u30a6\u30a9\u30fc\u30af\u30b9\u30eb\u30fc\u3001\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3001\u307e\u305f\u306f\u4ed6\u306e\u30e6\u30fc\u30b6\u306e\u305f\u3081\u306b\u306a\u308b\u3068\u601d\u308f\u308c\u308b\u60c5\u5831\u7b49\u3092\u52a0\u3048\u308b\u3053\u3068\u304c\u81ea\u7531\u306aWIKI\u3067\u3059\u3002
  welcome.demo.wfst.title=WFS-T demo
  welcome.demo.wfst.label=Example WFS-T (transactional) page
  welcome.demo.wfst.short=This page, powered by MapBuilder, is an example of WFS-T (transactional) requests that you can use. It allows you to insert points and lines into the various layers of the map.
  
  welcome.demoRequest.label=\u30c7\u30e2\u30fb\u30ea\u30af\u30a8\u30b9\u30c8
  welcome.demoRequest.title=\u30c7\u30e2\u30fb\u30ea\u30af\u30a8\u30b9\u30c8
  welcome.demoRequest.short=(\u30c6\u30b9\u30c8Servlet\u3092\u4f7f\u3063\u305f)GeoServer\u3078\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u4f8b\u3000\u30c9\u30ed\u30c3\u30d7\u30c0\u30a6\u30f3\u30fb\u30ea\u30b9\u30c8\u304b\u3089\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9078\u3073\u3001'\u5909\u66f4'\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30ea\u30af\u30a8\u30b9\u30c8URL(\u3068xml\u30ea\u30af\u30a8\u30b9\u30c8\u306a\u3089\u3070body)\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002GeoServer\u3078\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u308b\u305f\u3081\u306b\u5b9f\u884c\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u4e0b\u3055\u3044\u3002
  welcome.demoRequest.words=(GeoServer) (\u30c7\u30e2)
  
  # WELCOME resources
  text.welcome1=GeoServer project\u306f\u3001OpenGIS Consortium\u306eWeb Feature Server\u4ed5\u69d8\u3092Web Map Server\u3068\u7d71\u5408\u3057\u3066\u30d5\u30eb\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306eJava (J2EE)\u3067\u5b9f\u88c5\u3059\u308b\u3082\u306e\u3067\u3059\u3002
  text.welcome2=GeoServer\u306fGPL 2.0\u30e9\u30a4\u30bb\u30f3\u30b9\u306e\u4e0b\u3067\u5229\u7528\u53ef\u80fd\u306a\u30d5\u30ea\u30fc\u30bd\u30d5\u30c8\u30a6\u30a8\u30a2\u3067\u3059\u3002
  text.welcome3=\u67d4\u8edf\u3067\u304b\u3064\u7523\u696d\u7684\u306b\u63a8\u5968\u3055\u308c\u305f\u6a19\u6e96\u3092\u4f7f\u3063\u3066\u3001\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u4e0a\u3067\u81ea\u8eab\u306e\u5730\u7406\u7684\u30c7\u30fc\u30bf\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3066\u66f4\u65b0\u3057\u305f\u3044\u30e6\u30fc\u30b6\u30fc\u306f\u3001GeoServer\u3092\u898b\u308b\u3079\u304d\u3067\u3059\u3002
  text.welcome4=WFS\u3068WMS\u306e\u8aac\u660e\u6587\u306f\u4e0a\u306e\u30ea\u30f3\u30af\u306b\u3042\u308b\u8a2d\u5b9a\u3092\u4f7f\u3063\u3066\u7de8\u96c6\u3055\u308c\u307e\u3059\u3002GeoServer\u306e\u8a2d\u5b9a(\u9023\u7d61\u5148\u3092\u542b\u3080\uff09\u3084\u3001\u5b9f\u884c\u3057\u3066\u3044\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u7ba1\u7406\u3092\u5909\u66f4\u3059\u308b\u306b\u306f\u3001\u30ed\u30b0\u30a4\u30f3(\u30ea\u30f3\u30af\u30c8\u30c3\u30d7\u306e\u53f3\u5074)\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  text.welcome5=\u3053\u306e\u30ea\u30ea\u30fc\u30b9\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u3001\u4ee5\u4e0b\u306e\u30ea\u30f3\u30af\u3067\u30aa\u30f3\u30e9\u30a4\u30f3\u5229\u7528\u3067\u304d\u307e\u3059\u3002GeoServer wiki\u306f\u6700\u65b0\u7248\u306e\u305f\u3081\u306b\u4f7f\u308f\u308c\u307e\u3059\u3002; GeoServer\u3067\u3042\u306a\u305f\u306e\u7d4c\u9a13\u3084\u30d2\u30f3\u30c8\u3001\u3053\u3064\u3092\u5171\u6709\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30bf\u30b9\u30af\u30c8\u30e9\u30c3\u30ab\u30fc\u306f\u6a5f\u80fd\u8981\u6c42\u3068\u30d0\u30b0\u3092\u5831\u544a\u3059\u308b\u6240\u3067\u3059\u3002\u307e\u305f\u3000\u304a\u624b\u6570\u3067\u3059\u304cGeoServer\u3078\u306e\u652f\u63f4\u3092\u793a\u3059\u305f\u3081\u306b\u3001\u30e6\u30fc\u30b6\u30fc\u30de\u30c3\u30d7\u306b\u3042\u306a\u305f\u3092\u52a0\u3048\u3066\u304f\u3060\u3055\u3044\u3002
  
  text.welcome.mapbuilder=Mapbuilder\u30c7\u30e2
  text.welcome.mapbuilder.detail= <a href='http://mapbuilder.sourceforge.net/'>Mapbuilder</a> \u306fjava-script\u306b\u3088\u308bWFS-T\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3067\u3059\u3002\u3053\u306eGeoserver\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3044\u308b\u30c7\u30fc\u30bf\u3092\u7de8\u96c6\u3059\u308b\u306b\u306f\u3001Mapbuilder\u304c\u5229\u7528\u3067\u304d\u307e\u3059\u3002
  
  # NEW features
  text.visitDemoPage=Visit the <b><a href="../../../demo.do">demo</a></b> page for examples of GeoServer in action. This includes an integrated <b><a href="../../../mapPreview.do"/>Mapbuilder client</a></b>.
  text.newFeatureLogo=<b><font color='red'>NEW!</font></b>
  text.newFeature1=\u65b0\u3057\u3044MapBuilder GUI\u3067WMS\u30ec\u30a4\u30e4\u30fc\u3092\u3054\u3089\u3093\u304f\u3060\u3055\u3044\u3002
  text.newFeature2=\u30c7\u30e2\u30da\u30fc\u30b8\u3067\u3059\u3070\u3089\u3057\u3044WMS\u3068WFS\u306e\u30c7\u30e2\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  
  # ADMIN
  admin.label=\u7ba1\u7406
  admin.title=GeoServer\u306e\u7ba1\u7406
  admin.short=\u5b9f\u884c\u4e2d\u306eGeoServer\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u7ba1\u7406\u3057\u307e\u3059\u3002
  admin.words=(\u7ba1\u7406)
  
  admin.login.label=\u30ed\u30b0\u30a4\u30f3
  admin.login.title=\u30ed\u30b0\u30a4\u30f3
  admin.login.short=GeoServer\u306b\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044\u3002 (\u30c7\u30d5\u30a9\u30eb\u30c8\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u540d\uff1aadmin\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\uff1ageoserver\u3067\u3059\u3002 Config->Server->Password\u304b\u3089\u5909\u66f4\u3067\u304d\u307e\u3059\u3002)
  admin.login.words=(GeoServer) (\u30ed\u30b0\u30a4\u30f3)
  
  admin.freeLocks.label=\u30ed\u30c3\u30af\u89e3\u653e
  admin.freeLocks.title=\u30ed\u30c3\u30af\u306e\u5168\u89e3\u653e
  admin.freeLocks.short=\u30b5\u30fc\u30d0\u30fc\u3067\u73fe\u5728\u30db\u30fc\u30eb\u30c9\u3057\u3066\u3044\u308b\u30ed\u30c3\u30af\u3092\u5168\u3066\u89e3\u653e\u3057\u307e\u3059\u3002
  admin.freeLocks.words=(\u6a5f\u80fd\u30ed\u30c3\u30af) (\u89e3\u653e) (\u7ba1\u7406)
  
  admin.freeMemory.label=\u30e1\u30e2\u30ea\u89e3\u653e
  admin.freeMemory.title=\u5229\u7528\u53ef\u80fd\u30e1\u30e2\u30ea\u306e\u89e3\u653e
  admin.freeMemory.short=\u30ac\u30d9\u30fc\u30b8\u30b3\u30ec\u30af\u30bf\u30fc\u306e\u5b9f\u884c\u306b\u3088\u308a\u5229\u7528\u53ef\u80fd\u306a\u30e1\u30e2\u30ea\u3092\u89e3\u653e\u3057\u307e\u3059\u3002
  admin.freeMemory.words=(\u30e1\u30e2\u30ea) (\u89e3\u653e) (\u7ba1\u7406)
  
  # resources for Admin
  label.locks=\u30ed\u30c3\u30af
  label.connections=\u63a5\u7d9a
  label.memory=\u30e1\u30e2\u30ea
  help.locks=\u6a5f\u80fd\u30ed\u30c3\u30af\u306e\u6570
  help.connections=\u30c7\u30fc\u30bf\u63a5\u7d9a\u6570
  help.memory=\u5229\u7528\u53ef\u80fd\u306a\u30e1\u30e2\u30ea\u5bb9\u91cf
  text.admin=\u3053\u306e\u7ba1\u7406\u30da\u30fc\u30b8\u306f\u73fe\u5728\u306e\u3068\u3053\u308d\u30a2\u30a4\u30c7\u30a3\u30a2\u6bb5\u968e\u3067\u3042\u308a\u3001\uff08\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3078\u306e\u5bfe\u8a71\u3092\u8a31\u53ef\u3059\u308b\u5171\u306b\uff09GeoSever\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\u72b6\u614b\u3092\u8868\u793a\u3059\u308b\u3053\u3068\u3092\u76ee\u7684\u3068\u3057\u3066\u3044\u307e\u3059\u3002
  message.freeLocks=\u30ed\u30c3\u30af\u304c\u89e3\u9664\u3055\u308c\u307e\u3057\u305f\u3002 ({0}\u304c\u4fdd\u6301\u3055\u308c\u3066\u307e\u3059)
  message.memory=\u30e1\u30e2\u30ea\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f \u3002({0}K\u3092\u89e3\u653e\u3057\u307e\u3057\u305f)
  
  # CONFIG
  config.label=\u8a2d\u5b9a
  config.title=GeoServer\u306e\u8a2d\u5b9a
  config.short=GeoServer\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.words=(\u8a2d\u5b9a)
  
  # CONFIG Server
  config.server.label=\u30b5\u30fc\u30d0\u30fc
  config.server.title=\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a
  config.server.short=\u30b5\u30fc\u30d0\u30fc\u3068\u9023\u7d61\u5148\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.server.words=(\u8a2d\u5b9a) (\u9023\u7d61) (\u30b5\u30fc\u30d0\u30fc)
  
  # CONFIG Server Login
  config.server.login.label=\u30d1\u30b9\u30ef\u30fc\u30c9
  config.server.login.title=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5909\u66f4
  config.server.login.short=\u30e6\u30fc\u30b6\u30fc\u540d/\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002
  config.server.login.words=(GeoServer) (\u30ed\u30b0\u30a4\u30f3) (\u7ba1\u7406)
  
  # CONFIG validation
  config.validation.label=\u59a5\u5f53\u6027\u691c\u8a3c
  config.validation.title=\u59a5\u5f53\u6027\u691c\u8a3c\u306e\u8a2d\u5b9a
  config.validation.short=GeoServer\u306e\u59a5\u5f53\u6027\u691c\u8a3c\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.validation.words=(Configuration) (\u59a5\u5f53\u6027\u691c\u8a3c)
  
  config.validation.suite.label=\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8
  config.validation.suite.title=\u59a5\u5f53\u6027\u691c\u8a3c\u7528\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8\u306e\u8a2d\u5b9a
  config.validation.suite.short=\u59a5\u5f53\u6027\u691c\u8a3c\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc\u306e\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.validation.suite.words=(\u59a5\u5f53\u6027\u691c\u8a3c\u51e6\u7406) (\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8)
  
  config.validation.suite.doit.label=\u30c6\u30b9\u30c8\u306e\u5b9f\u884c
  config.validation.suite.doit.title=\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8\u306e\u5b9f\u884c
  config.validation.suite.doit.short=\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002
  config.validation.suite.doit.words=(\u59a5\u5f53\u6027\u691c\u8a3c\u51e6\u7406) (\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8)
  
  config.validation.test.label=\u30c6\u30b9\u30c8
  config.validation.test.title=\u59a5\u5f53\u6027\u691c\u8a3c\u30c6\u30b9\u30c8\u306e\u8a2d\u5b9a
  config.validation.test.short=\uff08\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8\u4e2d\u306e\uff09\u59a5\u5f53\u6027\u691c\u8a3c\u30c6\u30b9\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.validation.test.words=(\u59a5\u5f53\u6027\u691c\u8a3c\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc) (\u59a5\u5f53\u6027\u691c\u8a3c) (\u30c6\u30b9\u30c8)
  
  config.validation.suite.editor.label=\u7de8\u96c6
  config.validation.suite.editor.title=\u59a5\u5f53\u6027\u691c\u8a3c\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8\u306e\u7de8\u96c6
  config.validation.suite.editor.short=\u59a5\u5f53\u6027\u691c\u8a3c\u30c6\u30b9\u30c8\u30fb\u30b9\u30a4\u30fc\u30c8\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002
  config.validation.suite.editor.words=(\u59a5\u5f53\u6027\u691c\u8a3c\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc) (\u59a5\u5f53\u6027\u691c\u8a3c) (\u30c6\u30b9\u30c8\u30b9\u30a4\u30fc\u30c8)
  
  config.validation.test.editor.label=\u7de8\u96c6
  config.validation.test.editor.title=\u59a5\u5f53\u6027\u691c\u8a3c\u30c6\u30b9\u30c8\u306e\u7de8\u96c6
  config.validation.test.editor.short=\u59a5\u5f53\u6027\u691c\u8a3c\u30c6\u30b9\u30c8\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002
  config.validation.test.editor.words=(\u59a5\u5f53\u6027\u691c\u8a3c\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc) (\u59a5\u5f53\u6027\u691c\u8a3c) (\u30c6\u30b9\u30c8)
  
  config.validation.test.doit.label=\u30c6\u30b9\u30c8\u306e\u5b9f\u884c
  config.validation.test.doit.title=\u59a5\u5f53\u6027\u691c\u8a3c\u30c6\u30b9\u30c8\u306e\u5b9f\u884c
  config.validation.test.doit.short=\u59a5\u5f53\u6027\u691c\u8a3c\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002
  config.validation.test.doit.words=(\u59a5\u5f53\u6027\u691c\u8a3c\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc) (\u30c6\u30b9\u30c8)
  
  config.validation.displayResults.label=\u7d50\u679c\u306e\u8868\u793a
  config.validation.displayResults.title=\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u7d50\u679c
  config.validation.displayResults.short=\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u7d50\u679c\u3092\u8868\u793a\u3057\u307e\u3059\u3002
  config.validation.displayResults.words=(\u59a5\u5f53\u6027\u691c\u8a3c\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc) (\u59a5\u5f53\u6027\u691c\u8a3c) (\u30c6\u30b9\u30c8\u30b9\u30a4\u30fc\u30c8) (\u7d50\u679c)
  config.validation.displayResults.errors=\u30a8\u30e9\u30fc
  config.validation.displayResults.runCompleted=\u5b9f\u884c\u306f\u5b8c\u4e86
  config.validation.displayResults.runNotCompleted=\u5b9f\u884c\u306f\u5b8c\u4e86\u3057\u307e\u305b\u3093\u3067\u3057\u305f
  config.validation.displayResults.stop=\u505c\u6b62
  
  # CONFIG wfs
  config.wfs.label=WFS
  config.wfs.title=Web Feature Server\u306e\u8a2d\u5b9a
  config.wfs.short=Web Feature Server\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.wfs.words=(WFS) (Web Feature Server) (\u8a2d\u5b9a)
  
  config.wfs.content.label=\u30b3\u30f3\u30c6\u30f3\u30c4
  config.wfs.content.title=Web Feature Server\u306e\u30b3\u30f3\u30c6\u30f3\u30c4
  config.wfs.content.short=Web Feature Server\u306e\u6a5f\u80fd\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.wfs.content.words=(WFS) (Web Feature Server) (\u8a2d\u5b9a)
  
  config.wfs.description.label=\u8aac\u660e
  config.wfs.description.title=Web Feature Server\u306e\u8aac\u660e
  config.wfs.description.short=Web Feature Server\u306e\u60c5\u5831\u3068\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.wfs.description.words=(WFS) (Web Feature Server) (\u8a2d\u5b9a)
  
  error.wfs.onlineResource.required=\u30aa\u30f3\u30e9\u30a4\u30f3\u30ea\u30bd\u30fc\u30b9\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.wfs.onlineResource.malformed=\u30aa\u30f3\u30e9\u30a4\u30f3\u30ea\u30bd\u30fc\u30b9\u304c\u304a\u304b\u3057\u3044\u3067\u3059\u3002: {0}
  
  # CONFIG wms
  config.wms.label=WMS
  config.wms.title=Web Map Server\u306e\u8a2d\u5b9a
  config.wms.short=Web Map Server\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.wms.words=(WMS) (Web Map Server) (\u8a2d\u5b9a)
  
  config.wms.content.label=\u30b3\u30f3\u30c6\u30f3\u30c4
  config.wms.content.title=Web Map Server \u30b3\u30f3\u30c6\u30f3\u30c4
  config.wms.content.short=Web Map Server\u306e\u6a5f\u80fd\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.wms.content.words=(WMS) (Web Map Server) (\u8a2d\u5b9a)
  
  config.wms.description.label=\u8aac\u660e
  config.wms.description.title=Web Map Server\u306e\u8aac\u660e
  config.wms.description.short=Web Map Server\u306e\u60c5\u5831\u3068\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.wms.description.words=(WMS) (Web Map Server) (Configuration)
  
  config.wms.rendering.label=\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0
  config.wms.rendering.title=Web Map Server\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0
  config.wms.rendering.short=Web Map Server\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.wms.rendering.words=(WMS) (Web Map Server) (\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0)
  
  error.wms.onlineResource.required=\u30aa\u30f3\u30e9\u30a4\u30f3\u30fb\u30ea\u30bd\u30fc\u30b9\u304c\u5fc5\u8981\u3067\u3059\u3002
  error.wms.onlineResource.malformed=\u30aa\u30f3\u30e9\u30a4\u30f3\u30fb\u30ea\u30bd\u30fc\u30b9\u304c\u5947\u5999\u3067\u3059\u3002: {0}
  
  # DATA
  config.data.label=\u30c7\u30fc\u30bf
  config.data.title=GeoServer\u306e\u30c7\u30fc\u30bf\u8a2d\u5b9a
  config.data.short=GeoServer\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306econfig.data\u306e\u30a2\u30af\u30bb\u30b9\u3068\u8868\u793a\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.data.words=(\u8a2d\u5b9a) (\u30c7\u30fc\u30bf) (\u7a7a\u9593\u30c7\u30fc\u30bf)
  
  # DATA - config.dataStores
  config.data.store.label=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2
  config.data.store.title=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u306e\u8a2d\u5b9a
  config.data.store.short=\u8a2d\u5b9a\u3059\u308b\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  config.data.store.words=(\u8a2d\u5b9a) (\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9) (Shape\u30d5\u30a1\u30a4\u30eb) (\u7a7a\u9593\u30c7\u30fc\u30bf) (\u30c7\u30fc\u30bf)
  
  config.data.store.new.label=\u65b0\u898f
  config.data.store.new.title=\u65b0\u3057\u3044\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u306e\u4f5c\u6210
  config.data.store.new.short=\u7a7a\u9593\u60c5\u5831\u306e\u30bd\u30fc\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002
  config.data.store.new.words=(\u8a2d\u5b9a) (\u30c7\u30fc\u30bf\uff70\u30d9\u30fc\u30b9) (Shape\u30d5\u30a1\u30a4\u30eb) (\u7a7a\u9593\u30c7\u30fc\u30bf) (\u30c7\u30fc\u30bf)
  
  config.data.store.editor.label=\u7de8\u96c6
  config.data.store.editor.title=\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u306e\u7de8\u96c6
  config.data.store.editor.short=\u7a7a\u9593\u60c5\u5831\u306e\u30bd\u30fc\u30b9\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002
  config.data.store.editor.words=(\u8a2d\u5b9a)(\u30c7\u30fc\u30bf\uff70\u30d9\u30fc\u30b9) (Shape\u30d5\u30a1\u30a4\u30eb) (\u7a7a\u9593\u30c7\u30fc\u30bf) (\u30c7\u30fc\u30bf) 
  config.data.store.editor.requiredField=\u5fc5\u8981\u306a\u30d5\u30a3\u30fc\u30eb\u30c9
  
  # DATA namespace
  config.data.namespace.label=\u540d\u524d\u7a7a\u9593
  config.data.namespace.title=\u540d\u524d\u7a7a\u9593\u306e\u8a2d\u5b9a
  config.data.namespace.short=GML\u306e\u751f\u6210\u306b\u4f7f\u7528\u3059\u308b\u540d\u524d\u7a7a\u9593\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002
  config.data.namespace.words=(GML) (\u540d\u524d\u7a7a\u9593) (\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9)
  
  config.data.namespace.new.label=\u65b0\u898f
  config.data.namespace.new.title=\u65b0\u3057\u3044\u540d\u524d\u7a7a\u9593\u306e\u4f5c\u6210
  config.data.namespace.new.short=GML\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u65b0\u3057\u3044\u540d\u524d\u7a7a\u9593\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002
  config.data.namespace.new.words=(GML) (\u540d\u524d\u7a7a\u9593) (\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9)
  
  config.data.namespace.editor.label=\u7de8\u96c6
  config.data.namespace.editor.title=\u540d\u524d\u7a7a\u9593\u306e\u7de8\u96c6
  config.data.namespace.editor.short=GML\u540d\u524d\u7a7a\u9593\u306eURI\u3068\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002
  config.data.namespace.editor.words=(GML) (\u540d\u524d\u7a7a\u9593) (\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9)
  
  text.namespace=\u30ea\u30b9\u30c8\u304b\u3089\u540d\u524d\u7a7a\u9593\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\uff0a\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u540d\u524d\u7a7a\u9593\u3092\u793a\u3057\u307e\u3059\u3002
  # DATA styles
  # -----------
  config.data.style.label=\u30b9\u30bf\u30a4\u30eb
  config.data.style.title=\u30b9\u30bf\u30a4\u30eb\u306e\u8a2d\u5b9a
  config.data.style.short=\u4f7f\u7528\u53ef\u80fd\u306a\u30b9\u30bf\u30a4\u30eb\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002
  config.data.style.words=(WMS) (Web Map Server) (\u30b9\u30bf\u30a4\u30eb)
  config.data.sldWizard.label=Create new SLD
  
  config.data.style.new.label=\u65b0\u898f
  config.data.style.new.title=\u65b0\u898f\u30b9\u30bf\u30a4\u30eb
  config.data.style.new.short=\u65b0\u3057\u3044\u30b9\u30bf\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002
  config.data.style.new.words=(WMS) (Web Map Server) (\u30b9\u30bf\u30a4\u30eb)
  
  config.data.style.editor.label=\u7de8\u96c6
  config.data.style.editor.title=\u30b9\u30bf\u30a4\u30eb\u306e\u7de8\u96c6
  config.data.style.editor.short=\u9078\u629e\u3057\u305f\u30b9\u30bf\u30a4\u30eb\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002
  config.data.style.editor.words=(WMS) (Web Map Server) (\u30b9\u30bf\u30a4\u30eb)
  
  # Resources for styles
  label.styles=\u30b9\u30bf\u30a4\u30eb
  label.styleID=\u30b9\u30bf\u30a4\u30ebID
  help.styles=\u5229\u7528\u53ef\u80fd\u306a\u30b9\u30bf\u30a4\u30eb\u306e\u30ea\u30b9\u30c8
  help.styleID=\u30b9\u30bf\u30a4\u30eb\u306e\u8b58\u5225\u5b50
  error.style.exists=\u30b9\u30bf\u30a4\u30ebID {0} \u306f\u65e2\u306b\u3042\u308a\u307e\u3059\u3002
  error.file.required=\u30d5\u30a1\u30a4\u30eb\u540d\u304c\u5fc5\u8981\u3067\u3059\u3002
  # didier, 2004-04-20, not anymore used :
  error.file.nonexistent=\u30d5\u30a1\u30a4\u30eb {0} \u304c\u3042\u308a\u307e\u305b\u3093\u3002
  # didier, 2004-04-20, FormFile :
  error.file.maxLengthExceeded=SLD\u6587\u66f8\u306e\u6700\u5927\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u9577\u3092\u8d8a\u3048\u307e\u3057\u305f\u3002 ({0} \u30d0\u30a4\u30c8\u307e\u3067\u8a31\u5bb9\uff09
  error.action.invalid=\u30a2\u30af\u30b7\u30e7\u30f3 '{0}' \u306f\u7406\u89e3\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002
  error.styleID.required=StyleID \u304c\u5fc5\u8981\u3067\u3059\u3002
  error.styleID.invalid=StyleID\u306f\u82f1\u6570\u5b57\u3067\u59cb\u307e\u3089\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
  error.style.sldFileExists=\u65e2\u306b{0}\u304c\u3042\u308a\u307e\u3059\u3000\u30d5\u30a1\u30a4\u30eb\u3092\u30ea\u30cd\u30fc\u30e0\u3057\u3066\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  
  
  error.namespace.namespaceInUse=\u524a\u9664\u3059\u308b\u540d\u524d\u7a7a\u9593\u306f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3067\u4f7f\u7528\u3057\u3066\u307e\u3059\u3000\u6700\u521d\u306b\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  
  
  # DATA featureType
  # -----------
  config.data.type.label=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7
  config.data.type.title=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u8a2d\u5b9a
  config.data.type.short=\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u3067\u5229\u7528\u53ef\u80fd\u306a\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002
  config.data.type.words=(\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7) (\u7a7a\u9593\u60c5\u5831)
  
  config.data.type.new.label=\u65b0\u898f
  config.data.type.new.title=\u65b0\u3057\u3044\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u4f5c\u6210
  config.data.type.new.short=\u5229\u7528\u53ef\u80fd\u306a\u30c7\u30fc\u30bf\u30b9\u30c8\u30a2\u304b\u3089\u65b0\u3057\u3044\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002
  config.data.type.new.words=(\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7) (\u7a7a\u9593\u60c5\u5831)
  
  config.data.type.editor.label=\u7de8\u96c6
  config.data.type.editor.title=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u7de8\u96c6
  config.data.type.editor.short=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u5b9a\u7fa9\u3068\u30b9\u30ad\u30fc\u30de\u3092\u7de8\u96c6\u3057\u307e\u3059\u3002
  config.data.type.editor.words=(\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7) (\u7a7a\u9593\u60c5\u5831)
  
  config.data.calculateBoundingBox.label=\u751f\u6210
  config.data.calculateBoundingBox.title=\u5883\u754c\u306e\u8a08\u7b97
  config.data.calculateBoundingBox.short=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u5b9a\u7fa9\u306e\u305f\u3081\u306e\u5883\u754c\u3092\u8a08\u7b97\u3057\u307e\u3059\u3002
  config.data.calculateBoundingBox.words=(\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7) (\u7a7a\u9593\u60c5\u5831) (\u5883\u754c) 
  
  error.data.nullBBOX=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7'{0}'\u306f\u7bc4\u56f2\u304c\u30cc\u30eb\u3067\u3059 <br> \u30d2\u30f3\u30c8: \u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u304c\u7a7a\u304b\u3001\u30b8\u30aa\u30e1\u30c8\u30ea\u306e\u5c5e\u6027\u304c\u30c7\u30d5\u30a9\u30eb\u30c8\u3042\u308a\u307e\u305b\u3093\u3002
  error.data.couldNotFindSRSAuthority=\u3042\u306a\u305f\u306eSRS\u3092\u89e3\u91c8\u3059\u308b\u305f\u3081\u306eSRS\u5224\u4f8b\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002 SRS\u304c\u6b63\u3057\u3044\u3053\u3068\u3092\u78ba\u304b\u3081\u3066\u304f\u3060\u3055\u3044\u3002-\u3042\u306a\u305f\u306eSRS\u304c\u78ba\u5b9f\u306b\u30ea\u30b9\u30c8\u3055\u308c\u308b\u305f\u3081\u306b\u3001SRS\u5224\u4f8b\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306b\u3064\u3044\u3066\u76f8\u8ac7\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 <br> {0} <br> {1} 
  error.data.factoryException=SRS\u5909\u63db\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 - {0}
  error.data.transformException=\u5ea7\u6a19\u5909\u63db\u3092\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
  error.style.noParse=\u30b9\u30bf\u30a4\u30eb\u3092\u89e3\u6790\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 - {0}
  
  
  label.SRSHelp=SRS Help
  
  #might want the other langages to point to a different url!
  label.SRSHelp.URL=http://docs.codehaus.org/display/GEOS/crshelp
  
  label.SRSList=SRS\u30ea\u30b9\u30c8
  
  
  label.type.dataminx=\u30c7\u30fc\u30bf min X
  label.type.dataminy=\u30c7\u30fc\u30bf min Y
  label.type.datamaxx=\u30c7\u30fc\u30bf max X
  label.type.datamaxy=\u30c7\u30fc\u30bf max Y
  
  help.type.dataminx=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306eSRS\u306b\u304a\u3051\u308bX\u5ea7\u6a19\u6700\u5c0f\u5024
  help.type.dataminy=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306eSRS\u306b\u304a\u3051\u308bY\u5ea7\u6a19\u6700\u5c0f\u5024
  help.type.datamaxx=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306eSRS\u306b\u304a\u3051\u308bX\u5ea7\u6a19\u6700\u5927\u5024
  help.type.datamaxy=\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u306eSRS\u306b\u304a\u3051\u308bY\u5ea7\u6a19\u6700\u5927\u5024
  
  error.badsrc=SRS\u306e\u5b9a\u7fa9\u3092\u898b\u3064\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002 - {0}
  
  label.type.srswkt=SRS WKT
  help.type.srswkt=SRS\u306eEPSG\u756a\u53f7\u306eOGC Well Known Text \u5b9a\u7fa9
  
  # Resources for FeatureType
  label.bbox=Bounding Box
  label.type.minx=Min \u7d4c\u5ea6
  label.type.miny=Min \u7def\u5ea6
  label.type.maxx=Max \u7d4c\u5ea6
  label.type.maxy=Max \u7def\u5ea6
  label.base=\u30b9\u30ad\u30fc\u30de\u30fb\u30d9\u30fc\u30b9
  label.schemaName=\u30b9\u30ad\u30fc\u30de\u540d
  label.style=\u30b9\u30bf\u30a4\u30eb
  label.change=\u5909\u66f4
  label.add=\u8ffd\u52a0
  label.nillable=\u30cc\u30eb\u5024\u53ef
  label.min=\u6700\u5c0f
  label.max=\u6700\u5927
  help.type.name=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u540d
  help.type.style=\u63cf\u753b\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306b\u4f7f\u7528\u3059\u308b\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30b9\u30bf\u30a4\u30eb
  help.type.srs=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u3078\u306e\u7a7a\u9593\u53c2\u7167\u30b7\u30b9\u30c6\u30e0
  help.type.title=\u3053\u306e\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u30a8\u30f3\u30c9\u30e6\u30fc\u30b6\u30fc\u3078\u306e\u30bf\u30a4\u30c8\u30eb
  help.type.bbox=\u5168\u4f53\u306e\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306b\u5bfe\u3059\u308b\u9818\u57df\u30dc\u30c3\u30af\u30b9
  help.type.minx=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u6700\u5c0f\u7def\u5ea6
  help.type.miny=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u6700\u5c0f\u7d4c\u5ea6
  help.type.maxx=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u6700\u5927\u7def\u5ea6
  help.type.maxy=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u6700\u5927\u7d4c\u5ea6
  help.type.base=\u30d9\u30fc\u30b9XML\u30b9\u30ad\u30fc\u30de\u8981\u7d20(\u5fc5\u9808\u306a\u5c5e\u6027\u3092\u5b9a\u7fa9\u3059\u308b\u304b\u3001\u751f\u6210\u3059\u308b)
  help.type.schemaName=\u30bf\u30a4\u30d7\u3092\u8aac\u660e\u3059\u308bXML\u30b9\u30ad\u30fc\u30de\u8981\u7d20\u540d
  error.styleId.notFound=\u30b9\u30bf\u30a4\u30ebId '{0}'\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u307e\u305b\u3093\u3002
  
  type.title.up=\u3053\u306e\u30bf\u30a4\u30d7\u30921\u30ec\u30d9\u30eb\u4e0a\u306b\u52d5\u304b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  type.title.down=\u3053\u306e\u30bf\u30a4\u30d7\u30921\u30ec\u30d9\u30eb\u4e0b\u306b\u52d5\u304b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
  type.title.delete=\u3053\u306e\u30bf\u30a4\u30d7\u3092\u524a\u9664\u3059\u308b\u3002
  label.jai=JAI\u306e\u5229\u7528
  
  help.jai=JAI (Java Advanced Imaging) \u62e1\u5f35\u306fWMS\u306b\u305f\u3044\u3057\u3066\u306e\u30a4\u30e1\u30fc\u30b8\u63cf\u753b\u306b\u4f7f\u308f\u308c\u307e\u3059\u3002
  
  label.jvm=JVM\u30d0\u30fc\u30b8\u30e7\u30f3
  
  help.jvm=\u3069\u306eJVM\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u30b5\u30fc\u30d0\u30fc\u3092\u52d5\u304b\u3059\u306e\u306b\u4f7f\u3046\u306e\u304b\u3092\u6307\u793a\u3057\u307e\u3059\u3002
  
  
  srsList.title=\u7a7a\u9593\u53c2\u7167\u30b7\u30b9\u30c6\u30e0\u7cfb\u756a\u53f7\u306e\u4e00\u89a7
  srsList.tableTitle=EPSG WKT \u5b9a\u7fa9
  
  mapPreview.title=\u6709\u52b9\u306a\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u30bf\u30a4\u30d7\u306e\u6700\u5c0f\u5730\u56f3\u30d7\u30ec\u30d3\u30e5\u30fc
  
  sldValididity.title=.SLD\u30d5\u30a1\u30a4\u30eb\u306fSLD\u30b9\u30ad\u30fc\u30de\u306b\u5f93\u3063\u3066\u3044\u307e\u305b\u3093\u3002
  sldValiditity.help.text=\u3055\u3089\u306b\u30d8\u30eb\u30d7\u306f\u3053\u3053\u3067\u5229\u7528\u3067\u304d\u307e\u3059\u3002
  sldValiditity.help.url=http://docs.codehaus.org/display/GEOS/SLD+Validation
  
  help.citeConformanceHacks=\u53b3\u5bc6\u306aCITE\u30c6\u30b9\u30c8\u306e\u4e00\u81f4\u3092\u671b\u3080\u304b\u3069\u3046\u304b\u30c1\u30a7\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002CITE\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u3066\u3044\u306a\u3044\u9650\u308a\u3001\u591a\u5206\u3053\u308c\u3092\u30c1\u30a7\u30c3\u30af\u3057\u305f\u304f\u306a\u3044\u3067\u3057\u3087\u3046\u3002
  label.citeConformanceHacks=\u53b3\u5bc6\u306aCITE\u30c6\u30b9\u30c8\u306e\u4e00\u81f4
  
  help.featureBounding=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u30b8\u30aa\u30e1\u30c8\u30ea\u306e\u5883\u754c\u3092GetFeature\u306egml\u51fa\u529b\u306b\u81ea\u52d5\u7684\u306b\u542b\u3080\u3088\u3046\u306b\u3059\u308b\u306a\u3089\u30c1\u30a7\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u5927\u90e8\u5206\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306f\u305d\u308c\u3092\u8981\u6c42\u305b\u305a\u4f59\u5206\u306a\u30d0\u30f3\u30c9\u5e45\u306e\u53d6\u5f97\u3082\u3057\u306a\u3044\u306e\u3067\u3001\u63a8\u5968\u3057\u307e\u305b\u3093\u3002
  label.featureBounding=\u30d5\u30e5\u30fc\u30c1\u30e3\u30fc\u306e\u5883\u754c\u751f\u6210
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/applicationContext.xml
  
  Index: applicationContext.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  
  <beans>
  
  	<!--  application state module -->
  	<bean id="applicationState"
  		class="org.vfny.geoserver.global.ApplicationState">
  		<constructor-arg ref="data"/>
  		<constructor-arg ref="validation"/>
  		<constructor-arg ref="config"/>
  	</bean>
  	
  	<bean id="applicationStateRegisterar"
  		class="org.vfny.geoserver.global.GeoServerServletContextInitializer">
  		
  		<constructor-arg type="java.lang.String" value="GeoServer.ApplicationState"/>
   		<constructor-arg ref="applicationState"/>
   	</bean>
   	
  </beans>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/commons-logging.properties
  
  Index: commons-logging.properties
  ===================================================================
  org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/geoserver/request/Dispatcher.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/AdminIndexAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/ConfigAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/DemoAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/DemoRequestAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/FreeLocksAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/FreeMemoryAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/GeoServerAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/HTMLEncoder.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/LoadXMLAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/LoginAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/LoginEditAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/LogoutAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/MapPreviewAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/SaveXMLAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/SrsHelpAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/UpdateGSAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/CalculateBoundingBoxAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/DataDataStoresEditorAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/DataDataStoresNewAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/DataDataStoresSelectAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/DataFeatureTypesNewAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/DataFeatureTypesSelectAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/DataNamespacesEditorAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/DataNamespacesNewAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/DataNamespacesSelectAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/SLDWizardAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/StylesEditorAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/StylesNewAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/StylesSelectAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/data/TypesEditorAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/global/GeoServerConfigurationSubmit.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation/TestValidationResults.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation/ValidationRunnable.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation/ValidationTestDoIt.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation/ValidationTestEditorAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation/ValidationTestNewAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation/ValidationTestSelectAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation/ValidationTestSuiteNewAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/validation/ValidationTestSuiteSelectAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/wfs/WFSContentAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/wfs/WFSDescriptionAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/wms/WMSContentAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/wms/WMSDescriptionAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/action/wms/WMSRenderingAction.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/DemoForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/DemoRequestForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/LoginForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/AttributeDisplay.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/AttributeForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataDataStoresEditorForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataDataStoresNewForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataDataStoresSelectForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataFeatureTypesEditorForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataFeatureTypesNewForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataFeatureTypesSelectForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataNamespacesEditorForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataNamespacesNewForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/DataNamespacesSelectForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/SLDWizardForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/StylesEditorForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/StylesNewForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/StylesSelectForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/data/TypesEditorForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/global/GeoServerConfigurationForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/validation/ValidationTestEditorForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/validation/ValidationTestNewForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/validation/ValidationTestSelectForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/validation/ValidationTestSuiteNewForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/validation/ValidationTestSuiteSelectForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/wfs/WFSContentForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/wfs/WFSDescriptionForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/wms/WMSContentForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/wms/WMSDescriptionForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/form/wms/WMSRenderingForm.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/classes/org/vfny/geoserver/global/ApplicationState.class
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/images/colorpicker.jpg
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/images/delete.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/images/deleteRed.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/images/down.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/images/gs.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/images/gs.ico
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/images/up.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/jsp/include.jsp
  
  Index: include.jsp
  ===================================================================
  <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
  <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>       
  <%@ taglib prefix="spring" uri="/tags/spring" %>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/antlr-2.7.2.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/aopalliance-1.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/batik-awt-util-1.6.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/batik-svggen-1.6.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/batik-transcoder-1.5.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/batik-util-1.6.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/commons-beanutils-1.7.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/commons-collections-2.1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/commons-digester-1.7.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/commons-fileupload-1.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/commons-httpclient-2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/commons-lang-2.1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/commons-logging-1.0.3.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/commons-validator-1.1.4.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/concurrent-1.3.4.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/data-1.4.0-M1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/geoapi-2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-api-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-coverage-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-demo-property-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-epsg-wkt-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-graph-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-main-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-postgis-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-referencing-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-render-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-shapefile-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/gt2-validation-2.2.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/itext-1.3.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/jai-core-1.1.3-alpha.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/jai_codec-1.1.3-alpha.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/jai_imageio-1.1-alpha.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/jdom-1.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/jsr108-0.01.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/jstl-1.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/jts-1.7.1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/junit-3.8.1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/log4j-1.2.9.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/lucene-1.4.3.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/main-1.4.0-M1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/oro-2.0.8.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/platform-1.4.0-M1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/postgis-driver-1.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/postgresql-8.1-407.jdbc3.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/spring-aop-1.2.5.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/spring-beans-1.2.5.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/spring-context-1.2.5.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/spring-core-1.2.5.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/spring-web-1.2.5.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/spring-webmvc-1.2.5.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/standard-1.0.6.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/struts-1.2.9.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/validation-1.4.0-M1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/vecmath-1.3.1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/wfs-1.4.0-M1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/wkb4j-1.0-RC1-modified.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/wms-1.4.0-M1.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/xalan-2.7.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/xercesImpl-2.4.0.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/lib/xml-apis-1.0.b2.jar
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/Administration.jsp
  
  Index: Administration.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  
  <table class="info">
    <tbody>
      <tr>
        <td class="label"></td>
        <td class="datum">      
          <bean:message key="text.admin"/>
        </td>      
      </tr>  
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.locks"/>">
  			<bean:message key="label.locks"/>:
  		</span>
        </td>
        <td class="datum">
          <bean:write name="DATA" property="lockCount"/>
        </td>      
      </tr>
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.connections"/>">
  			<bean:message key="label.connections"/>:
  		</span>
        </td>
        <td class="datum">
          <bean:write name="DATA" property="connectionCount"/>
        </td>      
      </tr>
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.memory"/>">
  			<bean:message key="label.memory"/>:
  		</span>
        </td>
        <td class="datum">
          <%= Runtime.getRuntime().freeMemory()/1024 %>K
        </td>      
      </tr>
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.jvm"/>">
  			<bean:message key="label.jvm"/>:
  		</span>
        </td>
        <td class="datum">
          <%= System.getProperty("java.vendor") %> : <%= System.getProperty("java.version") %>
        </td>      
      </tr>
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.jai"/>">
  			<bean:message key="label.jai"/>:
  		</span>
        </td>
        <td class="datum">
          <%= ClassLoader.getSystemClassLoader().getResource("javax/media/jai/buildVersion") != null %>
        </td>      
      </tr>
    </tbody>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/Configuration.jsp
  
  Index: Configuration.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <logic:empty name="GeoServer.ApplicationState" property="dataStoreErrorKeys">
    <bean:message key="message.dataOkay"/>
  </logic:empty>
  
  <logic:notEmpty name="GeoServer.ApplicationState" property="dataStoreErrorKeys">
    <table class="info">
      <tr>
        <td class="label">	
    		<logic:iterate id="key" indexId="ctr" name="GeoServer.ApplicationState" property="dataStoreErrorKeys">
    			<nobr><%= key %></nobr><br>
    		</logic:iterate>
        </td>
        <td class="datum">
          <logic:iterate id="value" indexId="ctr" name="GeoServer.ApplicationState" property="dataStoreErrorValues">
            <nobr><%= value %></nobr><br>
          </logic:iterate>
        </td>
      </tr>	
    </table>
  </logic:notEmpty>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/ContactInformation.jsp
  
  Index: ContactInformation.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <logic:notPresent name="org.apache.struts.action.MESSAGE" scope="application">
    <span class="error">
      <bean:message key="message.notLoaded"/>  
    </span>
  </logic:notPresent>
  
  <table class="info">
    <tbody>
  <logic:notEmpty name="GeoServer" property="contactPerson">  
      <tr>
        <td class="label"><bean:message key="label.contactPerson"/>:</td>
        <td class="datum">
          <bean:write name="GeoServer" property="contactPerson"/>
        </td>      
      </tr>
  </logic:notEmpty>    
  
  <logic:notEmpty name="GeoServer" property="contactPosition">  
      <tr>
        <td class="label"><bean:message key="label.contactPosition"/>:</td>
        <td class="datum">
          <bean:write name="GeoServer" property="contactPosition"/>
        </td>
      </tr>
  </logic:notEmpty>
  
  <logic:notEmpty name="GeoServer" property="contactOrganization">
      <tr>
        <td class="label"><bean:message key="label.contactOrganization"/>:</td>
        <td class="datum">   
          <bean:write name="GeoServer" property="contactOrganization"/>
        </td>
      </tr>
  </logic:notEmpty>
  
  <logic:empty name="GeoServer" property="contactParty">
      <tr>
        <td class="label"><bean:message key="label.contact"/>:</td>
        <td class="datum">   
          <bean:message key="message.noContact"/>
        </td>
      </tr>
  </logic:empty>
  
  <logic:notEmpty name="GeoServer" property="address">    
      <tr>
        <td class="label">
          Address:
        </td>
        <td class="datum">   
          <bean:write name="GeoServer" property="addressType"/><br>
          <bean:write name="GeoServer" property="address"/><br>        
          <bean:write name="GeoServer" property="addressCity"/><br>
          <bean:write name="GeoServer" property="addressState"/>&nbsp;&nbsp;
          <bean:write name="GeoServer" property="addressPostalCode"/><br>
          <bean:write name="GeoServer" property="addressCountry"/><br>        
        </td>
      </tr>
  </logic:notEmpty>
  
  <logic:notEmpty name="GeoServer" property="contactVoice">
      <tr>
        <td class="label"><bean:message key="label.phoneNumber"/>:</td>
        <td class="datum">
          <bean:write name="GeoServer" property="contactVoice"/>
        </td>
      </tr>
  </logic:notEmpty>
  
  <logic:notEmpty name="GeoServer" property="contactFacsimile">
      <tr>
        <td class="label"><bean:message key="label.contactFacsimile"/>:</td>
        <td class="datum">
          <bean:write name="GeoServer" property="contactFacsimile"/>
        </td>
      </tr>
  </logic:notEmpty>
  
  <logic:notEmpty name="GeoServer" property="contactEmail">    
      <tr>
        <td class="label"><bean:message key="label.contactEmail"/>:</td>
        <td class="datum">
          <bean:write name="GeoServer" property="contactEmail"/>
        </td>
      </tr>
  </logic:notEmpty>
      
    </tbody>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/Demo.jsp
  
  Index: Demo.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table class="info" cellpadding=10 width=670>
  	<tbody>
  	
  		<tr>
  			<td width=70/>
  			<td width=600 class="label" valign="top">
  			<center><u><b><font size=+2><a href="../../../popup_map/index.html"><bean:message key="welcome.demo.wmsexample.title"/></a></font></b></u><br>
  			<p>
  			<bean:message key="welcome.demo.wmsexample.short"/>
  			</p>
  			</center>
  			</td>
  		</tr>
  		
  		<tr>
  			<td width=70/>
  			<td width=600 class="label" valign="top">
  			<center><u><b><font size=+2><a href="../../../mapPreview.do"><bean:message key="welcome.demo.mappreview.title"/></a></font></b></u><br>
  			<p>
  			<bean:message key="welcome.demo.mappreview.short"/>
  			</p>
  			</center>
  			</td>
  		</tr>
  		
  		<tr>
  			<td width=70/>
  			<td width=600 class="label" valign="top">
  			<center><u><b><font size=+2><a href="../../../demoRequest.do"><bean:message key="welcome.demo.requests.title"/></a></font></b></u><br>
  			<p>
  			<bean:message key="welcome.demo.requests.short"/>
  			</p>
  			</center>
  			</td>
  		</tr>
  		
  		<tr>
  			<td width=70/>
  			<td width=600 class="label" valign="top">
  			<center><u><b><font size=+2><a href="http://docs.codehaus.org/display/GEOSDOC/Documentation" target="newwindow"><bean:message key="welcome.demo.documentation.title"/></a></font></b></u><br>
  			<p>
  			<bean:message key="welcome.demo.documentation.short"/>
  			</p>
  			</center>
  			</td>
  		</tr>
  
  		<tr>
  			<td width=70/>
  			<td width=600 class="label" valign="top">
  			<center><u><b><font size=+2><a href="../../../wfs-t_demo/index.html" target="newwindow"><bean:message key="welcome.demo.wfst.title"/></a></font></b></u><br>
  			<p>
  			<bean:message key="welcome.demo.wfst.short"/>
  			</p>
  			</center>
  			</td>
  		</tr>
  
  </table>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/GeoServerConfiguration.jsp
  
  Index: GeoServerConfiguration.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/geoServerSubmit">
  <table class="info">
    <tbody>	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.maxFeatures"/>">	  
            <bean:message key="label.maxFeatures"/>:
          </span>
        </td>
  	  <td class="datum">
  		<html:text property="maxFeatures" size="60"/>
  	  </td>
  	</tr>
  	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.verbose"/>">
  			<bean:message key="label.verbose"/>:
  		</span>
        </td>
        <td class="datum">
  		<html:checkbox property="verbose"/>
  	  </td>
  	</tr>
  	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.verboseExceptions"/>">
  			<bean:message key="label.verboseExceptions"/>:
  		</span>
        </td>
        <td class="datum">
  		<html:checkbox property="verboseExceptions"/>
  	  </td>
  	</tr>
  	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.numDecimals"/>">
  			<bean:message key="label.numDecimals"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="numDecimals" size="60"/>
  	  </td>
  	</tr>
  	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.charset"/>">
  			<bean:message key="label.charset"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="charset" size="60"/>
  	  </td>
  	</tr>
  	
  	<!--tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.baseURL"/>">
  			<bean:message key="label.baseURL"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="baseURL" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.schemaBaseURL"/>">
  			<bean:message key="label.schemaBaseURL"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="schemaBaseURL" size="60"/>
  	  </td>
  	</tr-->
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.loggingLevel"/>">
  			<bean:message key="label.loggingLevel"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:select property="loggingLevel">
  			<html:option value="OFF"/>
  			<html:option value="SEVERE"/>
  			<html:option value="WARNING"/>
  			<html:option value="INFO"/>
  			<html:option value="CONFIG"/>
  			<html:option value="FINE"/>
  			<html:option value="FINER"/>
  			<html:option value="FINEST"/>
  			<html:option value="ALL"/>			
  		</html:select>
  	  </td>
      </tr>	
      
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.global.loggingToFile"/>">
  			<bean:message key="label.loggingToFile"/>:
  		</span>
        </td>
  	  <td class="datum">
  	  	<html:checkbox property="loggingToFile"/>
  	  </td>
  	 </tr> 
  	 
  	 <tr>
  		 <td class="label">
  		  	<span class="help" title="<bean:message key="help.global.logLocation"/>">
  				<bean:message key="label.logLocation"/>:
  			</span>
  		</td>
  		<td class="datum">
  		<logic:empty name="geoServerConfigurationForm" property="logLocation">
  			<html:text property="logLocation" size="60" value="logs/geoserver.log"/>		
  		</logic:empty>
  		<logic:notEmpty name="geoServerConfigurationForm" property="logLocation">
  			<html:text property="logLocation" size="60"/>		
  		</logic:notEmpty>
  
  		</td>
      </tr>	
      
    </tbody>
  </table>
  
  <h3><bean:message key="label.contactInformation"/></h3>
  
  <table class="info">
    <tbody>
  	<tr>
  	  <td class="label">
  	<tr><td colspan=2><center><b></b></center>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.contactPerson"/>">
  			<bean:message key="label.contactPerson"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="contactPerson" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.contactOrganization"/>">
  			<bean:message key="label.contactOrganization"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="contactOrganization" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.contactPosition"/>">
  			<bean:message key="label.contactPosition"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="contactPosition" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.addressType"/>">
  			<bean:message key="label.addressType"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="addressType" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.address"/>">
  			<bean:message key="label.address"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="address" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.addressCity"/>">
  			<bean:message key="label.addressCity"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="addressCity" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.addressState"/>">
  			<bean:message key="label.addressState"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="addressState" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.addressPostalCode"/>">
  			<bean:message key="label.addressPostalCode"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="addressPostalCode" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.addressCountry"/>">
  			<bean:message key="label.addressCountry"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="addressCountry" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.contactVoice"/>">
  			<bean:message key="label.contactVoice"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="contactVoice" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.contactFacsimile"/>">
  			<bean:message key="label.contactFacsimile"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="contactFacsimile" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.global.contactEmail"/>">
  			<bean:message key="label.contactEmail"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:text property="contactEmail" size="60"/>
  	  </td>
  	</tr>
  
  	<tr>
  	  <td class="label">
  	  </td>
  	  <td class="datum">
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	  </td>
  	</tr>	
    </tbody>
  </table>
  </html:form>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/Login.jsp
  
  Index: Login.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  
  <html:form action="/admin/loginSubmit" focus="username">
    <table class="info">
      <tbody>
        <tr>
          <td class="label"><bean:message key="label.username"/>:</td>
          <td class="datum">
            <html:text size="60" property="username"/>        
          </td>      
        </tr>
        <tr>
          <td class="label"><bean:message key="label.password"/>:</td>
          <td class="datum">
            <html:password size="60" property="password"/>        
          </td>      
        </tr>    
        <tr>
          <td class="label"></td>
          <td class="datum">
            <html:submit><bean:message key="label.submit"/></html:submit><html:reset><bean:message key="label.reset"/></html:reset>
          </td>      
        </tr>    
      </tbody>
    </table>
  </html:form>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/SLDWizard.jsp
  
  Index: SLDWizard.jsp
  ===================================================================
  <!--
  Copyright (c) 2006 TOPP - www.openplans.org.  All rights reserved.
  This code is licensed under the GPL 2.0 license, availible at the root
  application directory.
  
  
  @author Brent Owens
  -->
  
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html>
  <head></head>
  
  <!-- color chooser -->
  <link rel="stylesheet" href="js_color_picker_v2.css" media="screen">
  <script type="text/javascript" src="color_functions.js"></script>
  <script type="text/javascript" src="js_color_picker_v2.js"></script>
  
  <!-- ================================ -->
  <!-- ---------- JAVASCRIPT ---------- -->
  <!-- ================================ -->
  <script language="JavaScript" type="text/JavaScript">
  <!--
  
  
  /** global variables **/
  var SERVERHOSTNAME = "sigma.openplans.org";//window.location.host;
  
  var SERVERURL = "http://"+SERVERHOSTNAME+"/geoserver/";
  
  var geo_xmlhttp = null;	// AJAX-ness
  
  
  var featureTypeName = "";	// our feature type that the style will go to
  
  var geomType = "";	// the type of geometry we are making a style for
  
  var columnNames;	// the names of the columns of the feature type
  
  
  /**
   * Setup
   *
   * This will search through the feature type info and determine 
   * what kind of geometry it uses. This is based on geoserver 
   * output and not tested with anything else.
   */
  function setup()
  {
  	log("setup");
  	
  	// we need an interval to read the jsp results.
  	// javascript will load before the jsp code so we need to wait to use it.
  	var myInterval = window.setInterval(function cheese(a,b) {
  		ft = document.getElementById('span_ftName').innerHTML;
  		// if doesn't equal 'undefined'
  		log("ft = "+ft);
  		if (ft != "undefined")
  		{
  			featureTypeName = document.getElementById('span_ftName').innerHTML;
  			log("interval; featureTypeName = "+featureTypeName);
  			ftInfo = document.getElementById('hidden_ft_attrs').innerHTML;
  			log("ft info: "+ftInfo);
  			columnNames = document.getElementById('hidden_ft_attrNames').innerHTML;
  
  			ftInfoSplit = ftInfo.split(",");
  			for(i=0;i<ftInfoSplit.length;i++)
  			{
  				var g = ftInfoSplit[i].split(":")[1];
  				if (g == "multiPointProperty" || g == "pointProperty" ) {
  					geomType = "point";
  					break;
  				}
  				else if (g == "multiLineStringProperty" || g == "lineStringProperty" ) {
  					geomType = "line";
  					break;
  				}
  				else if (g == "multiPolygonProperty" || g == "polygonProperty" ) {
  					geomType = "polygon";
  					break;
  				}
  			}
  			log("geomType = "+geomType);
  
  
  			setScreenEditMenu(geomType); // set the appropriate html for editing
  
  			clearInterval(myInterval); // cancel the interval timer
  		}
  		else
  			log("undefined");
  		
  	},300);
  	
  }
  
  
  function setScreenEditMenu(geomType)
  {
  	editForm = "";
  	if (geomType == "point")
  		editForm = generatePointForm();
  	else if (geomType == "line")
  		editForm = generateLineForm();
  	else if (geomType == "polygon")
  		editForm = generatePolygonForm();
  	
  	document.getElementById('mainEditDiv').innerHTML = editForm;
  }
  
  function generatePointForm()
  {
  	result = "";
  	result += '<tr><td colspan=4><b><u><font size="+1">Label names for the points:</font></u></b><br></td></tr>';
  	result += '<tr><td width=200 colspan=4><b>Name Field:</b> '+generateNameSelect()+' <i><font color="#92AEFF" size="-1">(This field is the label that will appear on the geometry.)</font></i></td></tr>';
  	result += '<tr><td width=200 colspan=4><b>Text Color:</b> '+generateColorPicker("labelColor")+' <i><font color="#92AEFF" size="-1">(This is the color of the label.)</font></i></td></tr>';
  
  	result += '<tr><td colspan=4><br><hr><b><u><font size="+1">Color of the points:</font></u></b></td></tr>';
  
  	result += '<tr><td width=120 align="right"><b>Color:</b></td><td width=100>'+generateColorPicker("fillColor")+'</td>';
  	result += '<td width=120 align="right"><b>Opacity:</b></td><td width=140><input type="text" id="fillOpacity" size=3 maxlength=3 value="1"></input> <i><font color="#92AEFF" size="-1">(0.0 - 1.0)</font></i></td></tr>';
  
  	result += '<tr><td colspan=4><br><hr><b><u><font size="+1">Point size and shape:</font></u></b><br></td></tr>';
  
  	result += '<tr><td width=200 colspan=4><b>Point Size:</b> <input type="text" id="pointSize" size=6 maxlength=6></input> <i><font color="#92AEFF" size="-1">(The diameter of the point in pixels.)</font></i><br>&nbsp;</td></tr>';
  	result += '<tr><td width=200 colspan=4><b>Point Shape:</b> <select name="pointShape" id="pointShape"> ';
  		result += '<option>circle</option>';
  		result += '<option>square</option>';
  		result += '</select>';
  	result += '</td></tr>';
  
  	return result;
  }
  
  function generateLineForm()
  {
  	result = "";
  	result += '<tr><td colspan=4><b><u><font size="+1">Label names for the lines:</font></u></b><br></td></tr>';
  	result += '<tr><td width=200 colspan=4><b>Name Field:</b> '+generateNameSelect()+' <i><font color="#92AEFF" size="-1">(This field is the label that will appear on the geometry.)</font></i></td></tr>';
  	result += '<tr><td width=200 colspan=4><b>Text Color:</b> '+generateColorPicker("labelColor")+' <i><font color="#92AEFF" size="-1">(This is the color of the label.)</font></i></td></tr>';
  
  	result += '<tr><td colspan=4><br><hr><b><u><font size="+1">Color of the lines:</font></u></b><br></td></tr>';
  
  	result += '<tr><td width=150 align="right"><b>Color:</b></td><td width=100>'+generateColorPicker("lineColor")+'</td>';
  	result += '<td width=150 align="right"><b>Opacity:</b></td><td width=140><input type="text" id="lineOpacity" size=3 maxlength=3 value="1"></input> <i><font color="#92AEFF" size="-1">(0.0 - 1.0)</font></i></td></tr>';
  	
  	result += '<tr><td colspan=4><br><hr><b><u><font size="+1">Line dimentions:</font></u></b><br></td></tr>';
  
  	result += '<tr><td width=200 colspan=4><b>Line width:</b> <input type="text" id="lineWidth" size=6 maxlength=6></input> <i><font color="#92AEFF" size="-1">(The width, or thickness, of the line in pixles.)</font></i><br>&nbsp;</td></tr>';
  
  	return result;
  }
  
  function generatePolygonForm()
  {
  	result = "";
  	result += '<tr><td colspan=4><b><u><font size="+1">Label names for the polygons:</font></u></b><br></td></tr>';
  	result += '<tr><td width=200 colspan=4><b>Name Field:</b> '+generateNameSelect()+' <i><font color="#92AEFF" size="-1">(This field is the label that will appear on the geometry.)</font></i><br>&nbsp;</td></tr>';
  	result += '<tr><td width=200 colspan=4><b>Text Color:</b> '+generateColorPicker("labelColor")+' <i><font color="#92AEFF" size="-1">(This is the color of the label.)</font></i></td></tr>';
  
  	result += '<tr><td colspan=4><br><hr><b><u><font size="+1">Color inside the polygons:</font></u></b><br></td></tr>';
  
  	result += '<tr><td width=120 align="right"><b>Fill Color:</b></td><td width=150>'+generateColorPicker("fillColor")+'&nbsp;&nbsp;&nbsp;&nbsp;</td>';
  	result += '<td width=120 align="right"><b>Fill Opacity:</b></td><td><input type="text" id="fillOpacity" size=3 maxlength=3 value="1"></input> <i><font color="#92AEFF" size="-1">(0.0 - 1.0)</font></i></td></tr>';
  	
  	result += '<tr><td colspan=4><br><hr><b><u><font size="+1">Outline color of the polygons:</font></u></b><br></td></tr>';
  
  	result += '<tr><td width=120 align="right"><b>Outline Color:</b></td><td width=150>'+generateColorPicker("lineColor")+'&nbsp;&nbsp;&nbsp;&nbsp;</td>';
  	result += '<td width=120 align="right"><b>Outline Opacity:</b></td><td><input type="text" id="lineOpacity" size=3 maxlength=3 value="1"></input> <i><font color="#92AEFF" size="-1">(0.0 - 1.0)</font></i></td></tr>';
  
  	return result;
  }
  
  
  function generateColorPicker(colorFieldName)
  {
  	
  	result = '<input name="'+colorFieldName+'" id="'+colorFieldName+'" size="7" ';
  	result += 'onChange="relateColor(\''+colorFieldName+'\', this.value);"> ';
  	result += '<script language="javascript">relateColor(\'pick'+colorFieldName+'\', getObj(\''+colorFieldName+'\').value);</scr'+'ipt> ';
  	result += '<a href="javascript:pickColor(\''+colorFieldName+'\');" id="pick'+colorFieldName+'" name="pick'+colorFieldName+'" style="border: 1px solid #000000; font-family:Verdana; font-size:10px; ';
  	result += 'text-decoration: none; " ><img src="../../WEB-INF/images/colorpicker.jpg" width=12 height=12 border="none"></a>';
  
  	return result;
  }
  
  /**
   * Generates the <select> form field for column names based on feature type column names.
   */
  function generateNameSelect()
  {
  	formCode = '<select name="propertyName" id="propertyName">';
  	formCode += '<option>none</option>';
  
  	colNamesSplit = columnNames.split(",");
  	for(i=0;i<colNamesSplit.length-1;i++)
  	{
  		if (colNamesSplit[i] != null && colNamesSplit[i] != "")
  		{
  			formCode += '<option>'+colNamesSplit[i]+'</option>';
  		}
  	}
  	
  	formCode += "</select>";
  
  	return formCode;
  }
  
  
  /**
   *
   * This is the main function that reads in the form fields and generates 
   * the SLD.
   *
   */
  function generateSLD()
  {
  	featureTypeName = document.getElementById('span_ftName').innerHTML;
  	//alert("featureTypeName: "+featureTypeName);
  	
  	hideSuccessMessage(); // hide the SLD success message
  
  	SLD="";
  	SLD += createSLDHeader(featureTypeName);
  
  	SLDcore = ""
  	if (geomType == "point")
  		SLDcore += generatePointSLD();
  	else if (geomType == "line")
  		SLDcore += generateLineSLD();
  	else if (geomType == "polygon")
  		SLDcore += generatePolygonSLD();
  	
  	matches = SLDcore.match("ERROR:");
  	if (matches != null && matches.length > 0)
  	{
  		alert(SLDcore);	// alert the user with the error and return
  		return;
  	}
  
  	
  	SLD += SLDcore; // append the code if there were no errors
  
  	SLD += createSLDFooter();
  
  	log("SLD:\n"+SLD);
  	saveStyle(SLD); // send it using PutStyles request
  }
  
  /**
   * Point SLD generation
   */
  function generatePointSLD()
  {
  	propertyName = document.getElementById('propertyName').value;
  	labelColor = document.getElementById('labelColor').value;
  	fillColor = document.getElementById('fillColor').value;
  	fillOpacity = document.getElementById('fillOpacity').value;
  	pointSize = document.getElementById('pointSize').value;
  	pointShape = document.getElementById('pointShape').value;
  
  	if (labelColor.length == 6)
  		labelColor = '#'+labelColor;
  	if (fillColor.length == 6)
  		fillColor = '#'+fillColor;
  
  	var font;
  	var halo;
  
  	// check values to make sure they are in range and valid
  	if (propertyName != "none" && (labelColor == null || labelColor == "") )
  		return "ERROR: label name specified, but no text color specified.";
  	if (labelColor == null || labelColor == "")
  		return "ERROR: Label color cannot be empty";
  	if (labelColor.length != 7)
  		return "ERROR: Label color must be 7 characters long in hexadecimal (#00ff23).";
  	if (fillColor == null || fillColor == "")
  		return "ERROR: Point color cannot be empty";
  	if (fillColor.length != 7)
  		return "ERROR: Point color must be 7 characters long in hexadecimal (#00ff23).";
  	if (fillOpacity == null || fillOpacity == "")
  		return "ERROR: Point opacity cannot be empty";
  	if (fillOpacity < 0.0 || fillOpacity > 1.0)
  		return "ERROR: Point opacity must be between 0.0 and 1.0";
  	if (pointSize == null || pointSize == "")
  		return "ERROR: Point size cannot be empty";
  
  
  	// create stroke
  	var stroke;
  	//stroke = createStroke(lineColor, lineOpacity);
  
  	pointFill = createFill(fillColor, fillOpacity);
  	graphicMark = createGraphic(pointShape, pointFill, stroke, pointSize, 1.0);
  
  	SLDr = createSLDPointSymbolizer(graphicMark);
  
  	textFont = createFont("Times New Roman", "Normal", 12);
  
  	textFill = createFill(labelColor, 1.0);
  
  	if (propertyName != null && propertyName != "none")
  		SLDr += createTextSymbolizer(propertyName, textFont, halo, textFill);
  
  	return SLDr;
  }
  
  /**
   * Line SLD generation
   */
  function generateLineSLD()
  {
  	propertyName = document.getElementById('propertyName').value;
  	labelColor = document.getElementById('labelColor').value;
  	lineColor = document.getElementById('lineColor').value;
  	lineOpacity = document.getElementById('lineOpacity').value;
  	lineWidth = document.getElementById('lineWidth').value;
  
  	if (labelColor.length == 6)
  		labelColor = '#'+labelColor;
  	if (lineColor.length == 6)
  		lineColor = '#'+lineColor;
  
  	var halo;
  
  	// check values to make sure they are in range and valid
  	if (propertyName != "none" && (labelColor == null || labelColor == "") )
  		return "ERROR: label name specified, but no text color specified.";
  	if (labelColor == null || labelColor == "")
  		return "ERROR: Label color cannot be empty";
  	if (labelColor.length != 7)
  		return "ERROR: Label color must be 7 characters long in hexadecimal (#00ff23).";
  	if (lineColor == null || lineColor == "")
  		return "ERROR: Line color cannot be empty";
  	if (lineColor.length != 7)
  		return "ERROR: Line color must be 7 characters long in hexadecimal (#00ff23).";
  	if (lineOpacity == null || lineOpacity == "")
  		return "ERROR: Line opacity cannot be empty";
  	if (lineOpacity < 0.0 || lineOpacity > 1.0)
  		return "ERROR: Line opacity must be between 0.0 and 1.0";
  	if (lineWidth == null || lineWidth == "")
  		return "ERROR: Line width cannot be empty";
  	if (lineWidth < 0)
  		return "ERROR: Line width must be a positive number";
  
  
  	// create stroke
  	stroke = createStroke(lineColor, lineOpacity, lineWidth);
  	
  	SLDr = createSLDLineSymbolizer(stroke);
  
  	textFont = createFont("Times New Roman", "Normal", 12);
  
  	textFill = createFill(labelColor, 1.0);
  
  	if (propertyName != null && propertyName != "none")
  		SLDr += createTextSymbolizer(propertyName, textFont, halo, textFill);
  
  	return SLDr;
  }
  
  function generatePolygonSLD()
  {
  	propertyName = document.getElementById('propertyName').value;
  	labelColor = document.getElementById('labelColor').value;
  	fillColor = document.getElementById('fillColor').value;
  	fillOpacity = document.getElementById('fillOpacity').value;
  	lineColor = document.getElementById('lineColor').value;
  	lineOpacity = document.getElementById('lineOpacity').value;
  	
  	if (labelColor.length == 6)
  		labelColor = '#'+labelColor;
  	if (fillColor.length == 6)
  		fillColor = '#'+fillColor;
  	if (lineColor.length == 6)
  		lineColor = '#'+lineColor;
  	
  	var halo;
  
  	// check values to make sure they are in range and valid
  	if (propertyName != "none" && (labelColor == null || labelColor == "") )
  		return "ERROR: label name specified, but no text color specified.";
  	if (labelColor == null || labelColor == "")
  		return "ERROR: Label color cannot be empty";
  	if (labelColor.length != 7)
  		return "ERROR: Label color must be 7 characters long in hexadecimal (#00ff23).";
  	if (fillColor == null || fillColor == "")
  		return "ERROR: Polygon fill color cannot be empty";
  	if (fillColor.length != 7)
  		return "ERROR: Polygon fill color must be 7 characters long in hexadecimal (#00ff23).";
  	if (fillOpacity == null || fillOpacity == "")
  		return "ERROR: Polygon color opacity cannot be empty";
  	if (fillOpacity < 0.0 || fillOpacity > 1.0)
  		return "ERROR: Polygon fill opacity must be between 0.0 and 1.0";
  	if (lineColor == null || lineColor == "")
  		return "ERROR: Polygon outline color cannot be empty";
  	if (lineColor.length != 7)
  		return "ERROR: Polygon outline color must be 7 characters long in hexadecimal (#00ff23).";
  	if (lineOpacity == null || lineOpacity == "")
  		return "ERROR: Polygon outline opacity cannot be empty";
  	if (lineOpacity < 0.0 || lineOpacity > 1.0)
  		return "ERROR: Polygon outline opacity must be between 0.0 and 1.0";
  
  	// create fill
  	polygonFill = createFill(fillColor, fillOpacity);
  
  	// create stroke
  	stroke = createStroke(lineColor, lineOpacity);
  
  	XMLr = createSLDPolygonSymbolizer(polygonFill, stroke);
  
  	textFill = createFill(labelColor, 1.0);
  
  	textFont = createFont("Times New Roman", "Normal", 12);
  
  	if (propertyName != null && propertyName != "none")
  		XMLr += createTextSymbolizer(propertyName, textFont, halo, textFill);
  
  	return XMLr;
  }
  
  /**
   * Perform the putStyles request
   */
  function saveStyle(SLD)
  {
  	log("Saving style");
  	//kill any current requests!
  	if (geo_xmlhttp !=null)
  	{
  		geo_xmlhttp.abort();
  		geo_xmlhttp = null;
  	}
  
  	// build XML POST query
  	URL  = "/geoserver/wms?request=putstyles";//"http://"+SERVERHOSTNAME+"/
  
  	getXML(URL,SLD,XMLProgressFunction);
  	
  }
  
  function createSLDHeader(featureType)
  {
  	log("Making sld for: "+featureType);
  	XML  = '<?xml version="1.0" encoding="UTF-8"?>'+"\n";
  	XML += '<StyledLayerDescriptor version="1.0.0"'+"\n";
  	XML += '	xmlns:gml="http://www.opengis.net/gml"'+"\n";
  	XML += '	xmlns:ogc="http://www.opengis.net/ogc"'+"\n";
  	XML += '	xmlns="http://www.opengis.net/sld">'+"\n";
  	XML += '	<NamedLayer>'+"\n";
  	XML += '		<Name>'+featureType+'</Name>'+"\n";
  	XML += '		<UserStyle>'+"\n";
  	XML += '			<Name>'+featureType+'_style</Name>'+"\n";
  	XML += '			<Title>geoserver style</Title>'+"\n";
  	XML += '			<Abstract>Generated by GeoServer</Abstract>'+"\n";
  	XML += '			<FeatureTypeStyle>'+"\n";
  	XML += '			<Rule>'+"\n";
  	//log(XML);
  	return XML;
  }
  
  
  function createSLDFooter()
  {
  	XML   = '			</Rule>'+"\n";
  	XML  += '			</FeatureTypeStyle>'+"\n";
  	XML  += '		</UserStyle>'+"\n";
  	XML  += '	</NamedLayer>'+"\n";
  	XML  += '</StyledLayerDescriptor>';
  
  	return XML;
  }
  
  function createSLDPointSymbolizer(graphic)
  {
  	XML  = '				<PointSymbolizer>'+"\n";
  	XML += '					'+graphic+"\n";
  	XML += '				</PointSymbolizer>'+"\n";
  
  	return XML;
  
  }
  
  function createSLDLineSymbolizer(stroke)
  {
  	XML  = '				<LineSymbolizer>'+"\n";
  	XML += stroke;
  	XML += '				</LineSymbolizer>'+"\n";
  
  	return XML;
  }
  
  function createSLDPolygonSymbolizer(fill, stroke)
  {
  	XML  = '				<PolygonSymbolizer>'+"\n";
  	XML += fill;
  	XML += stroke;
  	XML += '				</PolygonSymbolizer>'+"\n";
  
  	return XML;
  }
  
  function createFill(color, opacity)
  {
  	// add # to front of 'color'
  	if(color.charAt(0) != "#")
  		color = "#"+color;
  
  	XML  = '					<Fill>'+"\n";
  	XML += '						<CssParameter name="fill">'+color+'</CssParameter>'+"\n";
  	XML += '						<CssParameter name="fill-opacity">'+opacity+'</CssParameter>'+"\n";
  	XML += '					</Fill>'+"\n";
  
  	return XML;
  }
  
  function createStroke(color, opacity, width, linecap, linejoin, dasharray)
  {
  	// add # to front of 'color'
  	if(color.charAt(0) != "#")
  		color = "#"+color;
  
  	XML  = '					<Stroke>'+"\n";
  	if(color)	XML += '						<CssParameter name="stroke">'+color+'</CssParameter>'+"\n";
  	if(opacity)	XML += '						<CssParameter name="stroke-opacity">'+opacity+'</CssParameter>'+"\n";
  	if(width)	XML += '						<CssParameter name="stroke-width">'+width+'</CssParameter>'+"\n";
  	if(linecap)	XML += '						<CssParameter name="stroke-linecap">'+linecap+'</CssParameter>'+"\n";
  	if(linejoin)XML += '						<CssParameter name="stroke-linejoin">'+linejoin+'</CssParameter>'+"\n";
  	if(dasharray)XML += '						<CssParameter name="stroke-dasharray">'+dasharray+'</CssParameter>'+"\n";
  	XML += '					</Stroke>'+"\n";
  
  	return XML;
  }
  
  // a note to figure out all possible line caps
  function getLineCaps()
  {
  
  }
  
  // a note to figure out all possible line joins
  function getLineJoins()
  {
  
  }
  
  function createGraphic(shape, fill, stroke, size, opacity)
  {
  	XML = '<Graphic>'+"\n";
  	XML += '	<Mark>'+"\n";
  	XML += '		<WellKnownName>'+shape+'</WellKnownName>'+"\n";
  	XML += fill;
  	if(stroke) XML += stroke;
  	XML += '	</Mark>'+"\n";
  	XML += '	<Opacity>'+opacity+'</Opacity>'+"\n";
  	XML += '	<Size>'+size+'</Size>'+"\n";
  	XML += '</Graphic>'+"\n";
  
  	return XML;
  }
  
  
  function createTextSymbolizer(columnName, font, halo, fill)
  {
  	XML  = '				<TextSymbolizer>'+"\n";
  	XML += '					<Label>'+"\n";
  	XML += '						<ogc:PropertyName>'+columnName+'</ogc:PropertyName>'+"\n";
  	XML += '					</Label>'+"\n";
  	if(font) XML += font;
  	if(halo) XML += halo;
  	if(fill) XML += fill;
  	XML += '				</TextSymbolizer>'+"\n";
  
  
  	return XML;
  }
  
  function createFont(name, style, size, weight)
  {
  	XML  = '						<Font>'+"\n";
  	XML += '							<CssParameter name="font-family">'+name+'</CssParameter>'+"\n";
  	XML += '							<CssParameter name="font-style">'+style+'</CssParameter>'+"\n";
  	XML += '							<CssParameter name="font-size">'+size+'</CssParameter>'+"\n";
  	if (weight)XML += '							<CssParameter name="font-weight">'+weight+'</CssParameter>'+"\n";
  	XML += '						</Font>'+"\n";
  
  	return XML;
  }
  
  function createHalo(radius, fill)
  {
  	XML  = '						<Halo>'+"\n";
  	XML += '							<Radius>'+"\n";
  	XML += '								<ogc:Literal>'+radius+'</ogc:Literal>'+"\n";
  	XML += '							</Radius>'+"\n";
  	XML += fill;
  	XML += '						</Halo>'+"\n";
  
  	return XML;
  }
  
  
  function createMinScaleDenominator(scale)
  {
  	XML = '<MinScaleDenominator>'+scale+'</MinScaleDenominator>'+"\n";
  
  	return XML;
  }
  
  function createMaxScaleDenominator(scale)
  {
  	XML = '<MaxScaleDenominator>'+scale+'</MaxScaleDenominator>'+"\n";
  
  	return XML;
  }
  
  
  /**
   * Send the XML request to GeoServer. Hands off control to procfunction method passed in.
   */
  function getXML(url,post,procfunction)
  {
  	try {
  
  		if (window.ActiveXObject)
  		{
  			// IE
  			log("getXML through IE");
  			geo_xmlhttp =  new ActiveXObject("Microsoft.XMLHTTP");
  			geo_xmlhttp.onreadystatechange = procfunction;
  			geo_xmlhttp.open("POST", url, true);
  			geo_xmlhttp.setRequestHeader('Content-Type', 'text/xml');  //correct request type
  			geo_xmlhttp.setRequestHeader('Cache-Control', 'no-cache');	// don't cache the requests!!!
  			//geo_xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  			geo_xmlhttp.send(post);
  		}
  		else if (window.XMLHttpRequest)
  		{
  			
  			// Mozilla and others
  			//log("getXML through Mozilla etc.");
  			geo_xmlhttp =  new XMLHttpRequest();
  			//geo_xmlhttp.overrideMimeType('text/xml');	// <- bad? caused some serious problems at one point
  			geo_xmlhttp.onreadystatechange = procfunction;
  			geo_xmlhttp.open("POST", url, true);
  			geo_xmlhttp.setRequestHeader('Content-Type', 'text/xml');	//correct request type
  			geo_xmlhttp.setRequestHeader('Cache-Control', 'no-cache');	// don't cache the requests!!!
  			geo_xmlhttp.send(post);
  		}
  		else
  			log("Invalid browser format: not expecting this kind of browser.");
  	 }
  	 catch(e)
  	 {
  		alert(e);
  		alert("If you just got a security exception, its because you need to serve the .html file from the same server as where you're sending the XML requests to!");
  	 }
  }
  
  
  
  /**
   * Waits for requests and handles them.
   */
  function XMLProgressFunction()
  {
  	if (geo_xmlhttp != null)
  	{	// add 'working' animation
  		hideSuccessMessage();
  	}
  
  	if ( (geo_xmlhttp.readyState == 4) && (geo_xmlhttp.status == 200) )
  	{
  		log("XML reponse received");
  		//we got a good response.  We need to process it!
  		if (geo_xmlhttp.responseXML == null)
  		{
  			log("XMLProgressFunction(): abort 1");
  			//document.getElementById('working_anim_gnis_span').innerHTML = '';	// remove 'working' animation
  			return;
  		}
  
  		log("response:\n"+geo_xmlhttp.responseText);
  
  		// ug, temporary hack just so I can get it working
  		if (window.ActiveXObject)
  		{
  			val = geo_xmlhttp.responseText.indexOf("success");
  
  			if (val > -1)
  			{
  				enableSuccessMessage();
  				log("PutStyles successful");
  			}
  		}
  		else
  		{
  			success_node = getElements(geo_xmlhttp.responseXML,"sld","success")[0];
  			if (success_node != null)
  			{
  				enableSuccessMessage();
  				log("PutStyles successful");
  			}
  		}
  	}
  	else
  		log("waiting for response...");
  }
  
  /**
   * Browser capabilities: prefixes for IE
   * Inspect for IE first. If you do mozilla first, it will just be mozilla and IE will die
   */
  function getElements(node,tag_prefix,tag_name)
  {
  	if (window.ActiveXObject)
  	{
  		//IE has no idea of namespaces/prefixes
  		log("parsing IE");
  		return node.getElementsByTagName(tag_prefix+":"+tag_name);
      }
      else if (window.XMLHttpRequest)
      {
         //mozilla
         return node.getElementsByTagName(tag_name);
      }
      else
  		log("Unsupported browser format: not expecting this kind of browser.");
      
  }
  
  function enableSuccessMessage()
  {
  	if (document.all) // if IE
  	{
  		log("ie put");
  		doc = document.getElementById('sld_success').getElementsByTagName('span')[0];
  		doc.innerHTML = '<b><font color="#22ff33" size="+1">Success</font></b>';
  		
  	}
  	else
  		document.getElementById('inner_sld_success').innerHTML = "<b><font color=\"#22ff33\" size=\"+1\">Success</font></b>";
  }
  
  function hideSuccessMessage()
  {
  	if (document.all) // if IE
  	{
  		doc = document.getElementById('sld_success').getElementsByTagName('span')[0];
  		doc.innerHTML = '';
  	}
  	else
  		document.getElementById('inner_sld_success').innerHTML = "";
  }
  
  /**
   * Log to screen
   */
  function log(text)
  {
  	IFrameElement = document.getElementsByName("logFrame")[0];
  
  	//get doc
  	if (IFrameElement.contentDocument)
  	{
  		IFrameDoc = IFrameElement.contentDocument;
  	}
  	else if (IFrameElement.contentWindow)
  	{
  		IFrameDoc = IFrameElement.contentWindow.document;
  	}
  	else if (IFrameElement.document)
  	{
  		IFrameDoc = IFrameElement.document;
  	}
  	else
  	{
  		return true;
  	}
  
  
       //put a <div><pre></pre></div>
  	if (IFrameDoc.body.getElementsByTagName("div")[0] ==null)
  	{
  
   	   divNode = IFrameDoc.createElement("div");
   	   preNode = IFrameDoc.createElement("pre");
   	   preNode.appendChild(IFrameDoc.createTextNode(""));
   	   divNode.appendChild(preNode);
  
         IFrameDoc.body.appendChild(divNode);
  
  
         //alert(IFrameDoc.body.getElementsByTagName("div")[0] );
  	}
  
  
  	// add the text
  	//<div><pre>  text<br>  </pre></div>
  	preNode = IFrameDoc.body.getElementsByTagName("pre")[0];
  
  	textNode = IFrameDoc.createTextNode(text) ;
  
  	preNode.appendChild(  textNode  );
  	preNode.appendChild(  IFrameDoc.createElement("br")  );
  	//  textNode.scrollIntoView(true);
  }
  
  /**
   * For killing form 'action' functionality. Cheap hack, I'm sure there are better ways to do it.
   * Also for killing link tags.
   */
  function nothing()
  {
  }
  
  
  
  // Flooble Color Picker
  // Color Picker Script from Flooble.com
  // For more information, visit 
  //	http://www.flooble.com/scripts/colorpicker.php
  // Copyright 2003 Animus Pactum Consulting inc.
  // You may use and distribute this code freely, as long as
  // you keep this copyright notice and the link to flooble.com
  // if you chose to remove them, you must link to the page
  // listed above from every web page where you use the color
  // picker code.
  //---------------------------------------------------------
       var perline = 15;
       var divSet = false;
       var curId;
       var colorLevels = Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
       var colorArray = Array();
       var ie = false;
       var nocolor = 'none';
  	 if (document.all) { ie = true; nocolor = ''; }
  	 function getObj(id) {
  		if (ie) { return document.all[id]; } 
  		else {	return document.getElementById(id);	}
  	 }
  
       function addColor(r, g, b) {
       	var red = colorLevels[r];
       	var green = colorLevels[g];
       	var blue = colorLevels[b];
       	addColorValue(red, green, blue);
       }
  
       function addColorValue(r, g, b) {
       	colorArray[colorArray.length] = '#' + r + r + g + g + b + b;
       }
       
       function setColor(color) {
       	var link = getObj('pick'+curId);
       	var field = getObj(curId);// + 'field'
       	var picker = getObj('colorpicker');
       	field.value = color;
       	if (color == '') {
  			link.innerHTML="&nbsp;&nbsp;&nbsp;";
  	     	link.style.background = nocolor;
  	     	link.style.color = nocolor;
  	     	color = nocolor;
       	} else {
  			link.innerHTML="&nbsp;&nbsp;&nbsp;";
  	     	link.style.background = color;
  	     	link.style.color = color;
  	    }
       	picker.style.display = 'none';
  	    eval(getObj(curId).title);// + 'field'
       }
          
       function setDiv() {     
       	if (!document.createElement) { return; }
          var elemDiv = document.createElement('div');
          if (typeof(elemDiv.innerHTML) != 'string') { return; }
          genColors();
          elemDiv.id = 'colorpicker';
  	    elemDiv.style.position = 'absolute';
          elemDiv.style.display = 'none';
          elemDiv.style.border = '#000000 1px solid';
          elemDiv.style.background = '#FFFFFF';
          elemDiv.innerHTML = '<span style="font-family:Verdana; font-size:11px;">Pick a color: ' 
            	+ '(<a href="javascript:setColor(\'\');">No color</a>)<br>' 
          	+ getColorTable() 
          	+ '<center><a href="http://www.flooble.com/scripts/colorpicker.php"'
          	+ ' target="_blank">color picker</a> by <a href="http://www.flooble.com" target="_blank"><b>flooble</b></a></center></span>';
  
          document.body.appendChild(elemDiv);
          divSet = true;
       }
       
       function pickColor(id) {
       	if (!divSet) { setDiv(); }
       	var picker = getObj('colorpicker');     	
  		if (id == curId && picker.style.display == 'block') {
  			picker.style.display = 'none';
  			return;
  		}
       	curId = id;
       	var thelink = getObj(id);
       	picker.style.top = getAbsoluteOffsetTop(thelink) + 20;
       	picker.style.left = getAbsoluteOffsetLeft(thelink);     
  	picker.style.display = 'block';
       }
       
       function genColors() {
          addColorValue('0','0','0');
  		//addColorValue('1','1','1');
  		addColorValue('2','2','2');
          addColorValue('3','3','3');
  		addColorValue('4','4','4');
  		addColorValue('5','5','5');
          addColorValue('6','6','6');
  		addColorValue('7','7','7');
          addColorValue('8','8','8');
          addColorValue('9','9','9');
          addColorValue('A','A','A');
  		addColorValue('B','B','B');
          addColorValue('C','C','C');
  		addColorValue('D','D','D');
          addColorValue('E','E','E');
          addColorValue('F','F','F');
  			
          for (a = 1; a < colorLevels.length; a++)
  			addColor(0,0,a);
          for (a = 1; a < colorLevels.length - 1; a++)
  			addColor(a,a,5);
  
          for (a = 1; a < colorLevels.length; a++)
  			addColor(0,a,0);
          for (a = 1; a < colorLevels.length - 1; a++)
  			addColor(a,5,a);
  			
          for (a = 1; a < colorLevels.length; a++)
  			addColor(a,0,0);
          for (a = 1; a < colorLevels.length - 1; a++)
  			addColor(5,a,a);
  			
  			
          for (a = 1; a < colorLevels.length; a++)
  			addColor(a,a,0);
          for (a = 1; a < colorLevels.length - 1; a++)
  			addColor(5,5,a);
  			
          for (a = 1; a < colorLevels.length; a++)
  			addColor(0,a,a);
          for (a = 1; a < colorLevels.length - 1; a++)
  			addColor(a,5,5);
  
          for (a = 1; a < colorLevels.length; a++)
  			addColor(a,0,a);			
          for (a = 1; a < colorLevels.length - 1; a++)
  			addColor(5,a,5);
  			
         	return colorArray;
       }
       function getColorTable() {
           var colors = colorArray;
        	 var tableCode = '';
           tableCode += '<table border="0" cellspacing="1" cellpadding="1">';
           for (i = 0; i < colors.length; i++) {
                if (i % perline == 0) { tableCode += '<tr>'; }
                tableCode += '<td bgcolor="#000000"><a style="outline: 1px solid #000000; color: ' 
                	  + colors[i] + '; background: ' + colors[i] + ';font-size: 10px;" title="' 
                	  + colors[i] + '" href="javascript:setColor(\'' + colors[i] + '\');">&nbsp;&nbsp;&nbsp;</a></td>';
                if (i % perline == perline - 1) { tableCode += '</tr>'; }
           }
           if (i % perline != 0) { tableCode += '</tr>'; }
           tableCode += '</table>';
        	 return tableCode;
       }
       function relateColor(id, color) {
       	var link = getObj(id);
       	if (color == '') {
  	     	link.style.background = nocolor;
  	     	link.style.color = nocolor;
  	     	color = nocolor;
       	} else {
  	     	link.style.background = color;
  	     	link.style.color = color;
  	    }
  	    eval(getObj(id + 'field').title);
       }
       function getAbsoluteOffsetTop(obj) {
       	var top = obj.offsetTop;
       	var parent = obj.offsetParent;
       	while (parent != document.body) {
       		top += parent.offsetTop;
       		parent = parent.offsetParent;
       	}
       	return top;
       }
       
       function getAbsoluteOffsetLeft(obj) {
       	var left = obj.offsetLeft;
       	var parent = obj.offsetParent;
       	while (parent != document.body) {
       		left += parent.offsetLeft;
       		parent = parent.offsetParent;
       	}
       	return left;
       }
  
  
  
  -->
  </script>
  <!-- ================================ -->
  <!-- --- END -- JAVASCRIPT ---------- -->
  <!-- ================================ -->
  
  
  
  
  <body onload="setup()" text="#AAC0FF">
  
  <font color="#08809F" size="+2"><b>Create new SLD for FeatureType: &nbsp;<i><span id="span_ftName" name="span_ftName"><bean:write property="<%= "typeName" %>" name="typesEditorForm"/></span></font></i></b>
  <br>&nbsp;<br>
  
  <span id="hidden_ft_attrs" name="hidden_ft_attrs" style="display:none"><bean:write property="<%= "attributes" %>" name="typesEditorForm" /></span>
  
  <span id="hidden_ft_attrNames" name="hidden_ft_attrNames" style="display:none">
  <logic:iterate id="attribute" indexId="index" name="typesEditorForm" property="attributes">
  	<bean:write name="attribute" property="name"/>,
  </logic:iterate>
  </span>
  
  
  
  <!--bean:write property="<%= "attributes" %>" name="typesEditorForm" /-->
  <form action="javascript:nothing()">
  	<table width=650 bgcolor="#7C8DBF">
  		<tr><td>
  			<div id="mainEditDiv" name="mainEditDiv">
  			</div>
  		</td></tr>
  	</table>
  	<i><font color="#770000">* All fields are required.</font></i><br>&nbsp;<br>
  	
  	<input type="submit" value="Apply Style" onclick="generateSLD()">
  	<div id="sld_success"><span id="inner_sld_success" name="inner_sld_success"></span></div>
  </form>
  
  
  <font color="#222222"><i>You must apply the style before it will be saved.<br>
  Hit the 'Apply Style' button above'.</i></font><be>
  
  <!-- finished button "back to FeatureType editor" -->
  <form action="/geoserver/config/data/typeEditor.do">
  	<input type="submit" value="Finished">
  </form>
  
  <p>&nbsp;<br>
  <span><iframe width=90% height=150px name=logFrame></iframe></span><!-- style="display:none"-->
  <br>
  
  
  
  
  </body>
  
  </html>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/SystemConfigMenu.jsp
  
  Index: SystemConfigMenu.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  
  <span class="systemConfigMenu">
  	<html:link forward="wfsConfigMenu"><bean:message key="label.wfsConfig"/></html:link><BR>
  	<html:link forward="wmsConfigMenu"><bean:message key="label.wmsConfig"/></html:link><BR>
  	<html:link forward="dataConfigMenu"><bean:message key="label.dataConfig"/></html:link><BR>
  </span>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/Welcome.jsp
  
  Index: Welcome.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <logic:notPresent name="org.apache.struts.action.MESSAGE" scope="application">
    <span class="error">
      ERROR:  Application resources not loaded -- check servlet container
      logs for error messages.
    </span>
  </logic:notPresent>
  
  </span>
  
  <p>
  <bean:message key="text.welcome1"/>
  </p>
  
  <!--p>
  <bean:message key="text.welcome2"/>
  </p-->
  
  <!--p>
  <bean:message key="text.welcome3"/>
  </p-->
  
  <p>
  <bean:message key="text.welcome5"/>
  </p>
  
  <ul>
    <li>
      <a href="http://docs.codehaus.org/display/GEOSDOC/Documentation">
        Documentation
      </a>
    </li>
    <li>
      <a href="http://docs.codehaus.org/display/GEOS/Home">
        Wiki
      </a>
    </li>
    <li>
      <a href="http://jira.codehaus.org/secure/BrowseProject.jspa?id=10311">
        Task Tracker
      </a>
     </li>
     <li>
      <a href="http://www.moximedia.com:8080/imf-ows/imf.jsp?site=gs_users">
        User Map
      </a>
    </li>
  </ul>
  
  <p>
  	<bean:message key="text.visitDemoPage"/>
  </p>
  
  	&nbsp;&nbsp;<a href="../../../wfs?service=WFS&request=GetCapabilities">WFS Capabilities</a>
  	<br>
  	&nbsp;&nbsp;<a href="../../../wms?service=WMS&request=GetCapabilities">WMS Capabilities</a>
  
  <br>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/actionator.jsp
  
  Index: actionator.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  <%@ taglib uri="/tags/struts-tiles" prefix="tiles" %>
  <%@ page import="org.apache.struts.action.*" %>
  
  <logic:notEmpty name="actionForwards">
    <table class="actions">
      <tbody>
  <%  // Access actionForwards - could not figure out how to with tags
      String forwards = (String) request.getAttribute("actionForwards");
      String[] array = forwards.split(":"); 
  	
      for (int index = 0; index < array.length; index ++) {
  %>
        <tr>
          <td>
  <%  String forward = array[ index ];
      if( forward.length() == 0 ){
  %>
            <hr/>
  <%  }
      else if (forward.startsWith("/")) {
          String action = forward.substring(1);
  %>
            <html:link style="action"
                       action="<%= action %>">
              <%= action %>
            </html:link>
  <%  }
      else {
  %>              
            <html:link style="action"
                       forward="<%= forward %>"
                       titleKey="<%= forward+".short" %>">
              <bean:message key="<%= forward+".label" %>"/>
            </html:link>
  <%  }
  %>          
          </td>
        </tr>
  <%  } %>
      </tbody>
    </table>
  </logic:notEmpty>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/blank.jsp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/configActions.jsp
  
  Index: configActions.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table class="state" width="100%">
    <tbody>
      <tr>
        <td class="node">
          GeoServer
  <logic:equal name="GeoServer.ApplicationState" property="appChanged" value="true">
          *
  </logic:equal>
        </td>
        <td class="timestamp">
  <logic:notEmpty name="GeoServer.ApplicationState" property="appTimestamp">
          <bean:write name="GeoServer.ApplicationState"
                      property="appTimestamp"
                      format="MMM d, h:mm a"/>
  </logic:notEmpty>
  <logic:empty name="GeoServer.ApplicationState" property="appTimestamp">
          --
  </logic:empty>
        </td>      
      </tr>
      <tr>
        <td class="node">
          Configuration        
  <logic:equal name="GeoServer.ApplicationState" property="configChanged" value="true">
          *
  </logic:equal>        
        </td>
        <td class="timestamp">
  <logic:notEmpty name="GeoServer.ApplicationState" property="configTimestamp">
          <bean:write name="GeoServer.ApplicationState"
                property="configTimestamp"
                format="MMM d, h:mm a"/>
  </logic:notEmpty>
  <logic:empty name="GeoServer.ApplicationState" property="configTimestamp">
          --
  </logic:empty>
        </td>
      </tr>
      <tr>
        <td class="node">
          XML        
        </td>
        <td class="timestamp">
  <logic:notEmpty name="GeoServer.ApplicationState" property="xmlTimestamp">
          <bean:write name="GeoServer.ApplicationState"
                      property="xmlTimestamp"
                      format="MMM d, h:mm a"/>
  </logic:notEmpty>
  <logic:empty name="GeoServer.ApplicationState" property="xmlTimestamp">
          --
  </logic:empty>
        </td>
      </tr>
    </tbody>
  </table>
  
  <table class="control">
    <tbody>
      <tr>
        <td>
          <html:form action="/admin/saveToGeoServer">
            <html:submit>
              <bean:message key="label.apply"/>
            </html:submit>
          </html:form>
        </td>
        <td>
          <html:form action="/admin/saveToXML">	
            <html:submit>
              <bean:message key="label.save"/>
            </html:submit>
          </html:form>
        </td>
        <td>
          <html:form action="/admin/loadFromXML">			
            <html:submit>
              <bean:message key="label.load"/>
            </html:submit>
          </html:form>
        </td>
      </tr>
    </tbody>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/demoRequest.jsp
  
  Index: demoRequest.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table class="info">
    <tbody>
      <tr>
        <td class="label">request:</td>
        <td class="datum">
          <html:form action="/demoRequestSubmit">
          
            <html:select property="demo">
  			<html:options property="demoList"/>
  		  </html:select>
  		  <html:submit property="action">
  			<bean:message key="label.change"/>
  		  </html:submit>  
          </html:form>		  
        </td>
      </tr>
      <form action="<%=org.vfny.geoserver.util.Requests.getBaseUrl(request)%>TestWfsPost" method="POST">    
        <tr>
          <td class="label">url:</td>
          <td class="datum">
            <input type="text" size="90" name="url" value="<bean:write name="demoRequestForm" property="url"/>">
          </td>
        </tr>
        <tr>
          <td class="label">body:</td>
          <td class="datum">
            <textarea rows="10" cols="90" name="body"><bean:write name="demoRequestForm" property="body"/></textarea>
          </td>
        </tr>    
        <tr>
          <td class="label"></td>
          <td class="datum">
            <html:submit><bean:message key="label.submit"/></html:submit>
          </td>
        </tr>
      </form>      
    </tbody>
  </table>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/index.jsp
  
  Index: index.jsp
  ===================================================================
  <html>
  <head><title>GeoServer - Loading</title>
    <meta content="text/css" http-equiv="content-style-type">
    <style type="text/css">
      <!-- @import url("/geoserver/style.css"); -->
    </style>
    <link type="image/gif" href="gs.gif" rel="icon"><!-- mozilla --> 
    <link href="gs.ico" rel="SHORTCUT ICON"><!-- ie -->
  </head>
  <body onload="javascript:window.location.replace('welcome.do')"><br><center>
  <table width="60%" height="60%"><tr><td>
  <center>
    <span class="project">
      <a href="http://geoserver.sourceforge.net/">GeoServer</a>
    </span>
    <span class="license">
      <a href="http://geoserver.sourceforge.net/documentation/developer/license.htm">&copy;</a>
    </span>
    <h1>LOADING ...</h1>
  <center><br>
  <center><h2>Please Wait</h2><center>
  <center><h2>0% Completed</h2><center>
  </table></td></tr>
  </center></body>
  </html>
  		
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/locator.jsp
  
  Index: locator.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  <%@ taglib uri="/tags/struts-tiles" prefix="tiles" %>
  <%@ page import="org.apache.struts.action.*" %>
  
  <span class="locator">
    <logic:notEmpty name="locationForwards">
  	<%
  		String forwards = (String) request.getAttribute("locationForwards");
  		String[] array = forwards.split(":");
  		
  		for (int index = 0; index < array.length; index ++) {
  			%>
  			<html:link forward="<%= array[index] %>">
  				<bean:message key="<%= array[ index ]+".label" %>"/>
  			</html:link> |
  			<%
  		}
  	%>
    </logic:notEmpty>
    <bean:message key="<%= request.getAttribute("key")+".label" %>"/>
  </span>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/loginEditor.jsp
  
  Index: loginEditor.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <bean:message key="label.newLoginAndPassword"/>:<br>
  
  <html:form action="/config/loginEditSubmit">
    <table class="info">
      <tbody>
        <tr>
          <td class="label"><bean:message key="label.username"/>:</td>
          <td class="datum">
            <html:text size="60" property="username"/>        
          </td>      
        </tr>
        <tr>
          <td class="label"><bean:message key="label.password"/>:</td>
          <td class="datum">
            <html:password size="60" property="password"/>        
          </td>      
        </tr>    
        <!--tr>
          <td class="label"><bean:message key="label.password.confirm"/>:</td>
          <td class="datum">
            <html:password size="60" property="confirm"/>        
          </td>      
        </tr-->    
        <tr>
          <td class="label"></td>
          <td class="datum">
            <html:submit><bean:message key="label.submit"/></html:submit><html:reset><bean:message key="label.reset"/></html:reset>        
          </td>      
        </tr>    
      </tbody>
    </table>
  </html:form>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/mainPreview.html
  
  Index: mainPreview.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><title>GeoServer Welcome to GeoServer</title>
      
      <meta content="text/html; charset=iso-8859-1" http-equiv="content-type">
      <meta content="text/css" http-equiv="content-style-type">  
      <meta name="description" content="GeoServer Application Welcome">
      <meta name="keywords" content="(GeoServer) (GIS) (Geographic Information Systems) (GeoServer) (GIS) (Geographic Information Systems)">
      <meta name="author" content="Jody Garnett, Richard Gould, David Zwiers">
    
      <style type="text/css">
        <!-- @import url("style.css"); -->
      </style>
    
      <link type="image/gif" href="http://localhost:8080/geoserver/images/gs.gif" rel="icon">
      <link href="http://localhost:8080/geoserver/images/gs.ico" rel="SHORTCUT ICON">
      <!-- base href="http://localhost:8080/geoserver/WEB-INF/pages/layouts/mainLayout.jsp" --></head>
  
  
  
  
  
  
  
  
  
  
  
  
  
  
    <body>
    
  <!-- Security Check (for non application layers -->
  
      
  <table class="page">
    <tbody>
  	<tr class="header">
          <td class="gutter">
            <span class="project">
              <a href="http://geoserver.sourceforge.net/">
                GeoServer
              </a>
            </span>
            <span class="license">
              <a href="http://geoserver.sourceforge.net/documentation/developer/license.htm">©</a>
            </span>
  		</td>
          <td style="width: 1em;">
          </td>
  		<td style="vertical-align: bottom; white-space: nowrap;">
            <span class="site">
  
  
                Metacat Spatial - Geoserver 
              
            </span>			
  		</td>	
  		<td style="vertical-align: bottom; white-space: nowrap; text-align: right;">
  			<span class="contact">
  			   <a href="http://geoserver.sourceforge.net/documentation/developer/contrib.htm">Credits</a>
  			</span>
                  
          </td>
  	</tr>
  	
      <tr>
        <td class="sidebar">
          
  
  
  
  <table class="status">
  
  
  	<tbody><tr>
  		<td class="module">
  			WFS:
  		</td>
  		<td style="">
  			<table class="progress">
  			  <tbody>
  		        <tr>
  		        
  		    	    <td class="good" width="100%" title="100%">
  		    	    </td><td>
  		    	
  		        		            
  		        		                   
  		        </td></tr>
  		      </tbody>
  		     </table>
  		</td>
  	</tr>
  
  
  
  	<tr>
  		<td class="module">
  			WMS:
  		</td>
  		<td class="health">
  			<table class="progress">
  			  <tbody>
  		        <tr>
  		        
  		    	    <td class="good" width="100%" title="100%">
  		    	    </td>
  		    	
  		        		            
  		        		                   
  		        </tr>
  		      </tbody>
  		     </table>
  		</td>
  	</tr>
  
  
  </tbody></table>	
          
          
  
  
  
  
  
  
          
  
  
  <span class="messages">
  	
  </span>
        </td>
        <td style="width: 1em;">
        </td>      
        <td style="vertical-align: top;" rowspan="1" colspan="2">
              
          <table class="main">
            <tbody>
              <tr class="bar">
                <td class="locator">
                  
  
  
  
  
  
  <span class="locator">
    
    Welcome
  </span>
                </td>
                <td class="loginStatus">
                  <span class="loginStatus">                  
  
                      <a href="http://localhost:8080/geoserver/admin/logout.do">Logout</a>
                    
                    
                  </span>
                </td>
              </tr>
            	<tr>
                <td class="application" rowspan="1" colspan="2">
                  <table class="title">
                    <tbody>
                      <tr>
                        <td class="menu">
                          
  
  
  
  
  
  
    <table class="menu">
      <tbody>
  
        <tr>
          <td>
                
            <a href="http://localhost:8080/geoserver/admin/index.do" style="" title="Administration of running GeoServer application">Admin</a>
            
          </td>
        </tr>
  
        <tr>
          <td>
                
            <a href="http://localhost:8080/geoserver/config/index.do" style="" title="Configuration of GeoServer application">Config</a>
            
          </td>
        </tr>
  
      </tbody>
    </table>
  
                        </td>
                        <td class="title">
                          <h1 class="title">
                            Welcome to GeoServer
                          </h1>
                          <p class="abstract">
                            GeoServer Application Welcome
                          </p>
                        </td>
                        <td class="icon"></td>
                      </tr>    
                    </tbody>
                  </table>
                  
  
  
  
  
  
  
  
  <h2>
    The Open Planning Project Basemap Server
  </h2>
  <p>
    This is a test server.  It contains some basemap data 
  from New York City.
  </p>
  <ul>
    <li>
      <a href="http://localhost:8080/geoserver/wfs/getCapabilities">getCapabilities</a>
    </li>
    <li>
      <a href="http://localhost:8080/geoserver/wfs/TestWfsPost">TestWfsPost</a>
    </li>
  </ul>
  
  <h2>
    The Open Planning Project Basemap Server
  </h2>
  <p>
    This is a test server.  It contains some basemap data 
  from New York City.
  </p>
  
  <ul>
    <li>
      <a href="http://localhost:8080/geoserver/wms/getCapabilities">getCapabilities</a>
    </li>
  </ul>                
                </td>
  	        </tr>
            </tbody>
  	    </table>
        </td>
  	</tr>
    </tbody>
  </table>
  
  </body></html>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/mainPreviewData.html
  
  Index: mainPreviewData.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><title>GeoServer DataStore Editor</title>
      
      <meta content="text/html; charset=iso-8859-1" http-equiv="content-type">
      <meta content="text/css" http-equiv="content-style-type">  
      <meta name="description" content="Edit a source of spatial information">
      <meta name="keywords" content="(GeoServer) (GIS) (Geographic Information Systems) (Configure) (Database) (Shapefile) (Spatial Data) (Data)">
      <meta name="author" content="Jody Garnett, Richard Gould, David Zwiers">
    
      <style type="text/css">
        <!-- @import url("style.css"); -->
      </style>
    
      <link type="image/gif" href="http://localhost:8080/geoserver/images/gs.gif" rel="icon">
      <link href="http://localhost:8080/geoserver/images/gs.ico" rel="SHORTCUT ICON">
      <!-- base href="http://localhost:8080/geoserver/WEB-INF/pages/layouts/mainLayout.jsp" --></head>
  
  
  
  
  
  
  
  
  
  
  
  
  
  
    <body>
    
  <!-- Security Check (for non application layers -->
    
    
  
      
  <table class="page">
    <tbody>
  	<tr class="header">
          <td class="gutter">
            <span class="project">
              <a href="http://geoserver.sourceforge.net/">
                GeoServer
              </a>
            </span>
            <span class="license">
              <a href="http://geoserver.sourceforge.net/documentation/developer/license.htm">©</a>
            </span>
  		</td>
          <td style="width: 1em;">
          </td>
  		<td style="vertical-align: bottom; white-space: nowrap;">
            <span class="site">
  
  
                Metacat Spatial - GeoServer
              
            </span>			
  		</td>	
  		<td style="vertical-align: bottom; white-space: nowrap; text-align: right;">
  			<span class="contact">
  			   <a href="http://geoserver.sourceforge.net/documentation/developer/contrib.htm">Credits</a>
  			</span>
                  
          </td>
  	</tr>
  	
      <tr>
        <td class="sidebar">
          
  
  
  
  <table class="status">
  
  	<tbody><tr>
  		<td class="module">
  			Data:
  		</td>
  		<td class="health">
              <table class="progress">
  			  <tbody>
  		        <tr>
  		        
  		    	    <td class="good" width="100%" title="100%">
  		    	        </td>
  		    	
  		        		            
  		        		                   
  		        </tr>
  		      </tbody>
  		    </table>
  		</td>
  	</tr>
  </tbody></table>	
          
  
  
  
  <table class="state" width="100%">
    <tbody>
      <tr>
        <td class="node">
          GeoServer
  
        </td>
        <td class="timestamp">
  
          Dec 31, 4:00 PM
  
  
        </td>      
      </tr>
      <tr>
        <td class="node">
          Configuration        
          
        </td>
        <td class="timestamp">
  
          Dec 31, 4:00 PM
  
  
        </td>
      </tr>
      <tr>
        <td class="node">
          XML        
        </td>
        <td class="timestamp">
  
          Dec 31, 4:00 PM
  
  
        </td>
      </tr>
    </tbody>
  </table>
  
  <table class="control">
    <tbody>
      <tr>
        <td>
          <form name="blankBean" method="post" action="/geoserver/admin/saveToGeoServer.do">
            <input type="submit" value="Apply">
          </form>
        </td>
        <td>
          <form name="blankBean" method="post" action="/geoserver/admin/saveToXML.do">	
            <input type="submit" value="Save">
          </form>
        </td>
        <td>
          <form name="blankBean" method="post" action="/geoserver/admin/loadFromXML.do">			
            <input type="submit" value="Load">
          </form>
        </td>
      </tr>
    </tbody>
  </table>
          
  
  
  
  
  
  
          
  
  
  <span class="messages">
  	
  </span>
        </td>
        <td style="width: 1em;">
        </td>      
        <td style="vertical-align: top;" rowspan="1" colspan="2">
              
          <table class="main">
            <tbody>
              <tr class="bar">
                <td class="locator">
                  
  
  
  
  
  
  <span class="locator">
    
  	
  			<a href="http://localhost:8080/geoserver/welcome.do">Welcome</a> |
  			
  			<a href="http://localhost:8080/geoserver/config/index.do">Config</a> |
  			
  			<a href="http://localhost:8080/geoserver/config/data/index.do">Data</a> |
  			
  			<a href="http://localhost:8080/geoserver/config/data/store.do">Stores</a> |
  			
    
    Edit
  </span>
                </td>
                <td class="loginStatus">
                  <span class="loginStatus">                  
  
                      <a href="http://localhost:8080/geoserver/admin/logout.do">Logout</a>
                    
                    
                  </span>
                </td>
              </tr>
            	<tr>
                <td class="data" rowspan="1" colspan="2">
                  <table class="title">
                    <tbody>
                      <tr>
                        <td class="menu">
                          
  
  
  
  
  
  
                        </td>
                        <td class="title">
                          <h1 class="title">
                            DataStore Editor
                          </h1>
                          <p class="abstract">
                            Edit a source of spatial information
                          </p>
                        </td>
                        <td class="icon"></td>
                      </tr>    
                    </tbody>
                  </table>
                  
  
  
  
  
  
  <form name="dataDataStoresEditorForm" method="post" action="/geoserver/config/data/storeSubmit.do">
    <table class="info">	
  	<tbody><tr>
  	  <td class="label">
  		<span class="help" title="A unique datastore identifier.">
  			DataStore ID:
  		</span>
  	  </td>
  	  <td class="datum">
  		cblf--BasicPolygons
  	  </td>
  	</tr>	
  	<tr>
  	  <td class="label">
  		<span class="help" title="Checked to enable this datastore">
            Enabled:
          </span>
        </td>
  	  <td class="datum">
  		<input type="checkbox" name="enabled" value="on" checked="checked">
  	  </td>
  	</tr>	
  	<tr>
  	  <td class="label">
  		<span class="help" title="A namespace Prefix to associate with this DataStore.">
  			Namespace:
  		</span>
        </td>
  	  <td class="datum">
  		<select name="namespaceId"><option value="cblf" selected="selected">cblf</option><option value="cdf">cdf</option><option value="cgf">cgf</option></select>
  	  </td>
  	</tr>	
  	<tr>
  	  <td class="label">
  		<span class="help" title="A short description about this data store.">
  			Description:
  		</span>
        </td>
  	  <td class="datum">
  		<textarea name="description" cols="60" rows="2"></textarea>
  	  </td>
  	</tr>
  
  
      <tr>
  	  <td class="label">
          <span class="help" title="url to a .shp file">
            url:
  		</span>
        </td>
  	  <td class="datum">
  
            <input type="text" name="paramValues[0]" size="60" value="file:data/featureTypes/cblf--BasicPolygons/BasicPolygons.shp">
  
  			             
  	  </td>
  	</tr>
  
  	
  	<tr>
  	  <td class="label"> </td>
  	  <td class="datum">
  		<input type="submit" value="Submit">
  		
  		<input type="reset" value="Reset">
  	  </td>
  	</tr>						
    </tbody></table>
  </form>
                  
                </td>
  	        </tr>
            </tbody>
  	    </table>
        </td>
  	</tr>
    </tbody>
  </table>
  
  </body></html>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/mapPreview.jsp
  
  Index: mapPreview.jsp
  ===================================================================
  <%@ page contentType="text/html; charset=UTF-8" %>
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <!---   
            This JSP expect to have a:
            
            <form-bean 
  	    name="mapPreviewForm" 
  	    type="org.apache.struts.action.DynaActionForm">
  	    <form-property 
  	        name="DSNameList"
  	        type="java.lang.String[]" 
  	    />
  	    <form-property 
  	        name="FTNameList" 
  	        type="java.lang.String[]" 
  	    />
  	    <form-property 
  	        name="BBoxList" 
  	        type="java.lang.String[]" 
  	    />
  	    </form-bean>
  	
  	   given to it.  
  	   The DSNameList list is a list of strings - these are the 
  	   names of the data stores for the FeatureType.
  	   The FTNameList is the list of FeatureTypes represented
  	   as strings.
  	   The BBoxList contains the bounding box coordinates of 
  	   the feature type represented as a string.
    --->
  
  <!-- ALL THIS STUFF TAKEN FROM MAINLAYOUT.JSP -->
  <!------------------------------------------------------------------------>
  <html:html locale="true" xhtml="true">
    <head>
      <title>
        <bean:message key="geoserver.logo"/>
        Geoserver
      </title>
      <meta content="text/html; charset=iso-8859-1" http-equiv="content-type"/>
      <meta content="text/css" http-equiv="content-style-type"/>  
      <meta name="keywords"
            content="(GeoServer) (GIS) (Geographic Information Systems)"/>
      <meta name="author" content="Brent Owens"/>
    
      <style type="text/css">
        <!-- @import url("<html:rewrite forward='style'/>"); -->
      </style>
    
      <link type="image/gif" href="<html:rewrite forward='icon'/>" rel="icon"/>
      <link href="<html:rewrite forward='favicon'/>" rel="SHORTCUT ICON"/>
      <html:base/>
    </head>
    <body>
   <table class="page">
    <tbody>
  	<tr class="header">
          <td class="gutter">
            <span class="project">
              <a href="<bean:message key="link.geoserver"/>">
                <bean:message key="geoserver.logo"/>
              </a>
            </span>
            <span class="license">
              <a href="<bean:message key="link.license"/>">&copy;</a>
            </span>
  		</td>
          <td style="width: 1em">
          </td>
  		<td style="vertical-align: bottom; white-space: nowrap;">
            <span class="site">
  <logic:notEmpty name="GeoServer" property="title">
                <bean:write name="GeoServer" property="title"/>
  </logic:notEmpty>
  <logic:empty name="GeoServer" property="title">
                <bean:message key="message.noTitle"/>
  </logic:empty>            
            </span>			
  		</td>	
  		<td style="vertical-align: bottom; white-space: nowrap; text-align: right;">
  			<span class="contact">
  			   <a href="<bean:message key="label.credits.url"/>"><bean:message key="label.credits"/></a>
  			</span>
  <logic:notEmpty name="GeoServer" property="contactParty">
              <span class="contact">		
                <bean:message key="label.contact"/>: 	
                <html:link forward="contact">
                  <bean:write name="GeoServer" property="contactParty"/>
                </html:link>
              </span>            
  </logic:notEmpty>                
          </td>
  	</tr>
  	</table>
  <!------------------------------------------------------------------------>
  
  <h1> <bean:message key="mapPreview.title"/> </h1>
  
  <!------------------------------------------------------------------------>
  <!-- DISPLAY THE LIST OF FEATURE TYPES AND THEIR INFORMATION             ->
  <!------------------------------------------------------------------------>
  
  
  <table border=1 width=90%>
  
    <tr><th><B><U>Layer</U> (NameSpace:FeatureType)</B></th><th><B><U>DataStore</U></B><!--bean:message key="mapPreview.tableTitle"/--></th><th><B><U>Preview Map</U></B></th></tr>
    
    
  <!-- This iterator take idx from 0 to however many items there are in the list.
       I use the index to grab the data from the 3 input lists (see above).
       The it_value is ignored.
    -->
   <logic:iterate id="it_value" indexId="idx" name="mapPreviewForm" property="DSNameList">
   
  	<tr >
  	     <td width=30%>
  				<center><b>
  				<a href="../../preview/<bean:write property="<%= "FTNameList[" + idx + "]" %>" name="mapPreviewForm"/>.html" target="_blank"><bean:write property="<%= "FTNamespaceList[" + idx + "]" %>" name="mapPreviewForm"/></a>
  				</b></center>
  	     </td>
  	     <td class="greyedOut2" width=15%>
  				 <center><bean:write property="<%= "DSNameList[" + idx + "]" %>" name="mapPreviewForm"/></center>
  	     </td>
  	<!--td class="greyedOut2" width=45%>
  	
  				<b>MinX, MinY, MaxX, MaxY</b><br>
  				<bean:write property="<%= "BBoxList[" + idx + "]" %>" name="mapPreviewForm"/>
  		 </td-->
  		 <td width=10%>
  			<!-- add link to FTNameList.html -->
  			<center><b>
  			<a href="../../preview/<bean:write property="<%= "FTNameList[" + idx + "]" %>" name="mapPreviewForm"/>.html" target="_blank">Preview</a>
  			
  			</b></center>
  		 </td>
  	</tr>
  </logic:iterate>
  </table>
  
  </body>
  </html:html>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/menuator.jsp
  
  Index: menuator.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  <%@ taglib uri="/tags/struts-tiles" prefix="tiles" %>
  <%@ page import="org.apache.struts.action.*" %>
  
  <logic:notEmpty name="menuForwards">
    <table class="menu">
      <tbody>
  <%  // Access menuForwards - could not figure out how to with tags
      String forwards = (String) request.getAttribute("menuForwards");
      String[] array = forwards.split(":"); 
      for (int index = 0; index < array.length; index ++) {
  %>
        <tr>
          <td>
  <%  String forward = array[ index ];
      if( forward.length() == 0 ){
  %>
            <hr/>
  <%  }
      else if (forward.startsWith("/")) {
          String action = forward.substring(1);
  %>
            <html:link style="item"
                       action="<%= action %>">
              <%= action %>
            </html:link>
  <%  }
      else {
  %>              
            <html:link style="item"
                       forward="<%= forward %>"
                       titleKey="<%= forward+".short" %>">
              <bean:message key="<%= forward+".label" %>"/>
            </html:link>
  <%  }
  %>          
          </td>
        </tr>
  <%  } %>
      </tbody>
    </table>
  </logic:notEmpty>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/messages.jsp
  
  Index: messages.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  
  <span class="messages">
  	<html:errors/>
  </span>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/schemaErrors.jsp
  
  Index: schemaErrors.jsp
  ===================================================================
  <%@ page contentType="text/html; charset=UTF-8" %>
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <!-- This .jsp expects to have a "StylesEditorForm" bean called "dataStylesEditorForm" available. Inside the bean are: -->
  <!--     String[] validationReport -->
  
  
  
  <!-- ALL THIS STUFF TAKEN FROM MAINLAYOUT.JSP -->
  <!------------------------------------------------------------------------>
  <html:html locale="true" xhtml="true">
    <head>
      <title>
        <bean:message key="geoserver.logo"/>
        Geoserver
      </title>
      <meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
      <meta content="text/css" http-equiv="content-style-type"/>  
      <meta name="keywords"
            content="(GeoServer) (GIS) (Geographic Information Systems)"/>
      <meta name="author" content="David Blasby"/>
    
      <style type="text/css">
        <!-- @import url("<html:rewrite forward='style'/>"); -->
      </style>
    
      <link type="image/gif" href="<html:rewrite forward='icon'/>" rel="icon"/>
      <link href="<html:rewrite forward='favicon'/>" rel="SHORTCUT ICON"/>
      <html:base/>
    </head>
    <body>
   <table class="page">
    <tbody>
  	<tr class="header">
          <td class="gutter">
            <span class="project">
              <a href="<bean:message key="link.geoserver"/>">
                <bean:message key="geoserver.logo"/>
              </a>
            </span>
            <span class="license">
              <a href="<bean:message key="link.license"/>">&copy;</a>
            </span>
  		</td>
          <td style="width: 1em">
          </td>
  		<td style="vertical-align: bottom; white-space: nowrap;">
            <span class="site">
  <logic:notEmpty name="GeoServer" property="title">
                <bean:write name="GeoServer" property="title"/>
  </logic:notEmpty>
  <logic:empty name="GeoServer" property="title">
                <bean:message key="message.noTitle"/>
  </logic:empty>            
            </span>			
  		</td>	
  		<td style="vertical-align: bottom; white-space: nowrap; text-align: right;">
  			<span class="contact">
  			   <a href="<bean:message key="label.credits.url"/>"><bean:message key="label.credits"/></a>
  			</span>
  <logic:notEmpty name="GeoServer" property="contactParty">
              <span class="contact">		
                <bean:message key="label.contact"/>: 	
                <html:link forward="contact">
                  <bean:write name="GeoServer" property="contactParty"/>
                </html:link>
              </span>            
  </logic:notEmpty>                
          </td>
  	</tr>
  	</table>
  <!------------------------------------------------------------------------>
  
  <!-- Print everything out! -->
            
  <h1><bean:message key="sldValididity.title"/></h1>
  <a href=<bean:message key="sldValiditity.help.url"/>><bean:message key="sldValiditity.help.text"/></a>
  <br>          
  <pre>
  <logic:iterate id="it_value"  name="dataStylesEditorForm" property="validationReport"><logic:match name="it_value" location="start" value=" "><font color=red><b></logic:match>
  <bean:write name="it_value"/><logic:match name="it_value" location="start" value=" "></font></b></logic:match></logic:iterate>
  </pre>         
            
  
  <!------------------------------------------------------------------------>
  </body>
  </html:html>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/srsList.jsp
  
  Index: srsList.jsp
  ===================================================================
  <%@ page contentType="text/html; charset=UTF-8" %>
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <!---   
            This JSP expect to have a:
            
            <form-bean 
  	    name="srsInfoForm" 
  	    type="org.apache.struts.action.DynaActionForm">
  	    <form-property 
  	        name="srsDefinitionList"
  	        type="java.lang.String[]" 
  	    />
  	    <form-property 
  	        name="srsIDList" 
  	        type="java.lang.String[]" 
  	    />
  	</form-bean>
  	
  	   given to it.  The id list is a list of integers (as strings) - these are the EPSG:# codes.
  	   The Definition list is the WKT of that EPSG code.
    --->
  
  <!-- ALL THIS STUFF TAKEN FROM MAINLAYOUT.JSP -->
  <!------------------------------------------------------------------------>
  <html:html locale="true" xhtml="true">
    <head>
      <title>
        <bean:message key="geoserver.logo"/>
        Geoserver
      </title>
      <meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
      <meta content="text/css" http-equiv="content-style-type"/>  
      <meta name="keywords"
            content="(GeoServer) (GIS) (Geographic Information Systems)"/>
      <meta name="author" content="David Blasby"/>
    
      <style type="text/css">
        <!-- @import url("<html:rewrite forward='style'/>"); -->
      </style>
    
      <link type="image/gif" href="<html:rewrite forward='icon'/>" rel="icon"/>
      <link href="<html:rewrite forward='favicon'/>" rel="SHORTCUT ICON"/>
      <html:base/>
    </head>
    <body>
   <table class="page">
    <tbody>
  	<tr class="header">
          <td class="gutter">
            <span class="project">
              <a href="<bean:message key="link.geoserver"/>">
                <bean:message key="geoserver.logo"/>
              </a>
            </span>
            <span class="license">
              <a href="<bean:message key="link.license"/>">&copy;</a>
            </span>
  		</td>
          <td style="width: 1em">
          </td>
  		<td style="vertical-align: bottom; white-space: nowrap;">
            <span class="site">
  <logic:notEmpty name="GeoServer" property="title">
                <bean:write name="GeoServer" property="title"/>
  </logic:notEmpty>
  <logic:empty name="GeoServer" property="title">
                <bean:message key="message.noTitle"/>
  </logic:empty>            
            </span>			
  		</td>	
  		<td style="vertical-align: bottom; white-space: nowrap; text-align: right;">
  			<span class="contact">
  			   <a href="<bean:message key="label.credits.url"/>"><bean:message key="label.credits"/></a>
  			</span>
  <logic:notEmpty name="GeoServer" property="contactParty">
              <span class="contact">		
                <bean:message key="label.contact"/>: 	
                <html:link forward="contact">
                  <bean:write name="GeoServer" property="contactParty"/>
                </html:link>
              </span>            
  </logic:notEmpty>                
          </td>
  	</tr>
  	</table>
  <!------------------------------------------------------------------------>
  
  <h1> <bean:message key="srsList.title"/> </h1>
  
  <!------------------------------------------------------------------------>
  <!-- DISPLAY THE LIST OF SRS AND THEIR DEFINITIONS                       ->
  <!------------------------------------------------------------------------>
  
  
  <table border=1 width=95%>
  
    <tr><th>EPSG #</th><th><bean:message key="srsList.tableTitle"/></th></tr>
    
    
  <!-- This iterator take idx from 0 to however many items there are in the list.
       I use the index to grab the data from the 2 input lists (see above).
       The it_value is ignored.
    -->
   <logic:iterate id="it_value" indexId="idx" name="srsInfoForm" property="srsIDList">
  	<tr>
  	     <td>
  	          <bean:write property="<%= "srsIDList[" + idx + "]" %>" name="srsInfoForm"/>
  	     </td>
  	     <td class="greyedOut2">
  	          <bean:write property="<%= "srsDefinitionList[" + idx + "]" %>" name="srsInfoForm"/>
  	     </td>
  	</tr>
  </logic:iterate>
  </table>
  
  </body>
  </html:html>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/status.jsp
  
  Index: status.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table class="status">
  
  <logic:equal name="WFS" property="enabled" value="true">
  	<tr>
  		<td class="module">
  			<bean:message key="config.wfs.label"/>:
  		</td>
  		<td style="health">
  			<table class="progress">
  			  <tbody>
  		        <tr>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wfsGood" value="0">
  		    	    <td class="good"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wfsGood"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wfsGood"/>%">
  		    	    </td>
  		    	</logic:notEqual>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wfsBad" value="0">		    	
  		    	    <td class="bad"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wfsBad"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wfsBad"/>%">
  		    	    </td>
  		    	</logic:notEqual>		            
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wfsDisabled" value="0">		    	
  		    	    <td class="disabled"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wfsDisabled"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wfsDisabled"/>%">
  		    	    </td>
  		    	</logic:notEqual>		                   
  		        </tr>
  		      </tbody>
  		     </table>
  		</td>
  	</tr>
  </logic:equal>
  
  <logic:equal name="WMS" property="enabled" value="true">
  	<tr>
  		<td class="module">
  			<bean:message key="config.wms.label"/>:
  		</td>
  		<td class="health">
  			<table class="progress">
  			  <tbody>
  		        <tr>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wmsGood" value="0">
  		    	    <td class="good"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wmsGood"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wmsGood"/>%">
  		    	    </td>
  		    	</logic:notEqual>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wmsBad" value="0">		    	
  		    	    <td class="bad"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wmsBad"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wmsBad"/>%">
  		    	    </td>
  		    	</logic:notEqual>		            
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wmsDisabled" value="0">		    	
  		    	    <td class="disabled"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wmsDisabled"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wmsDisabled"/>%">
  		    	    </td>
  		    	</logic:notEqual>		                   
  		        </tr>
  		      </tbody>
  		     </table>
  		</td>
  	</tr>
  </logic:equal>
  
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/styleClassic.css
  
  Index: styleClassic.css
  ===================================================================
  /* GeoServer Default Style */
  body {
   font-size: 90%;
   margin: 0ex;
   color: #000;
   font-family: tahoma, verdana, sans, arial, helvetica, sans-serif;
   background: rgb(240,230,220);
  }
  a:visited,
  a:link {
   color: rgb(102,102,153);
   text-decoration: none;
  }
  a:hover {
   color: rgb(102,102,153);
   text-decoration: underline;
  }
  table.page {
   text-align: left;
   width: 100%;
   cellspacing: 0;
   cellpadding: 0;
  }
  tr.header {
   vertical-align: bottom;
   white-space: nowrap;
  }
  td.gutter {
   width: 12em;
   min-width: 12em; 
   white-space: nowrap; 
  }
  .project {
   font-size: 110%;
   font-weight: bold;
   font-style: italic;
   color: rgb(102,102,153);
  }
  .license {
   font-size: 90%;
   font-weight: normal;
   font-style: italic;
   color: rgb(102,102,153);
  }
  .site {
   font-size: 110%;
   font-weight: bold;
   font-style: normal;
   padding: .5ex 1ex 0ex 0ex; 
  }
  .contact {
   font-size: 90%;
  }
  /*
   * SideBar
   */
  td.sidebar {
   vertical-align: top;
   width: 12em; 
  }
  /*
   * SideBar Actions
   */
  table.actions {
   text-align: left;
   width: 100%;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black;
   border-spacing: 0;
   background: rgb(255,255,0);
   -moz-border-radius: 5px;
   padding: .5ex;  
  }
  table.actions a:visited,
  table.actions a:link {
   color: #000;
   text-decoration: none;
  }
  table.actions a:hover {
   color: #000;
   text-decoration: underline;
  }
  /*
   * SideBar Status
   */
  table.status {
   width: 100%;
  }
  table.status td.module {
   vertical-align: top;
   text-align: right;
   white-space: nowrap;
   width: 10%;
   font-size: 90%; 
  }
  table.status td.health {
   vertical-align: center;
  }
  table.progress {
   cellpadding: 0;
   cellspacing: 0;
   border-width: 1px;
   border-style: raised;
   border-color: black;
   text-align: left;
   width: 100%;
   height: 1em;
  }
  table.progress td.good {
   background-color: green;
  }
  table.progress td.bad {
   background-color: red;
  }
  table.progress td.disabled {
   background-color: gray;
  }
  /*
   * Sidebar Config Actions
   */
  table.state {
   width: 100%;
   font-size: 70%;  
  }
  table.state td.node {
   white-space: nowrap;
   text-align: left;
  }
  table.state td.timestamp {
   white-space: nowrap;
   text-align: right;
  }
  table.control {
   width: 100%;
   font-size: 90%; 
   text-align: left;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black;
   border-spacing: 0;
   background: gray;
   -moz-border-radius: 5px;
   padding: .5ex;  
  }
  /*
   * Header Locator
   */
  td.locator {
   white-space: nowrap; 
   padding: 0.5ex 0 0.5ex 1ex; 
   border-width: 0 0 1px 0;
   border-style: solid;
   border-color: black;
  }
  table.main {
   text-align: left;
   width: 100%;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black;
   border-spacing: 0;
   background: rgb(102,102,153);
   -moz-border-radius: 5px;   
  }
  
  tr.bar {
   color: #ccc;
   vertical-align: center;    
  }
  .bar a:visited,
  .bar a:link {
   color: #fff;
   text-decoration: none;
  }
  .bar a:hover {
   color: #fff;
   text-decoration: underline;
  }
  td.locator {
   white-space: nowrap; 
   padding: 0.5ex 0 0.5ex 1ex; 
   border-width: 0 0 1px 0;
   border-style: solid;
   border-color: black;
  }
  span.locator {
   font-size: 90%;
  }
  td.loginStatus {
   text-align: right;
   padding: 0.5ex 1ex 0.5ex 0; 
   border-width: 0 0 1px 0px;
   border-style: solid;
   border-color: black; 
  }
  span.loginStatus {
   font-size: 90%;
  }
  <!-- title -->
  table.tile {
   white-space: nowrap;
   width: 100%;
   text-align: left;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black;
   border-spacing: 0;
   -moz-border-radius: 5px;
   padding: 0px; 
   margin: 4px; 
  }
  table.title td.title {
   vertical-align: top; 
   padding: 1ex;
  }
  table.title td.icon {
   width: 64px;
   valign: center;
   align: center;
   padding: 2px;
  }
  table.title td.menu {
   font-size: 90%;
   background: rgb(102,102,153);
   width: 12ex;
   vertical-align: top;
   -moz-border-radius: 5 0 0 5; 
   border-width: 1px 1px 1px 1px;
   border-style: solid;
  }
  td.title h1 {
   font-family: tahoma, verdana, sans, arial, helvetica, sans-serif;
   font-size: 170%; 
   white-space: nowrap; 
   margin: 2px;
  }
  <!-- menuator -->
  table.menu {
   width: 12ex;
   vertical-align: top;
   white-space: nowrap; 
  }
  td.item {
   text-align: left;
  }
  .menu a:visited,
  .menu a:link {
   color: #fff;
   text-decoration: none;
  }
  .menu a:hover {
   color: #fff;
   text-decoration: underline;
  }
  td.application {
   vertical-align: top;
   background-color: rgb(255,255,255);  
   -moz-border-radius: 0px 0px 5px 5px;  
  }
  td.application table.title {
   background-color: rgb(225,225,225);
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
   margin: 2px;  
  }
  td.administration {
   background-color: rgb(240,240,240);
   -moz-border-radius: 0px 0px 5px 5px;  
  }
  td.administration table.title {
   background-color: rgb(205,205,205); 
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
   margin: 2px;  
  }
  td.configuration {
   vertical-align: top;
   background-color: rgb(192, 192, 192);
   -moz-border-radius: 0px 0px 5px 5px;  
  }
  td.configuration table.title {
   background-color: rgb(180,180,180);  
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
   margin: 2px;  
  }
  td.data {
   vertical-align: top;
   background-color: rgb(192, 192, 192);
   -moz-border-radius: 0px 0px 5px 5px;  
  }
  td.data table.title {
   background-color: rgb(180,180,180);  
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
   margin: 2px;  
  }
  <!-- Main Page -->
  table.info {
   text-align: left;
   vertical-align: top;
   width: 100%;
   border: 0;
  }
  table.info td.label {
   vertical-align: top;
   text-align: right;
   width: 18ex;
  }
  table.info td.datum {
   vertical-align: top;
  }
  td.datum textarea {
   font-family: serif;
  }
  td.datum text {
   font-family: serif;
  }
  td.datum password {
   font-family: serif;
  }
  
  td.greyedout  {
  font-family: serif;
  text-align: right;
  color:rgb(150,150,150)
  }
  
  td.greyedout2  {
  font-family: serif;
  color:rgb(150,150,150)
  }
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/styleNew.css
  
  Index: styleNew.css
  ===================================================================
  /* GeoServer Default Style */
  /* Colors as follows:
   * RGB
   * Blueish:    rgb(105,151,174);
   * Background: rgb(235,224,206);
   * Light grey: rgb(201,205,211); 
   * Med grey:   rgb(154,154,154);
   * Dark grey:  rgb(104,112,115);
   * Orange:     rgb(229,160, 68);
   * 
   * The font is fine. Readable, basic, good size except for the upper left corner 
   * (Update section)might be a bit too small. Keep the font in black or white, 
   * where appropriate. Perhaps have the title in the orange...
   * Andrea.
   */
  body {
   font-size: 90%;
   margin: 0ex;
   color: #000;
   font-family: tahoma, verdana, sans, arial, helvetica, sans-serif;
   background: rgb(235,224,206);
  }
  a:visited,
  a:link {
   text-decoration: underline;
   color: black;
  }
  a:hover {
   text-decoration: underline;
   color: black;
  }
  table.page {
   text-align: left;
   width: 100%;
   cellspacing: 0;
   cellpadding: 0;
  }
  tr.header {
   vertical-align: bottom;
   white-space: nowrap;
  }
  td.gutter {
   width: 12em;
   min-width: 12em; 
   white-space: nowrap; 
  }
  .project {
   font-size: 110%;
   font-weight: bold;
   font-style: italic;
   color: rgb(105,151,174);
  }
  .license {
   font-size: 90%;
   font-weight: normal;
   font-style: italic;
  }
  .site {
   font-size: 110%;
   font-weight: bold;
   font-style: normal;
   padding: .5ex 1ex 0ex 0ex; 
  }
  .contact {
   font-size: 90%;
  }
  /*
   * SideBar
   */
  td.sidebar {
   vertical-align: top;
   width: 12em; 
  }
  /*
   * SideBar Actions
   */
  table.actions {
   text-align: left;
   width: 100%;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black;
   border-spacing: 0;
   background: rgb(229,160, 68);
   -moz-border-radius: 5px;
   padding: .5ex;  
  }
  table.actions a:visited,
  table.actions a:link {
   color: black;
   text-decoration: none;
  }
  table.actions a:hover {
   color: black;
   text-decoration: underline;
  }
  /*
   * SideBar Status
   */
  table.status {
   width: 100%;
  }
  table.status td.module {
   vertical-align: top;
   text-align: right;
   white-space: nowrap;
   width: 10%;
   font-size: 90%; 
  }
  table.status td.health {
   vertical-align: center;
  }
  table.progress {
   cellpadding: 0;
   cellspacing: 0;
   border-width: 1px;
   border-style: raised;
   border-color: black;
   text-align: left;
   width: 100%;
   height: 1em;
  }
  table.progress td.good {
   background-color: green;
  }
  table.progress td.bad {
   background-color: red;
  }
  table.progress td.disabled {
   background-color: gray;
  }
  /*
   * Sidebar Config Actions
   */
  table.state {
   width: 100%;
   font-size: 70%;  
  }
  table.state td.node {
   white-space: nowrap;
   text-align: left;
  }
  table.state td.timestamp {
   white-space: nowrap;
   text-align: right;
  }
  table.control {
   width: 100%;
   font-size: 90%; 
   text-align: left;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black;
   border-spacing: 0;
   background: gray;
   -moz-border-radius: 5px;
   padding: .5ex;  
  }
  /*
   * Header Locator
   */
  td.locator {
   white-space: nowrap; 
   padding: 0.5ex 0 0.5ex 1ex; 
   border-width: 0 0 1px 0;
   border-style: solid;
   border-color: black;
  }
  table.main {
   text-align: left;
   width: 100%;
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black;
   border-spacing: 0;
   background: rgb(105,151,174);
   -moz-border-radius: 5px;   
  }
  
  tr.bar {
   color: rgb(229,160, 68);
   vertical-align: center;    
  }
  .bar a:visited,
  .bar a:link {
   color: white;
   text-decoration: none;
  }
  .bar a:hover {
   color: white;
   text-decoration: underline;
  }
  td.locator {
   white-space: nowrap; 
   padding: 0.5ex 0 0.5ex 1ex; 
   border-width: 0 0 1px 0;
   border-style: solid;
   border-color: black;
  }
  span.locator {
   font-size: 90%;
  }
  td.loginStatus {
   text-align: right;
   padding: 0.5ex 1ex 0.5ex 0; 
   border-width: 0 0 1px 0px;
   border-style: solid;
   border-color: black; 
  }
  span.loginStatus {
   font-size: 90%;
  }
  <!-- title -->
  table.tile {
   white-space: nowrap;
   width: 100%;
   text-align: left;
   color: rgb(229,160,68); 
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black;
   border-spacing: 0;
   -moz-border-radius: 5px;
   padding: 0px; 
   margin: 4px; 
  }
  table.title td.title {
   vertical-align: top; 
   padding: 1ex;
  }
  table.title td.icon {
   width: 64px;
   valign: center;
   align: center;
   padding: 2px;
  }
  table.title td.menu {
   font-size: 90%;
   background: rgb(105,151,174);
   width: 12ex;
   vertical-align: top;
   -moz-border-radius: 5 0 0 5; 
   border-width: 1px 1px 1px 1px;
   border-style: solid;
   border-color: black; 
  }
  td.title h1 {
   font-family: tahoma, verdana, sans, arial, helvetica, sans-serif;
   font-size: 170%; 
   white-space: nowrap; 
   margin: 2px;
  }
  <!-- menuator -->
  table.menu {
   width: 12ex;
   vertical-align: top;
   white-space: nowrap; 
  }
  td.item {
   text-align: left;
  }
  .menu a:visited,
  .menu a:link {
   color: #fff;
   text-decoration: none;
  }
  .menu a:hover {
   color: #fff;
   text-decoration: underline;
  }
  td.application {
   vertical-align: top;
   background-color: rgb(255,255,255);  
   -moz-border-radius: 0px 0px 5px 5px;  
   padding: 5px;
  }
  td.application table.title {
   background-color: rgb(104,112,115);
   color: rgb(229,160,68); 
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
  }
  td.administration {
   background-color: rgb(204,204,204);
   -moz-border-radius: 0px 0px 5px 5px;
   padding: 5px;   
  }
  td.administration table.title {
   background-color: rgb(104,112,115); 
   color: rgb(229,160,68); 
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px; 
  }
  td.configuration {
   vertical-align: top;
   background-color: rgb(154, 154, 154);
   -moz-border-radius: 0px 0px 5px 5px;  
   padding: 5px; 
  }
  td.configuration table.title {
   background-color: rgb(104,112,115);  
   color: rgb(229,160,68);
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px;
  }
  td.data {
   vertical-align: top;
   background-color: rgb(154, 154, 154);
   -moz-border-radius: 0px 0px 5px 5px;  
   padding: 5px; 
  }
  td.data table.title {
   background-color: rgb(104,112,115);  
   color: rgb(229,160,68);
   width: 100%;
   border-spacing: 0;
   -moz-border-radius: 5px; 
  }
  <!-- Main Page -->
  table.info {
   text-align: left;
   vertical-align: top;
   width: 100%;
   border: 0;
  }
  table.info td.label {
   vertical-align: top;
   text-align: right;
   width: 12ex;
  }
  table.info td.datum {
   vertical-align: top;
  }
  td.datum textarea {
   font-family: serif;
  }
  td.datum text {
   font-family: serif;
  }
  td.datum password {
   font-family: serif;
  }
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/DataConfigDataStoresEditor.jsp
  
  Index: DataConfigDataStoresEditor.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <logic:present name="GEOSERVER.USER" property="dataStoreConfig" scope="session">
  
  <html:form action="/config/data/storeSubmit" onsubmit="return checkspaces(this)">
    <table class="info">	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.dataStore_id"/>">
  			<bean:message key="label.dataStoreID"/>:
  		</span>
  	  </td>
  	  <td class="datum">
  		<bean:write name="dataDataStoresEditorForm" property="dataStoreId"/>
  	  </td>
  	</tr>	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.dataStore_enabled"/>">
            <bean:message key="label.enabled"/>:
          </span>
        </td>
  	  <td class="datum">
  		<html:checkbox property="enabled"/>
  	  </td>
  	</tr>	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.dataStore_nameSpace"/>">
  			<bean:message key="label.namespace"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:select property="namespaceId">
  			<html:options property="namespaces"/>
  		</html:select>
  	  </td>
  	</tr>	
  	<tr>
  	  <td class="label">
  		<span class="help" title="<bean:message key="help.dataStore_description"/>">
  			<bean:message key="label.description"/>:
  		</span>
        </td>
  	  <td class="datum">
  		<html:textarea property="description" cols="60" rows="2"/>
  	  </td>
  	</tr>
  <logic:iterate id="param"
                 indexId="ctr"
                 name="dataDataStoresEditorForm"
                 property="paramKeys">
  	<logic:notEqual name="dataDataStoresEditorForm"
  	                property='<%= "paramKey[" + ctr + "]"%>'
  	                value="dbtype">
      	<tr>
  		  	<td class="label">
  		  		<!-- is this a required field -->
  				<logic:equal name="dataDataStoresEditorForm"
  							property='<%= "paramRequired[" + ctr + "]"%>'
  							value="true">
  					<font color="red">*</font>
  				</logic:equal>
  			
  	        	<span class="help"
  				      title="<bean:write name="dataDataStoresEditorForm"
  				      property='<%= "paramHelp[" + ctr + "]" %>'/>">
  					<bean:write name="dataDataStoresEditorForm" property='<%= "paramKey[" + ctr + "]"%>'/>:
  				</span>
  			</td>
  			<td class="datum">
  				<!-- if it is not a password field -->
  				<logic:notEqual name="dataDataStoresEditorForm"
  				    	        property='<%= "paramKey[" + ctr + "]"%>'
  						        value="passwd">
  				    <!--use the type information to figure out the type of widget to create -->
  					<!-- check for boolean, if so provide a drop down of true false -->
  					<logic:match name="dataDataStoresEditorForm"
  						property='<%= "paramType[" + ctr + "]"%>'
  						value="java.lang.Boolean">
  						
  						<html:select property='<%= "paramValues[" + ctr + "]"%>'>
  							<html:option key="" value=""/>
  							<html:option key="false" value="false"/>
  							<html:option key="true" value="true"/>
  						</html:select>
  					</logic:match>
  					<logic:notMatch name="dataDataStoresEditorForm"
  									property='<%= "paramType[" + ctr + "]"%>'
  									value="java.lang.Boolean">
  						<!-- default to just a text box -->
  						<logic:match name="dataDataStoresEditorForm" property='<%= "paramKey[" + ctr + "]"%>' value="url">
  							<!-- if the value is empty, put an example string -->
  							<logic:equal name="dataDataStoresEditorForm" property='<%= "paramValue[" + ctr + "]"%>' value="">
  									 <html:text property='<%= "paramValues[" + ctr + "]"%>' size="60" value="file:data/example.extension"/>
  							</logic:equal>
  							<!-- if the value is not empty, use the regular value -->
  							<logic:notEqual name="dataDataStoresEditorForm" property='<%= "paramValue[" + ctr + "]"%>' value="">
  									 <html:text property='<%= "paramValues[" + ctr + "]"%>' size="60"/>
  							</logic:notEqual>
  						</logic:match>
  						<logic:notMatch name="dataDataStoresEditorForm" property='<%= "paramKey[" + ctr + "]"%>' value="url">
  									<html:text property='<%= "paramValues[" + ctr + "]"%>' size="60"/>
  						</logic:notMatch>
  					</logic:notMatch>
  				</logic:notEqual>
  				
  				<logic:equal name="dataDataStoresEditorForm"
  				   		     property='<%= "paramKey[" + ctr + "]"%>'
  				             value="passwd">
            			<html:password property='<%= "paramValues[" + ctr + "]"%>' size="12"/>
  				</logic:equal>
  				
  	  		</td>
  		</tr>
  	</logic:notEqual>
  </logic:iterate>
  
  	<tr>
  	  <td class="label">&nbsp;</td>
  	  <td class="datum">
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	  </td>
  	</tr>						
    </table>
  </html:form>
  </logic:present>
  <br>
  &nbsp;&nbsp;<font color="red">*</font> = <bean:message key="config.data.store.editor.requiredField"/>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/DataConfigDataStoresNew.jsp
  
  Index: DataConfigDataStoresNew.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/storeNewSubmit">
  <table class="info">
    <tr>
      <td class="label">	
  		<bean:message key="label.dataStoreDescription"/>:
  	</td>
  	<td class="datum">
  	  <html:select property="selectedDescription">
  	    <html:options property="dataStoreDescriptions"/>
  	  </html:select>
  	</td>
    </tr>
    <tr>
      <td class="label">	
        <span class="help" title="<bean:message key="help.dataStore_id"/>">
  		<bean:message key="label.dataStoreID"/>:
        </span>
  	</td>
  	<td class="datum">      
  	  <html:text property="dataStoreID"/>
  	</td>
    </tr>
    <tr>
      <td class="label">&nbsp;</td>
      <td class="datum">
  	  <html:submit>
  	    <bean:message key="label.new"/>
  	  </html:submit>
  	</td>
    </tr>
  </table>
  </html:form>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/DataConfigDataStoresSelect.jsp
  
  Index: DataConfigDataStoresSelect.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/storeSelectSubmit">
  <table class="info">
    <tbody>
      <tr>
        <td class="label">
          <span class="help" title="<bean:message key="help.dataStore_id"/>">
  		  <bean:message key="label.dataStoreID"/>:
          </span>
        </td>
        <td class="datum" colspan=2>
          <html:select property="selectedDataStoreId">
  			<html:options name="Config.Data" property="dataStoreIds"/>
  		</html:select>
        </td>
      </tr>
      <tr>
        <td class="label">&nbsp;</td>
        <td class="datum">
  		<html:submit property="buttonAction">
  			<bean:message key="label.edit"/>
  		</html:submit>
        </td>
        <td>
          <html:submit property="buttonAction">
  			<bean:message key="label.delete"/>
  		</html:submit>
  	  </td>
      </tr>
    </tbody>
  </table>
  </html:form>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/DataConfigStyles.jsp
  
  Index: DataConfigStyles.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=0 width=100%>
  
  	<html:form action="/config/data/styleSubmit">
  	
  	<tr><td>
  		<bean:message key="label.styles"/>:
  		</td><td>
  		<html:select property="selectedStyle">
  			<html:options property="styles"/>
  		</html:select>
  		
  		</td><td>
  		
  		<html:submit property="action" value="new">
  			<bean:message key="label.new"/>
  		</html:submit>
  		<BR>
  		<html:submit property="action" value="edit">
  			<bean:message key="label.edit"/>
  		</html:submit>
  		<BR>
  		<html:submit property="action" value="delete">
  			<bean:message key="label.delete"/>
  		</html:submit>
  		<BR>
  			
  	</td></tr>
  	
  	<tr><td align="right">
  		<bean:message key="label.styleID"/>:
  	</td><td colspan=2 align="left">
  		<html:text property="styleID" size="60"/>
  	</td></tr>
  	
  	<tr><td align="right">
  		<bean:message key="label.default"/>:
  	</td><td colspan=2 align="left">
  		<html:checkbox property="_default"/>
  	</td></tr>
  
  	<tr><td align="right">
  		<bean:message key="label.filename"/>
  	</td><td colspan=2 align="left">
  		<html:text property="filename" size="60"/>
  	</td></tr>
  	
  	<tr><td align="right">&nbsp;</td><td colspan=2>
  		<html:submit property="action">
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	</td></tr>						
  	
  	</html:form>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/DataMenu.jsp
  
  Index: DataMenu.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <logic:empty name="GeoServer.ApplicationState" property="dataStoreErrorKeys">
  <bean:message key="message.dataOkay"/>
  </logic:empty>
  
  <logic:notEmpty name="GeoServer.ApplicationState" property="dataStoreErrorKeys">
    <table class="info">
      <tr>
        <td class="label">	
    		<logic:iterate id="key" indexId="ctr" name="GeoServer.ApplicationState" property="dataStoreErrorKeys">
    			<nobr><%= key %></nobr><br>
    		</logic:iterate>
        </td>
        <td class="datum">
          <logic:iterate id="value" indexId="ctr" name="GeoServer.ApplicationState" property="dataStoreErrorValues">
            <nobr><%= value %></nobr><br>
          </logic:iterate>
        </td>
      </tr>	
    </table>
  </logic:notEmpty>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/status.jsp
  
  Index: status.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table class="status">
  
  	<tr>
  		<td class="module">
  			<bean:message key="config.data.label"/>:
  		</td>
  		<td class="health">
              <table class="progress">
  			  <tbody>
  		        <tr>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="dataGood" value="0">
  		    	    <td class="good"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="dataGood"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="dataGood"/>%">
  		    	        </td>
  		    	</logic:notEqual>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="dataBad" value="0">		    	
  		    	    <td class="bad"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="dataBad"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="dataBad"/>%">
  		    	    </td>
  		    	</logic:notEqual>		            
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wfsDisabled" value="0">		    	
  		    	    <td class="disabled"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="dataDisabled"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="dataDisabled"/>%">
  		    	    <td/>
  		    	</logic:notEqual>		                   
  		        </tr>
  		      </tbody>
  		    </table>
  		</td>
  	</tr>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/featureTypes/Editor.jsp
  
  Index: Editor.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <%
  //This file contains some ugly JSP code.
  //Be wary, ye who brave the dragon's lair.
  %>
  
  <% try { %>
  <html:form action="/config/data/typeEditorSubmit">
    <table class="info">
  	<tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.type.name"/>">
            <bean:message key="label.name"/>:
          </span>
        </td>
        <td class="datum">
  		<bean:write name="typesEditorForm" property="typeName"/>
        </td>
      </tr>
  	<tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.wms.path"/>">
            <bean:message key="label.wms.path"/>:
          </span>
  	  </td>
  	  <td class="datum">
  		<html:text property="wmsPath" size="60"/>
  	  </td>
  	</tr>
  	<tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.type.style"/>">
            <bean:message key="label.style"/>:
          </span>
        </td>
        <td class="datum">
          <html:select property="styleId">
            <html:options property="styles"/>
          </html:select> 
          <html:submit property="action">
            <bean:message key="config.data.sldWizard.label"/>
          </html:submit><br>
        </td>
      </tr>    
  	<tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.type.srs"/>">
            <bean:message key="label.SRS"/>:
          </span>
        </td>
  	  <td class="datum">
  	  <table>
  	  <tr>
  	  <td>
  		<html:text property="SRS" size="32"/>
  		</td>
  		<td>
  		      <a href="<bean:message key="label.SRSHelp.URL"/>">
                <bean:message key="label.SRSHelp"/>
              </a>
          </td>
          <td>
          &nbsp;-&nbsp;
          <a href="<%=org.vfny.geoserver.util.Requests.getBaseUrl(request)%>srsHelp.do">
                <bean:message key="label.SRSList"/>
              </a>
          </td>
          </tr>
          </table>
  	</td></tr>
  	<!------------------------->
  	<!------ This puts in the SRS WKT definition --->
  	
  	<tr>
  	<td class="label">
  		<span class="help" title="<bean:message key="help.type.srswkt"/>">
            <bean:message key="label.type.srswkt"/>:
          </span>
  	  </td>
  	  <td class="greyedOut2">
                <bean:write name="typesEditorForm" property="SRSWKT"/>
              </td>
  	</tr>
  	
  	
  	<!-------------------------->
  
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.type.title"/>">
            <bean:message key="label.title"/>:
          </span>
  	  </td>
  	  <td class="datum">
  		<html:text property="title" size="60"/>
  	  </td>
  	</tr>
  
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.type.bbox"/>">
            <bean:message key="label.bbox"/>:          
          </span>
  	  </td>
  	  <td class="datum">
          <html:submit property="action">
            <bean:message key="config.data.calculateBoundingBox.label"/>
          </html:submit><br/>
          
        <!-------------------------------------------------------------->
        <!----- This will add the bounding box of the data (in its CRS) to the page --->
        <!----- Its only added if its actually been calculated (i.e. they presed the generate bbox button) --->
  
  <logic:notEmpty name="typesEditorForm"  property="dataMinX">
          <table border=0 width=90%>
            <tr>
              <td class="greyedOut">
                <span class="help" title="<bean:message key="help.type.dataminx"/>">
                  <bean:message key="label.type.dataminx"/>:
                </span>
              </td>
              <td class="greyedOut">
                <bean:write name="typesEditorForm" property="dataMinX"/>
              </td>
              <td class="greyedOut">
                <span class="help" title="<bean:message key="help.type.dataminy"/>">
                  <bean:message key="label.type.dataminy"/>:
                </span>
              </td>
              <td class="greyedOut">
                <bean:write name="typesEditorForm" property="dataMinY"/>
              </td>
            </tr>
            <tr>
              <td class="greyedOut">
                <span class="help" title="<bean:message key="help.type.datamaxx"/>">
                  <bean:message key="label.type.datamaxx"/>:
                </span>
              </td>
              <td class="greyedOut">
               <bean:write name="typesEditorForm" property="dataMaxX"/>
              </td>
              <td class="greyedOut">
                <span class="help" title="<bean:message key="help.type.datamaxy"/>">
                  <bean:message key="label.type.datamaxy"/>:
                </span>
              </td>
              <td class="greyedOut">
               <bean:write name="typesEditorForm" property="dataMaxY"/>
              </td>
            </tr>
          </table>
          
  </logic:notEmpty>        
  <!-------------------------------------------------------------->
          
          
          <table border=0>
            <tr>
              <td style="white-space: nowrap;">
                <span class="help" title="<bean:message key="help.type.minx"/>">
                  <bean:message key="label.type.minx"/>:
                </span>
              </td>
              <td>
                <html:text property="minX" size="15"/>
              </td>
              <td style="white-space: nowrap;">
                <span class="help" title="<bean:message key="help.type.miny"/>">
                  <bean:message key="label.type.miny"/>:
                </span>
              </td>
              <td>
                <html:text property="minY" size="15"/>
              </td>
            </tr>
            <tr>
              <td style="white-space: nowrap;">
                <span class="help" title="<bean:message key="help.type.maxx"/>">
                  <bean:message key="label.type.maxx"/>:
                </span>
              </td>
              <td>
                <html:text property="maxX" size="15"/>
              </td>
              <td style="white-space: nowrap;">
                <span class="help" title="<bean:message key="help.type.maxy"/>">
                  <bean:message key="label.type.maxy"/>:
                </span>
              </td>
              <td>
                <html:text property="maxY" size="15"/>
              </td>
            </tr>
          </table>
  	  </td>
      </tr>
  
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.dataFeatureTypeKeywords"/>">
  			<bean:message key="label.keywords"/>:
  		</span>
  	  </td>
  	  <td class="datum">
  		<html:textarea property="keywords" cols="60" rows="2"/>
  	  </td>
      </tr>
  
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.dataFeatureTypeAbstract"/>">
  			<bean:message key="label.abstract"/>:
  		</span>
  	  </td>
  	  <td class="datum">
  		<html:textarea property="abstract" cols="60" rows="3"/>
        </td>
      </tr>
      
      <tr>
  	    <td class="label">
      		<span class="help" title="<bean:message key="help.type.cachingEnabled" />">
      			<bean:message key="label.cachingEnabled" />:
      		</span>
      	</td>
      	<td class="datum">
      		<html:checkbox property="cachingEnabled" />
      	</td>
      </tr>
      
      <tr>
      	<td class="label">
      		<span class="help" title="<bean:message key="help.type.cacheMaxAge" />">
      			<bean:message key="label.cacheMaxAge" />:
      		</span>
      	</td>
      	<td class="datum">
      		<html:text property="cacheMaxAge" size="10" />
      	</td>
      </tr>
  
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.type.base"/>">
  			<bean:message key="label.base"/>:
  		</span>
  	  </td>
  	  <td class="datum">
  		<html:select property="schemaBase">
  			<html:options property="allYourBase"/>
  		</html:select>
  		<html:submit property="action">
  			<bean:message key="label.change"/>
  		</html:submit>
        </td>
      </tr>
  
    <% boolean first = true;
       org.vfny.geoserver.form.data.AttributeDisplay attributeDisplay = null;;
       org.vfny.geoserver.form.data.AttributeForm attributeForm = null; 
       
       org.vfny.geoserver.form.data.TypesEditorForm form = 
               (org.vfny.geoserver.form.data.TypesEditorForm) request.getAttribute("typesEditorForm");
       java.util.List attributes = (java.util.List) form.getAttributes();
       int attributesSize = attributes.size(); %>
               
      <% if (!("--".equals(form.getSchemaBase())) ) { %>
      <tr>
        <td class="label">
  		<span class="help" title="<bean:message key="help.type.schemaName"/>">
            <bean:message key="label.schemaName"/>:
          </span>
  	  </td>
  	  <td class="datum">
  		<html:text property="schemaName" size="60"/>
  	  </td>
  	</tr>
      <% } %>    
  
  <logic:iterate id="attribute" indexId="index" name="typesEditorForm" property="attributes">
  	<tr>
        <td class="label">
  		<bean:write name="attribute" property="name"/>:
  	  </td>
  	  <td class="datum">
          <table border=0 width="100%">
            <tr style="white-space: nowrap;">
              
  		  <%
  		     if (attribute instanceof org.vfny.geoserver.form.data.AttributeDisplay) { 
  		  	     attributeDisplay = (org.vfny.geoserver.form.data.AttributeDisplay) attribute; %>
              <td width="70%"><bean:write name="attribute" property="type"/></td>
              <td>nillable:<bean:write name="attribute" property="nillable"/></td>
              <td>min:<bean:write name="attribute" property="minOccurs"/></td>
              <td>max:<bean:write name="attribute" property="maxOccurs"/></td>
            <% } else { 
                   attributeForm = (org.vfny.geoserver.form.data.AttributeForm) attribute; %>
              <td width="70%">
              	<html:select property='<%= "attributes[" + index + "].type"%>'>
            			<html:options property='<%= "attributes[" + index + "].types"%>'/>
          		</html:select>
  				<html:submit property="action">
  					<bean:message key="label.change"/>
  				</html:submit>        		
              </td>
              <td><bean:message key="label.nillable"/>:<html:checkbox property='<%= "attributes[" + index + "].nillable" %>'/></td>
              <td><bean:message key="label.min"/>:<html:text size="2" property='<%= "attributes[" + index + "].minOccurs"%>'/></td>
              <td><bean:message key="label.max"/>:<html:text size="2" property='<%= "attributes[" + index + "].maxOccurs"%>'/></td>
              <td width=16>
                <% if (first == false) { %>
            	  <html:image src="/geoserver/WEB-INF/images/up.png" 
            	  	          titleKey="type.title.up" 
            	  	          property="action" 
            	  	          value="<%= "up_"+ index%>"/>
            	  <% } 
            	     first = false; %>
            	</td>
            	<td width=16>
            	  <% if (attributesSize-1 != index.intValue()) { %>
            	  <html:image src="/geoserver/WEB-INF/images/down.png" 
            	              titleKey="type.title.down" 
            	              property="action" 
            	              value="<%= "down_"+ index%>"/>
            	  <% } %>
            	</td> 
            	<td width=16>
            	  <html:image src="/geoserver/WEB-INF/images/delete.png" 
            	  	          titleKey="type.title.delete" 
            	  	          property="action" 
            	  	          value="<%= "delete_"+ index%>"/>
  		    </td>
            <% } %>
            </tr>
            <%
              if (attributeForm != null && attributeForm.getType().equals(org.vfny.geoserver.config.AttributeTypeInfoConfig.TYPE_FRAGMENT)) {
    		  %>
            <tr>
              <td align="left" valign="top" colspan="7">
                		<html:textarea cols="80" rows="3" 
                		               property='<%= "attributes[" + index + "].fragment" %>'/>
              </td>
            </tr>
            <% } %>
          </table>		
        </td>
      </tr>
  </logic:iterate>
      
      
      <% if (form.getCreateableAttributes().size() != 0) { %>
      <tr>
      	<td>
    			<html:select property="newAttribute">
  				<html:options property="createableAttributes"/>
  			</html:select>
  		</td>
  		<td>
  			<html:submit property="action">
  				<bean:message key="label.add"/>
  			</html:submit>    	
  		</td>
      </tr>
      <% } %>
      
      <tr>
        <td class="label">
          &nbsp;
        </td>
  	  <td class="datum">
  
  		<html:submit property="action">
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  
  	  </td>
      </tr>
    </table>
  </html:form>
  
  <% } catch (Throwable hate ){
     System.err.println( "FeatureType Editor problem:"+ hate );
     hate.printStackTrace();
     throw hate;
  } %>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/featureTypes/New.jsp
  
  Index: New.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/typeNewSubmit">
    <table class="info">
      <tr>
        <td class="label">
  		<bean:message key="label.featureTypeName"/>:
  	  </td>
  	  <td class="datum">
  		<html:select property="selectedNewFeatureType">
  			<html:options property="newFeatureTypes"/>
  		</html:select>
  	  </td>
      </tr>
  
  	<tr>
        <td class="label">&nbsp;</td>
        <td class="datum">
  		<html:submit>
  			<bean:message key="label.new"/>
  		</html:submit>
        </td>
      </tr>
    </table>
  </html:form>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/featureTypes/Select.jsp
  
  Index: Select.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <% try { %>
  <html:form action="/config/data/typeSelectSubmit">
    <table class="info">
  	<tr>
        <td class="label">
  		<bean:message key="label.featureTypes"/>:
  	  </td>
        <td class="datum">
  		<html:select property="selectedFeatureTypeName">
  			<html:options property="typeNames"/>
  		</html:select>
        </td>
      </tr>
  	<tr>
        <td class="label">&nbsp;</td>
        <td class="datum">
  
  		<html:submit property="buttonAction">
  			<bean:message key="label.edit"/>
  		</html:submit>
  
  		<html:submit property="buttonAction">
  			<bean:message key="label.delete"/>
  		</html:submit>
  					
  	  </td>
      </tr>
    </table>
  </html:form>
  <% } catch (Throwable hate ){
     System.err.println( "FeatureType Editor problem:"+ hate );
     hate.printStackTrace();
     throw hate;
  } %>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/featureTypes/featureTypeActions.jsp
  
  Index: featureTypeActions.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  
  <logic:present name="selectedFeatureType" scope="session">
  
  <span class="actions">
  	<span class="actionsTitle">
  		<bean:message key="label.actions"/>
  	</span>
  
  	<html:form action="/config/data/calculateBoundingBox">
  		<html:submit>
  			<bean:message key="label.calculateBoundingBox"/>
  		</html:submit>
  	</html:form>
  </span>
  
  </logic:present>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/featureTypes/attributeTypes/Editor.jsp
  
  Index: Editor.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=0 width=100%>
  	<html:form action="/config/data/attributeTypeSubmit">
  
  	<tr><td valign="top" align="right">
  			<bean:message key="label.attributeTypeName"/>
  		</td><td valign="top" align="left">
  			<bean:write name="dataAttributeTypesEditorForm" property="name"/>
  	</td></tr>
  
  	<tr>
  		<td valign="top" align="right">	
  			<bean:message key="label.type"/>
  		</td><td valign="top" align="left">
  		<html:select property="selectedType">
  			<html:options property="attributeTypes"/>
  		</html:select>
  	</td></tr><tr>
  
  	<td valign="top" align="right">
  		<bean:message key="label.isNillible"/>:
  	</td><td valign="top" align="left">
  		<html:checkbox property="nillible"/>
  	</td></tr>
  	<td valign="top" align="right">
  		<bean:message key="label.minOccurs"/>:
  	</td><td valign="top" align="left">
  		<html:text property="minOccurs" size="3"/>
  	</td></tr>
  	<td valign="top" align="right">
  		<bean:message key="label.maxOccurs"/>:
  	</td><td valign="top" align="left">
  		<html:text property="maxOccurs" size="3"/>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:textarea property="fragment" rows="6" cols="60"/>
  	</td></tr>	
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	</td></tr>
  
  	</html:form>
  	
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/featureTypes/attributeTypes/New.jsp
  
  Index: New.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=1 width=100%>
  <tr><td>
  <table border=0 width=100%>
  	<html:form action="/config/data/attributeTypeNewSubmit">
  
  	<tr><td valign="top" align="right">	
  		<bean:message key="label.attributeTypeName"/>:
  	</td>
  	<td align="left">
  		<html:select property="selectedNewAttributeType">
  			<html:options property="newAttributeTypes"/>
  		</html:select>
  	</td></tr>
  
  	<tr><td>&nbsp;</td><td align="left">
  		<html:submit>
  			<bean:message key="label.new"/>
  		</html:submit>
  	</td></tr>
  	
  	</html:form>
  	
  </table>
  </td></tr>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/featureTypes/attributeTypes/Select.jsp
  
  Index: Select.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=1 width=100%>
  <tr><td>
  <table border=0 width=100%>
  	<html:form action="/config/data/attributeTypeSelect">
  
  	<tr><td align="right" valign="top">
  		<bean:message key="label.attributeTypes"/>:
  	</td><td align="left" valign="top">
  		<html:select property="selectedAttributeType">
  			<html:options property="attributeTypes"/>
  		</html:select>
  	</td><td align="left" valign="top">
  		<html:submit property="buttonAction">
  			<bean:message key="label.moveUp"/>
  		</html:submit>
  		<br>
  		<html:submit property="buttonAction">
  			<bean:message key="label.moveDown"/>
  		</html:submit>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left" colspan=2>
  		<html:submit property="buttonAction">
  			<bean:message key="label.edit"/>
  		</html:submit>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left" colspan=2>
  		<html:submit property="buttonAction">
  			<bean:message key="label.delete"/>
  		</html:submit>
  	</td></tr>
  			
  	</html:form>
  </table>
  </td></tr>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/namespaces/Editor.jsp
  
  Index: Editor.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/namespaceSubmit">
    <table class="info">
      <tr>
        <td class="label">
          <span class="help" title="<bean:message key="help.namespace.uri"/>">
            <bean:message key="label.URI"/>:
          </span>
        </td>
        <td class="datum">
  		<html:text property="URI" size="60"/>
        </td>
      </tr>
      <tr>
        <td class="label">
          <span class="help" title="<bean:message key="help.namespace.prefix"/>">
  		  <bean:message key="label.prefix"/>:
          </span>
        </td>
        <td class="datum">
  		<html:text property="prefix" size="60"/>
        </td>
      </tr>
      <tr>
        <td class="label">&nbsp;</td>
        <td class="datum">
  		<html:submit property="action">
  			<bean:message key="label.submit"/>
  		</html:submit>		
  		<html:reset>
  			<bean:message key="label.reset"/>
          </html:reset>
  	  </td>
      </tr>							
    </table>
  </html:form>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/namespaces/New.jsp
  
  Index: New.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/namespaceNewSubmit">
    <table class="info">
      <tr>
        <td class="label">
          <span class="help" title="<bean:message key="help.namespace.prefix"/>">
            <bean:message key="label.prefix"/>:
          </span>
        </td>
        <td class="datum">
          <html:text property="prefix" size="60"/>
  	  </td>
      <tr>
        <td class="label">&nbsp;</td>
  	  <td class="datum">
          <html:submit>
            <bean:message key="label.new"/>
          </html:submit>
  	  </td>
      </tr>
    </table>
  </html:form>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/namespaces/Select.jsp
  
  Index: Select.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/namespaceSelect">
  <table class="info">
    <tr>
      <td class="label">
        <bean:message key="label.namespaces"/>:
      </td>
      <td class="datum">
        <html:select property="selectedNamespace">
          <html:options property="namespaces"/>
        </html:select>
      </td>
    </tr>
    <tr>
      <td class="label">&nbsp;</td>
  	<td>
         <html:submit property="action">
           <bean:message key="label.edit"/>
         </html:submit>
         <html:submit property="action">
           <bean:message key="label.delete"/>
         </html:submit>
         <html:submit property="action">
           <bean:message key="label.default"/>
         </html:submit>
      </td>
    </tr>
    <tr>
      <td class="label">&nbsp;</td>
  	<td>
         <bean:message key="text.namespace"/>
      </td>
    </tr>  
  </table>
  </html:form>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/styles/Editor.jsp
  
  Index: Editor.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/styleEditorSubmit" enctype="multipart/form-data">
  
  <table class="info">
    <tr>
      <td class="label"><bean:message key="label.styleID"/>:</td>
      <td class="datum"><html:text property="styleID" size="60"/></td>
    </tr>
    <tr>
      <td class="label"><bean:message key="label.filename"/></td>
      <td class="datum"><html:file size="60" property="sldFile"/></td>
    </tr>
     <!--- add the "fully validate" option-->
    <tr>
      <td class="label">&nbsp;</td>
      <td><html:checkbox property="fullyValidate">Fully Validate against the SLD schema</html:checkbox></td>
      
    </tr>
    <tr>
      <td class="label">&nbsp;</td>
      <td class="datum">
        <html:submit property="action"><bean:message key="label.submit"/></html:submit>
        <html:reset><bean:message key="label.reset"/></html:reset>
      </td>
    </tr>
   
  </table>
  
  </html:form>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/styles/New.jsp
  
  Index: New.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/styleNewSubmit" focus="styleID">
  
  <table class="info">
    <tr>
      <td class="label">
        <span class="help" title="<bean:message key="help.styleID"/>">
          <bean:message key="label.styleID"/>:
        </span>      
      </td>
      <td class="datum">
        <html:text property="styleID" size="60"/>
      </td>
    </tr>
    <tr>
      <td class="label">&nbsp;</td>
      <td class="datum">
        <html:submit property="action"><bean:message key="label.new"/></html:submit>
      </td>
    </tr>
  </table>
  
  </html:form>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/data/styles/Select.jsp
  
  Index: Select.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <html:form action="/config/data/styleSelectSubmit">
  
  <table class="info">
    <tr>
      <td class="label">
  	  <bean:message key="label.styles"/>:
  	</td>
      <td class="datum">
  	  <html:select property="selectedStyle">
  	    <html:options property="styles"/>
  	  </html:select>
      </td>
    </tr>
      <tr>
      <td class="label">&nbsp;</td>
      <td class="datum">
  	  <html:submit property="action">
  		<bean:message key="label.edit"/>
  	  </html:submit>
        <html:submit property="action">
  		<bean:message key="label.delete"/>
  	  </html:submit>
        <html:submit property="action">
  		<bean:message key="label.default"/>
  	  </html:submit>
  	</td>
    </tr>
  </table>
  
  </html:form>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/errors/Exception.jsp
  
  Index: Exception.jsp
  ===================================================================
  <%@ page session="false" isErrorPage="true" %>
  
  <html>
  <head><title>GeoServer - Exception</title>
    <meta content="text/css" http-equiv="content-style-type">
    <style type="text/css">
      <!-- @import url("/geoserver/style.css"); -->
    </style>
    <link type="image/gif" href="gs.gif" rel="icon"><!-- mozilla --> 
    <link href="gs.ico" rel="SHORTCUT ICON"><!-- ie -->
  </head>
  <body>
  <h1>GeoServer - Exception</h1>
  
  The following exception was thrown:
  <br>
  <i><code><%=request.getAttribute("javax.servlet.error.exception")%></code></i> 
  </body>
  </html>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/layouts/featureTypesLayout.jsp
  
  Index: featureTypesLayout.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-tiles" prefix="tiles" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  
  <table border=0 width=100% height=100%>
  	<tr>
  		<td valign="top" align="left">
  			<tiles:insert attribute="ftSelect"/>
  		</td>
  		<td valign="top" align="left">
  			<tiles:insert attribute="ftNew"/>
  		</td>
  	</tr>
  <logic:present name="selectedFeatureType" scope="session">
  	<tr><td colspan=2><HR></td></tr>
  	<tr>
  		<td valign="top" align="left" colspan=2>
  			<tiles:insert attribute="ftEditor"/>
  		</td>
  	</tr>
  	<tr><td colspan=2><HR></td></tr>
  	<tr><td valign="top" align="left">
  		<tiles:insert attribute="atSelect"/>
  	</td><td>
  		<tiles:insert attribute="atNew"/>
  	</td></tr>
  	<logic:present name="selectedAttributeType" scope="session">
  	<tr><td colspan=2><HR></td></tr>
  	<tr><td colspan=2>
  		<tiles:insert attribute="atEditor"/>
  	</td></tr>	
  	</logic:present>
  </logic:present>
  </table>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/layouts/mainLayout.jsp
  
  Index: mainLayout.jsp
  ===================================================================
  <%@ page contentType="text/html; charset=UTF-8" %>
  <%@ taglib uri="/tags/struts-tiles" prefix="tiles" %>
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <tiles:importAttribute scope="request"/>
  
  <bean:define id="key"><tiles:getAsString name='key'/></bean:define>
  <bean:define id="keyLabel"><tiles:getAsString name='key'/>.label</bean:define>
  <bean:define id="keyTitle"><tiles:getAsString name='key'/>.title</bean:define>
  <bean:define id="keyShort"><tiles:getAsString name='key'/>.short</bean:define>
  <bean:define id="keyWords"><tiles:getAsString name='key'/>.words</bean:define>
  <bean:define id="layer"><tiles:getAsString name='layer'/></bean:define>
  
  <html:html locale="true" xhtml="true">
    <head>
      <title>
        <bean:message key="geoserver.logo"/>
        <bean:message key="<%= keyTitle %>"/>
      </title>
      <meta content="text/html; charset=iso-8859-1" http-equiv="content-type"/>
      <meta content="text/css" http-equiv="content-style-type"/>  
      <meta name="description"
            content="<bean:message key="<%= keyShort %>"/>">
      <meta name="keywords"
            content="(GeoServer) (GIS) (Geographic Information Systems) <bean:message key="<%= keyWords %>"/>"/>
      <meta name="author" content="Dave Blasby, Chris Holmes, Brent Owens, Justin Deoliveira, Jody Garnett, Richard Gould, David Zwiers"/>
    	
    	<script language="JavaScript">
  		<!--
  		// This is used for URL parsing to check for any spaces that will cause invalid XML
  		// Currently it is used in DataConfigDataStoresEditor.jsp
  		function checkspaces(form)
  		{
  			for(var i=0; i<form.elements.length; i++)
  			{
  				if(form.elements[i].value.match("file:"))
  				{
  					var badchar = " ";	// look for the space character
  					if (form.elements[i].value.indexOf(badchar) > -1) 
  					{
  						alert("Spaces are not allowed in the filename or path.");
  						form.elements[i].focus();
  						form.elements[i].select();
  						return false;
  					}
  				}
  			}// end for
  			return true;
  		}
  		-->
  	</script>
    	
      <style type="text/css">
        <!-- @import url("<html:rewrite forward='style'/>"); -->
      </style>
    
      <link type="image/gif" href="<html:rewrite forward='icon'/>" rel="icon"/>
      <link href="<html:rewrite forward='favicon'/>" rel="SHORTCUT ICON"/>
      <html:base/>
    </head>
    <body>
    
  <!-- Security Check (for non application layers -->
  <logic:notEqual name="layer" value="application">  
    <logic:notPresent name="GEOSERVER.USER">
      <logic:redirect forward="login" />
    </logic:notPresent>
  </logic:notEqual>
      
  <table class="page">
    <tbody>
  	<tr class="header">
          <td class="gutter">
            <span class="project">
              <a href="<bean:message key="link.geoserver"/>">
                <bean:message key="geoserver.logo"/>
              </a>
            </span>
            <span class="license">
              <a href="<bean:message key="link.license"/>">&copy;</a>
            </span>
  		</td>
          <td style="width: 1em">
          </td>
  		<td style="vertical-align: bottom; white-space: nowrap;">
            <span class="site">
  <logic:notEmpty name="GeoServer" property="title">
                <bean:write name="GeoServer" property="title"/>
  </logic:notEmpty>
  <logic:empty name="GeoServer" property="title">
                <bean:message key="message.noTitle"/>
  </logic:empty>            
            </span>			
  		</td>	
  		<td style="vertical-align: bottom; white-space: nowrap; text-align: right;">
  			<span class="contact">
  			   <a href="<bean:message key="label.credits.url"/>"><bean:message key="label.credits"/></a>
  			</span>
  <logic:notEmpty name="GeoServer" property="contactParty">
              <span class="contact">		
                <bean:message key="label.contact"/>: 	
                <html:link forward="contact">
                  <bean:write name="GeoServer" property="contactParty"/>
                </html:link>
              </span>            
  </logic:notEmpty>                
          </td>
  	</tr>
  	
      <tr>
        <td class="sidebar">
          <tiles:insert attribute="status"/>	
          <tiles:insert attribute="configActions"/>
          <tiles:insert attribute="actionator"/>
          <tiles:insert attribute="messages"/>
        </td>
        <td style="width: 1em">
        </td>      
        <td style="vertical-align: top;"
            rowspan="1" colspan="2">
              
          <table class="main">
            <tbody>
              <tr class="bar">
                <td class="locator">
                  <tiles:insert attribute="locator"/>
                </td>
                <td class="loginStatus">
                  <span class="loginStatus">                  
  <logic:present name="GEOSERVER.USER">
                      <html:link forward="logout">
  				      <bean:message key="label.logout"/>
  			        </html:link>
  </logic:present>                  
  <logic:notPresent name="GEOSERVER.USER">
                      <html:link forward="login">
                        <bean:message key="label.login"/>
                      </html:link>
  </logic:notPresent>                  
                  </span>
                </td>
              </tr>
            	<tr>
                <td class="<tiles:getAsString name='layer'/>"
                    rowspan="1" colspan="2">
                  <table class="title">
                    <tbody>
                      <tr>
                        <td class="menu">
                          <tiles:insert attribute="menuator"/>
                        </td>
                        <td class="title">
                          <h1 class="title">
                            <bean:message key="<%= keyTitle %>"/>
                          </h1>
                          <p class="abstract">
                            <bean:message key="<%= keyShort %>"/>
                          </p>
                        </td>
                        <td class="icon"></td>
                      </tr>    
                    </tbody>
                  </table>
                  <tiles:insert attribute="body"/>                
                </td>
  	        </tr>
            </tbody>
  	    </table>
        </td>
  	</tr>
    </tbody>
  </table>
  
  </body>
  </html:html>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/validation/SelectTest.jsp
  
  Index: SelectTest.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=0>
  
  	<html:form action="/config/validation/test">
  	
  	<tr><td valign="top" align="right">
  		<bean:message key="label.currentTestSuite"/>:
  	</td><td>
  		<bean:write name="selectedTestSuite" property="name"/>
  	</td></tr>
  	
  	<tr><td valign="top" align="right">
  		<bean:message key="label.testName"/>:
  	</td><td>
  		<html:select property="selectedTest">
  			<html:options property="tests"/>
  		</html:select>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:submit property="buttonAction">
  			<bean:message key="label.edit"/>
  		</html:submit>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:submit property="buttonAction">
  			<bean:message key="label.delete"/>
  		</html:submit>
  	</td></tr>
  	<tr><td colspan=2><hr></td></tr>
  	</html:form>
  	
  	<html:form action="/config/validation/testNew">
  	<tr><td valign="top" align="right">
  		<bean:message key="label.newName"/>:
  	</td><td>
  		<html:text property="newName" size="60"/>
  	</td></tr>
  	<tr><td valign="top" align="right">
  		<bean:message key="label.plugInType"/>:
  	</td><td>
  		<html:select property="selectedPlugIn">
  			<html:options property="plugIns"/>
  		</html:select>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:submit>
  			<bean:message key="label.new"/>
  		</html:submit>
  	</td></tr>
  	</html:form>
  	
  	
  
  </table>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/validation/SelectTestSuite.jsp
  
  Index: SelectTestSuite.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=0>
  
  	<html:form action="/config/validation/testSuiteSelect">
  	<tr><td valign="top" align="right">
  		<bean:message key="label.testSuite"/>:
  	</td><td>
  		<html:select property="selectedTestSuite">
  			<html:options property="testSuites"/>
  		</html:select>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:submit property="buttonAction">
  			<bean:message key="label.edit"/>
  		</html:submit>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:submit property="buttonAction">
  			<bean:message key="label.delete"/>
  		</html:submit>
  	</td></tr>
  
  	</html:form>
  
  	<tr><td colspan=2><HR></td></tr>
  
  	<html:form action="/config/validation/testSuiteNew">	
  	<tr><td valign="top" align="right">
  			<bean:message key="label.newName"/>:
  		</td><td>
  			<html:text property="newName" size="60"/>
  	</td></tr>
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:submit>
  			<bean:message key="label.new"/>
  		</html:submit>
  	</td></tr>
  	</html:form>
  	
  
  </table>
  <table border="0">
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/validation/TestEditor.jsp
  
  Index: TestEditor.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=0>
  
  	<html:form action="/config/validation/testEditor">
  	<tr><td valign="top" align="right">
  		<bean:message key="label.testName"/>:
  	</td><td>
  		<html:text property="name" size="60"/>
  	</td></tr>
  	<tr><td valign="top" align="right">
  		<bean:message key="label.testDescription"/>:
  	</td><td>
  		<html:textarea property="description" cols="60" rows="4"/>
  	</td></tr>
  
  	<tr><td valign="top" align="right">
  		<bean:message key="label.plugInType"/>:
  	</td><td>
  		<bean:write name="validationTestEditorForm" property="plugInName"/>
  	</td></tr>
  	
  	<tr><td valign="top" align="right">
  		<bean:message key="label.plugInDescription"/>:
  	</td><td>
  		<bean:write name="validationTestEditorForm" property="plugInDescription"/>
  	</td></tr>
  
  <logic:iterate id="attribute" indexId="ctr" name="validationTestEditorForm" property="attributeKeys">
  	<tr><td align="right">
  		<span class="help" title="<bean:write name="validationTestEditorForm" property='<%= "attributeHelps[" + ctr + "]" %>'/>">
  			<bean:write name="validationTestEditorForm" property='<%= "attributeKeys[" + ctr + "]"%>'/>
  		</span>
  	</td><td colspan=2 align="left">
  		<html:text property='<%= "attributeValues[" + ctr + "]"%>' size="60"/>
  	</td></tr>
  </logic:iterate>		
  	
  	<tr><td>&nbsp;</td><td valign="top" align="left">
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  	</td></tr>
  	</html:form>
  
  </table>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/validation/displayResults.jsp
  
  Index: displayResults.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <%@ page import="java.lang.*"%>
  <%@ page import="org.vfny.geoserver.action.validation.*"%>
  
  <table border="0">
  <%
  try {
  org.vfny.geoserver.action.validation.TestValidationResults tvr =
  	(org.vfny.geoserver.action.validation.TestValidationResults) session.getAttribute(org.vfny.geoserver.action.validation.TestValidationResults.CURRENTLY_SELECTED_KEY);
  if(tvr!=null && tvr.getErrors().size()>0){
  
  Thread thread = (Thread) session.getAttribute(ValidationRunnable.KEY);
  
  %>
  <table border="0">
  
  <%
  if (thread != null && thread.isAlive()) { %>
  <tr><td><html:link forward="config.validation.test.doitStop"><bean:message key="config.validation.displayResults.stop"/></html:link></td></tr>
  
  <script>
  function refresh() {
  	location.replace("<%= org.apache.struts.util.RequestUtils.computeURL(pageContext, "config.validation.displayResults", null, null, null, null, true) %>");
  	//location.replace("<!--%= org.apache.struts.taglib.TagUtils.computeURL(pageContext, "config.validation.displayResults", null, null, null, null, null, null, true) %-->");
  }
  window.setTimeout("refresh()", 6000);
  </script>
  
  <% }  %>
  
  <tr><td><bean:message key="config.validation.displayResults.errors"/></td></tr>
  <%if(tvr.isRun()){%>
  <tr><td><bean:message key="config.validation.displayResults.runCompleted"/></td></tr>
  <%}else{%>
  <tr><td><bean:message key="config.validation.displayResults.runNotCompleted"/></td></tr>
  <%
  }
  java.util.Iterator i = tvr.getErrors().entrySet().iterator();
  while(i.hasNext()){
    java.util.Map.Entry m = (java.util.Map.Entry)i.next();  
    org.geotools.feature.Feature feature = (org.geotools.feature.Feature) m.getKey();
    String fid = feature != null ? feature.getID() : "(problem)";
    Object msg = m.getValue();
    String message = "";
    if (msg == null) {
    	message = "an error has occured";
    } else {
    	message = (String) msg;
    }
    %>
  <tr><td><%=fid%></td><td><code><%=org.vfny.geoserver.action.HTMLEncoder.encode(message)%></code></td></tr>
    <%
  }  // while
  %>
  </table>
  <%
  } // if
  } catch( NullPointerException bad){
  	bad.printStackTrace();
  }
  %>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wfs/WFSConfigContent.jsp
  
  Index: WFSConfigContent.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=0 width=100%>
  	<html:form action="/config/wfs/contentSubmit">
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.enabled"/>">
  			<bean:message key="label.enabled"/>:
  		</span>
  	</td><td colspan=2>
  		<html:checkbox property="enabled"/>
  	</td></tr>
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.srsXmlStyle"/>">
  			<bean:message key="label.srsXmlStyle"/>:
  		</span>
  	</td><td colspan=2>
  		<html:checkbox property="srsXmlStyle"/>
  	</td></tr>
  	
  
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.citeConformanceHacks"/>">
  			<bean:message key="label.citeConformanceHacks"/>:
  		</span>
  	</td><td colspan=2>
  		<html:checkbox property="citeConformanceHacks"/>
  	</td></tr>
  	
  
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.featureBounding"/>">
  			<bean:message key="label.featureBounding"/>:
  		</span>
  	</td><td colspan=2>
  		<html:checkbox property="featureBounding"/>
  	</td></tr>
  
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.serviceLevel"/>">
  			<bean:message key="label.serviceLevel"/>:
  		</span>
  	</td><td colspan=2>
  		<html:select property="serviceLevel" size="2">
  			<html:option key="label.serviceLevel.basic" value="<%= java.lang.Integer.toString(org.vfny.geoserver.global.dto.WFSDTO.BASIC) %>"/>
  			<html:option key="label.serviceLevel.transactional" value="<%= java.lang.Integer.toString(org.vfny.geoserver.global.dto.WFSDTO.TRANSACTIONAL) %>"/>
  			<html:option key="label.serviceLevel.complete" value="<%=java.lang.Integer.toString(org.vfny.geoserver.global.dto.WFSDTO.COMPLETE) %>"/>
  		</html:select>
  	</td></tr>	
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.onlineResource_service"/>">
  			<bean:message key="label.onlineResource"/>:
  		</span>
  	</td><td colspan=2>
  		<html:text property="onlineResource" size="60"/>
  	</td></tr>
  	
  	<tr><td align="right">&nbsp;</td><td>
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	</td></tr>
  	</html:form>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wfs/WFSConfigDescription.jsp
  
  Index: WFSConfigDescription.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  
  <table border=0 width=100%>
  
  	<html:form action="/config/wfs/descriptionSubmit" focus="name">
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.name_service"/>">
  			<bean:message key="label.name"/>:
  		</span>
  	</td><td>
  		<html:text property="name" size="60"/>
  	</td></tr>
  
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.title_service"/>">
  			<bean:message key="label.title"/>:
  		</span>
  	</td><td>
  			<html:text property="title" size="60"/>
  	</td></tr>		
  		
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.accessConstraints_service"/>">
  			<bean:message key="label.accessConstraints"/>:
  		</span>
  	</td><td>
  		<html:text property="accessConstraints" size="60"/>
  	</td></tr>
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.fees_service"/>">
  			<bean:message key="label.fees"/>:
  		</span>
  	</td><td>
  		<html:text property="fees" size="60"/>
  	</td></tr>
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.maintainer_service"/>">
  			<bean:message key="label.maintainer"/>:
  		</span>
  	</td><td>
  			<html:text property="maintainer" size="60"/>
  	</td></tr>
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.keywords_service"/>">
  			<bean:message key="label.keywords"/>:
  		</span>
  	</td><td>
  		<html:textarea property="keywords" cols="60" rows="10"/>
  	</td></tr>
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.abstract_service"/>">
  			<bean:message key="label.abstract"/>:
  		</span>
  	</td><td>
  		<html:textarea property="_abstract" cols="60" rows="6"/>
  	</td></tr>
  	
  	<tr><td align="right">&nbsp;</td><td>
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	</td></tr>
  	
  	</html:form>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wfs/WFSConfigMenu.jsp
  
  Index: WFSConfigMenu.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  
  <table class="info">
    <tr>
      <td class="label">	
  		<logic:iterate id="key" indexId="ctr" name="GeoServer.ApplicationState" property="nameSpaceErrorKeys">
  			<nobr><%= key %></nobr><br>
  		</logic:iterate>
  	</td>
  	<td class="datum">
  		<logic:iterate id="value" indexId="ctr" name="GeoServer.ApplicationState" property="nameSpaceErrorValues">
  			<nobr><%= value %></nobr><br>
  		</logic:iterate>
  	</td>
    </tr>	
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wfs/serviceName.jsp
  
  Index: serviceName.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <span class="serviceTitle">
  	<bean:write name="Config.WFS" property="title"/>
  </span>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wfs/status.jsp
  
  Index: status.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table class="status">
  	<tr>
  		<td class="module">
  			<bean:message key="config.wfs.label"/>:
  		</td>
  		<td style="health">
  			<table class="progress">
  			  <tbody>
  		        <tr>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wfsGood" value="0">
  		    	    <td class="good"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wfsGood"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wfsGood"/>%">
  		    	    </td>
  		    	</logic:notEqual>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wfsBad" value="0">		    	
  		    	    <td class="bad"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wfsBad"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wfsBad"/>%">
  		    	    </td>
  		    	</logic:notEqual>		            
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wfsDisabled" value="0">		    	
  		    	    <td class="disabled"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wfsDisabled"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wfsDisabled"/>%">
  		    	    </td>
  		    	</logic:notEqual>		                   
  		        </tr>
  		      </tbody>
  		     </table>
  		</td>
  	</tr>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wms/WMSConfigContent.jsp
  
  Index: WMSConfigContent.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=0 width=100%>
  	
  	<html:form action="/config/wms/contentSubmit" focus="serviceType">
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.enabled"/>">
  			<bean:message key="label.enabled"/>:
  		</span>
  		</td><td colspan=2>
  			<html:checkbox property="enabled"/>
  	</td></tr>
  		
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.onlineResource_service"/>">
  			<bean:message key="label.onlineResource"/>:
  		</span>
  	</td><td colspan=2>
  		<html:text property="onlineResource" size="60"/>
  	</td></tr>
  
  	<tr><td align="right">&nbsp;</td><td>
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	</td></tr>
  	</html:form>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wms/WMSConfigDescription.jsp
  
  Index: WMSConfigDescription.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  
  <table border=0 width=100%>
  
  	<html:form action="/config/wms/descriptionSubmit" focus="name">
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.name_service"/>">
  			<bean:message key="label.name"/>:
  		</span>
  		</td><td>
  			<html:text property="name" size="60"/>
  	</td></tr>
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.title_service"/>">
  			<bean:message key="label.title"/>:
  		</span>
  		</td><td>
  			<html:text property="title" size="60"/>
  	</td></tr>
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.accessConstraints_service"/>">
  			<bean:message key="label.accessConstraints"/>:
  		</span>
  		</td><td>
  			<html:text property="accessConstraints" size="60"/>
  	</td></tr>
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.fees_service"/>">
  			<bean:message key="label.fees"/>:
  		</span>
  		</td><td>
  			<html:text property="fees" size="60"/>
  	</td></tr>
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.maintainer_service"/>">
  			<bean:message key="label.maintainer"/>:
  		</span>
  		</td><td>
  			<html:text property="maintainer" size="60"/>
  	</td></tr>
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.keywords_service"/>">
  			<bean:message key="label.keywords"/>:
  		</span>
  		</td><td>
  			<html:textarea property="keywords" cols="60" rows="10"/>
  	</td></tr>
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.abstract_service"/>">
  			<bean:message key="label.abstract"/>:
  		</span>
  		</td><td>
  			<html:textarea property="_abstract" cols="60" rows="6"/>
  	</td></tr>
  	<tr><td align="right">&nbsp;</td><td>
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	</td></tr>
  	</html:form>
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wms/WMSConfigMenu.jsp
  
  Index: WMSConfigMenu.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table class="info">
    <tr>
      <td class="label">	
  		<logic:iterate id="key" indexId="ctr" name="GeoServer.ApplicationState" property="nameSpaceErrorKeys">
  			<nobr><%= key %></nobr><br>
  		</logic:iterate>
  	</td>
  	<td class="datum">
  		<logic:iterate id="value" indexId="ctr" name="GeoServer.ApplicationState" property="nameSpaceErrorValues">
  			<nobr><%= value %></nobr><br>
  		</logic:iterate>
  	</td>
    </tr>	
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wms/WMSConfigRendering.jsp
  
  Index: WMSConfigRendering.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table border=0 width=100%>
  	
  	<html:form action="/config/wms/renderingSubmit" focus="svgRenderer">
  	
  	<tr><td align="right">
  		<span class="help" title="<bean:message key="help.wms.svgRenderer"/>">
  			<bean:message key="label.wms.svgRenderer"/>:
  		</span>
  		</td>
  		<td colspan=2>
  			<html:radio name="wmsRenderingForm" property="svgRenderer" value="Simple"><bean:message key="label.wms.svgSimple"/></html:radio>
  		</td></tr>
  	<tr><td align="right">
  		</td>
  		<td colspan=2>
  			<html:radio name="wmsRenderingForm" property="svgRenderer" value="Batik"><bean:message key="label.wms.svgBatik"/></html:radio> 	
  		</td></tr>
  	<tr><td align="right">
  		</td>
  		<td colspan=2>
  			<html:checkbox name="wmsRenderingForm" property="svgAntiAlias"><bean:message key="label.wms.svgAntiAlias"/></html:checkbox> 	
  		</td></tr>
  
  	<tr><td align="right">&nbsp;</td><td>
  		<html:submit>
  			<bean:message key="label.submit"/>
  		</html:submit>
  		
  		<html:reset>
  			<bean:message key="label.reset"/>
  		</html:reset>
  	</td></tr>
  	</html:form>
  	
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wms/serviceName.jsp
  
  Index: serviceName.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <span class="serviceTitle>
  	<bean:write name="Config.WMS" property="title"/>
  </span>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/pages/wms/status.jsp
  
  Index: status.jsp
  ===================================================================
  <%@ taglib uri="/tags/struts-bean" prefix="bean" %>
  <%@ taglib uri="/tags/struts-html" prefix="html" %>
  <%@ taglib uri="/tags/struts-logic" prefix="logic" %>
  
  <table class="status">
  	<tr>
  		<td class="module">
  			<bean:message key="config.wms.label"/>:
  		</td>
  		<td class="health">
  			<table class="progress">
  			  <tbody>
  		        <tr>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wmsGood" value="0">
  		    	    <td class="good"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wmsGood"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wmsGood"/>%">
  		    	    </td>
  		    	</logic:notEqual>
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wmsBad" value="0">		    	
  		    	    <td class="bad"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wmsBad"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wmsBad"/>%">
  		    	    </td>
  		    	</logic:notEqual>		            
  		        <logic:notEqual name="GeoServer.ApplicationState" property="wmsDisabled" value="0">		    	
  		    	    <td class="disabled"
  		    	        width="<bean:write name="GeoServer.ApplicationState" property="wmsDisabled"/>%"
  		    	        title="<bean:write name="GeoServer.ApplicationState" property="wmsDisabled"/>%">
  		    	    </td>
  		    	</logic:notEqual>		                   
  		        </tr>
  		      </tbody>
  		     </table>
  		</td>
  	</tr>
  
  </table>
  
  
  1.1                  metacat/lib/spatial/geoserver/WEB-INF/tld/spring.tld
  
  Index: spring.tld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  
  <taglib>
  
  	<tlib-version>1.1.1</tlib-version>
  
  	<jsp-version>1.2</jsp-version>
  
  	<short-name>Spring</short-name>
  
  	<uri>http://www.springframework.org/tags</uri>
  
  	<description>Spring Framework JSP Tag Library. Authors: Rod Johnson, Juergen Hoeller</description>
  
  
  	<tag>
  
  		<name>htmlEscape</name>
  		<tag-class>org.springframework.web.servlet.tags.HtmlEscapeTag</tag-class>
  		<body-content>JSP</body-content>
  
  		<description>
  			Sets default HTML escape value for the current page.
  			Overrides a "defaultHtmlEscape" context-param in web.xml, if any.
  		</description>
  
  		<attribute>
  			<name>defaultHtmlEscape</name>
  			<required>true</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  	</tag>
  
  
  	<tag>
  
  		<name>escapeBody</name>
  		<tag-class>org.springframework.web.servlet.tags.EscapeBodyTag</tag-class>
  		<body-content>JSP</body-content>
  
  		<description>
  			Escapes its enclosed body content, applying HTML escaping and/or JavaScript escaping.
  			The HTML escaping flag participates in a page-wide or application-wide setting
  			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
  		</description>
  
  		<attribute>
  			<name>htmlEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>javaScriptEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  	</tag>
  
  
  	<tag>
  
  		<name>message</name>
  		<tag-class>org.springframework.web.servlet.tags.MessageTag</tag-class>
  		<body-content>JSP</body-content>
  
  		<description>
  			Retrieves the message with the given code, or text if code isn't resolvable.
  			The HTML escaping flag participates in a page-wide or application-wide setting
  			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
  		</description>
  
  		<attribute>
  			<name>code</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>arguments</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>text</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>var</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>scope</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>htmlEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>javaScriptEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  	</tag>
  
  
  	<tag>
  
  		<name>theme</name>
  		<tag-class>org.springframework.web.servlet.tags.ThemeTag</tag-class>
  		<body-content>JSP</body-content>
  
  		<description>
  			Retrieves the theme message with the given code, or text if code isn't resolvable.
  			The HTML escaping flag participates in a page-wide or application-wide setting
  			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
  		</description>
  
  		<attribute>
  			<name>code</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>arguments</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>text</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>var</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>scope</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>htmlEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>javaScriptEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  	</tag>
  
  
  	<tag>
  
  		<name>hasBindErrors</name>
  		<tag-class>org.springframework.web.servlet.tags.BindErrorsTag</tag-class>
  		<body-content>JSP</body-content>
  
  		<description>
  			Provides Errors instance in case of bind errors.
  			The HTML escaping flag participates in a page-wide or application-wide setting
  			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
  		</description>
  
  		<variable>
  			<name-given>errors</name-given>
  			<variable-class>org.springframework.validation.Errors</variable-class>
  		</variable>
  
  		<attribute>
  			<name>name</name>
  			<required>true</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>htmlEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  	</tag>
  
  
  	<tag>
  
  		<name>nestedPath</name>
  		<tag-class>org.springframework.web.servlet.tags.NestedPathTag</tag-class>
  		<body-content>JSP</body-content>
  
  		<description>
  			Sets a nested path to be used by the bind tag's path.
  		</description>
  
  		<variable>
  			<name-given>nestedPath</name-given>
  			<variable-class>java.lang.String</variable-class>
  		</variable>
  
  		<attribute>
  			<name>path</name>
  			<required>true</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  	</tag>
  
  
  	<tag>
  
  		<name>bind</name>
  		<tag-class>org.springframework.web.servlet.tags.BindTag</tag-class>
  		<body-content>JSP</body-content>
  
  		<description>
  			Provides BindStatus object for the given bind path.
  			The HTML escaping flag participates in a page-wide or application-wide setting
  			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
  		</description>
  
  		<variable>
  			<name-given>status</name-given>
  			<variable-class>org.springframework.web.servlet.support.BindStatus</variable-class>
  		</variable>
  
  		<attribute>
  			<name>path</name>
  			<required>true</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>ignoreNestedPath</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>htmlEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  	</tag>
  
  
  	<tag>
  
  		<name>transform</name>
  		<tag-class>org.springframework.web.servlet.tags.TransformTag</tag-class>
  		<body-content>JSP</body-content>
  
  		<description>
  			Provides transformation of variables to Strings, using an appropriate
  			custom PropertyEditor from BindTag (can only be used inside BindTag).
  			The HTML escaping flag participates in a page-wide or application-wide setting
  			(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).
  		</description>
  
  		<attribute>
  			<name>value</name>
  			<required>true</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>var</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>scope</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  		<attribute>
  			<name>htmlEscape</name>
  			<required>false</required>
  			<rtexprvalue>true</rtexprvalue>
  		</attribute>
  
  	</tag>
  
  </taglib>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_describeFeatureType.xml
  
  Index: WFS_describeFeatureType.xml
  ===================================================================
  <!-- A sample describe request.  The schema is generated automatically by  -->
  <!-- GeoServer.  You can modify the schema with the web interface to hide  -->
  <!-- and/or require certain attributes. -->
  <!-- 
        If you change the "<TypeName>" tag below to the name of another 
        dataset, you can see the GML Schema for that layer.
        This will have all the column names and types.
        The getCapabilities demo will tell you the names of all the layers!
    -->
  <DescribeFeatureType
    version="1.0.0"
    service="WFS"
    xmlns="http://www.opengis.net/wfs"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
    
      <TypeName>topp:states</TypeName>
      
  </DescribeFeatureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_getCapabilities.xml
  
  Index: WFS_getCapabilities.xml
  ===================================================================
  <!-- Gets the WFS capabilities. For WMS capabilities, see WMS_getCapabilities demo-->
  <!--
  
        This will briefly describe all the layers (FeatureTypes) in that you have
        in your WFS server, plus more generic information about what your server
        supports.
        
        For more information about a particular FeatureType, use the 
        WFS_describeFeatureType.xml demo!
        
    -->
  <GetCapabilities
    service="WFS"
    xmlns="http://www.opengis.net/wfs"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd"/>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_getFeature.xml
  
  Index: WFS_getFeature.xml
  ===================================================================
  <!-- Performs a get feature.  Feel free to play with the Filter elements,  -->
  <!-- to get different results.  No filter will get all features, and you   -->
  <!-- can do filtering on spatial and non-spatial attributes.  See the ogc  -->
  <!-- filter specification http://www.opengis.org/docs/02-059.pdf for the   -->
  <!-- the complete syntax and examples.                                     -->
  <!--
      This particular Query will return the topp:states with the FID (unique ID)
      of 'states:3'. (Thats Delaware)
      
      You can also try a filter like:
            <PropertyIsEqualTo>
                  <PropertyName>STATE_NAME</PropertyName>
                  <Literal>Delaware</Literal>
            </PropertyIsEqualTo>
    -->
  <wfs:GetFeature service="WFS" version="1.0.0"
    outputFormat="GML2"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:wfs="http://www.opengis.net/wfs"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs
                        http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
    <wfs:Query typeName="topp:states">
      <ogc:Filter>
         <ogc:FeatureId fid="states.3"/>
      </ogc:Filter>
      </wfs:Query>
  </wfs:GetFeature>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_getFeatureBBOX.xml
  
  Index: WFS_getFeatureBBOX.xml
  ===================================================================
  <!-- Performs a get feature with a bounding box filter.      -->
  <!-- The BBOX filter is a convenience for a <Not><Disjoint>, -->
  <!-- it fetches all features that spatially interact with the given box. -->
  <!-- This example also shows how to request specific properties, in this -->
  <!-- case we just get the STATE_NAME and PERSONS -->
  
  <wfs:GetFeature service="WFS" version="1.0.0"
    outputFormat="GML2"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:wfs="http://www.opengis.net/wfs"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs
                        http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
    <wfs:Query typeName="topp:states">
      <wfs:PropertyName>topp:STATE_NAME</wfs:PropertyName>
      <wfs:PropertyName>topp:PERSONS</wfs:PropertyName>
      <ogc:Filter>
        <ogc:BBOX>
          <ogc:PropertyName>the_geom</ogc:PropertyName>
          <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
             <gml:coordinates>-75.102613,40.212597 -72.361859,41.512517</gml:coordinates>
          </gml:Box>
        </ogc:BBOX>
     </ogc:Filter>
    </wfs:Query>
  </wfs:GetFeature>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_getFeatureBetween.xml
  
  Index: WFS_getFeatureBetween.xml
  ===================================================================
  <!-- Performs a between filter to find the states with an area
       between 100,000 and 150,000.
       Also, it just returns the STATE_NAME, LAND_KM, and geometry 
       (instead of all the attributes).
    -->
  <wfs:GetFeature service="WFS" version="1.0.0"
    outputFormat="GML2"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:wfs="http://www.opengis.net/wfs"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs
                        http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
    <wfs:Query typeName="topp:states">
    <ogc:PropertyName>topp:STATE_NAME</ogc:PropertyName> 
    <ogc:PropertyName>topp:LAND_KM</ogc:PropertyName> 
     <ogc:PropertyName>topp:the_geom</ogc:PropertyName> 
  <ogc:Filter>
  <ogc:PropertyIsBetween>
  <ogc:PropertyName>topp:LAND_KM</ogc:PropertyName>
  <ogc:LowerBoundary><ogc:Literal>100000</ogc:Literal></ogc:LowerBoundary>
  <ogc:UpperBoundary><ogc:Literal>150000</ogc:Literal></ogc:UpperBoundary>
  </ogc:PropertyIsBetween>
  </ogc:Filter>
    </wfs:Query>
  </wfs:GetFeature> 
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_getFeatureIntersects.xml
  
  Index: WFS_getFeatureIntersects.xml
  ===================================================================
  <!-- Performs an intersects against a point.  This is functionally -->
  <!-- equivalent to <Not><Disjoint>.  This call can be used by a    -->
  <!-- client application to select a feature clicked on.  
  
       This will search through the dataset and return any polygons that
       contain the search point.  
       
       If you were searching in a point or line dataset, you might want
       to make a little polygon to search with instead of a single point
       so the user doesnt have to *exactly* click on the (mathematically
       infinitely thin) line or point.     
  
   -->
  <wfs:GetFeature service="WFS" version="1.0.0"
    outputFormat="GML2"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:wfs="http://www.opengis.net/wfs"
    xmlns="http://www.opengis.net/ogc"
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs
                        http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
    <wfs:Query typeName="topp:states">
      <Filter>
        <Intersects>
          <PropertyName>the_geom</PropertyName>
            <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
              <gml:coordinates>-74.817265,40.5296504</gml:coordinates>
            </gml:Point>
          </Intersects>
        </Filter>
    </wfs:Query>
  </wfs:GetFeature>
   
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_mathGetFeature.xml
  
  Index: WFS_mathGetFeature.xml
  ===================================================================
  <!-- Example of a getFeature with a math filter.  In this case  -->
  <!-- we want the states that have over 25% of their workers -->
  <!-- doing manual labor.  So we divide the manual field by    -->
  <!-- the total number of workers and compare it against 0.25 -->
  
  <wfs:GetFeature service="WFS" version="1.0.0"
    outputFormat="GML2"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:wfs="http://www.opengis.net/wfs"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs
                        http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
    <wfs:Query typeName="topp:states">
      <ogc:Filter>
        <ogc:PropertyIsGreaterThan>
          <ogc:Div>
              <ogc:PropertyName>MANUAL</ogc:PropertyName>
              <ogc:PropertyName>WORKERS</ogc:PropertyName>
          </ogc:Div>
           <ogc:Literal>0.25</ogc:Literal>
      </ogc:PropertyIsGreaterThan>
      </ogc:Filter>
      </wfs:Query>
  </wfs:GetFeature>
   
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_transactionDelete.xml
  
  Index: WFS_transactionDelete.xml
  ===================================================================
  <!-- We include this transaction as a sample for deletes.        -->
  <!--
        YOU PROBABLY DO NOT WANT TO RUN THIS QUERY SINCE 
         IT WILL MODIFY YOUR SOURCE DATA FILES
    -->
  <wfs:Transaction service="WFS" version="1.0.0"
    xmlns:cdf="http://www.opengis.net/cite/data"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:wfs="http://www.opengis.net/wfs">
    xmlns:topp="http://www.openplans.org/topp">
    <wfs:Delete typeName="topp:tasmania_roads">
      <ogc:Filter>
        <ogc:PropertyIsEqualTo>
          <ogc:PropertyName>topp:TYPE</ogc:PropertyName>
          <ogc:Literal>alley</ogc:Literal>
        </ogc:PropertyIsEqualTo>
      </ogc:Filter>
    </wfs:Delete>
  </wfs:Transaction>
   
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_transactionInsert.xml
  
  Index: WFS_transactionInsert.xml
  ===================================================================
  <!--
        YOU PROBABLY DO NOT WANT TO RUN THIS QUERY SINCE 
         IT WILL MODIFY YOUR SOURCE DATA FILES
         
         It will add a simple line to the tasmania_roads dataset.
         
    -->
  <wfs:Transaction service="WFS" version="1.0.0"
    xmlns:wfs="http://www.opengis.net/wfs"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd http://www.openplans.org/topp http://localhost:8080/geoserver/wfs/DescribeFeatureType?typename=topp:tasmania_roads">
    <wfs:Insert>
      <topp:tasmania_roads>
        <topp:the_geom>
          <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#27354">
            <gml:lineStringMember>
              <gml:LineString>
                <gml:coordinates decimal="." cs="," ts=" ">
  494475.71056415,5433016.8189323 494982.70115662,5435041.95096618
                </gml:coordinates>
              </gml:LineString>
            </gml:lineStringMember>
          </gml:MultiLineString>
        </topp:the_geom>
        <topp:TYPE>alley</topp:TYPE>
      </topp:tasmania_roads>
    </wfs:Insert>
  </wfs:Transaction>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_transactionUpdate.xml
  
  Index: WFS_transactionUpdate.xml
  ===================================================================
   <!--       YOU PROBABLY DO NOT WANT TO RUN THIS QUERY SINCE 
         IT WILL MODIFY YOUR SOURCE DATA FILES
  
        This will update the type field for the tasmania_roads dataset.
        
     -->
  
  
  <wfs:Transaction service="WFS" version="1.0.0"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:wfs="http://www.opengis.net/wfs">
    <wfs:Update typeName="topp:tasmania_roads">
      <wfs:Property>
        <wfs:Name>TYPE</wfs:Name>
        <wfs:Value>street</wfs:Value>
      </wfs:Property>
      <ogc:Filter>
        <ogc:FeatureId fid="tasmania_roads.1"/>
      </ogc:Filter>
    </wfs:Update>
  </wfs:Transaction>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WFS_transactionUpdateGeom.xml
  
  Index: WFS_transactionUpdateGeom.xml
  ===================================================================
  <!--       YOU PROBABLY DO NOT WANT TO RUN THIS QUERY SINCE 
                IT WILL MODIFY YOUR SOURCE DATA FILES
  
       This will update one of the geometry fields in the tasmania_roads dataset.
       
       
  -->
  <wfs:Transaction service="WFS" version="1.0.0"
    xmlns:topp="http://www.openplans.org/topp"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:wfs="http://www.opengis.net/wfs"
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd">
    <wfs:Update typeName="topp:tasmania_roads">
      <wfs:Property>
        <wfs:Name>the_geom</wfs:Name>
        <wfs:Value>
          <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#27345">
            <gml:lineStringMember>
            	<gml:LineString>
              	<gml:coordinates>500000,5450000,0 540000,5450000,0</gml:coordinates>
            	</gml:LineString>
            </gml:lineStringMember>
          </gml:MultiLineString>
        </wfs:Value>
      </wfs:Property>
      <ogc:Filter>
        <ogc:FeatureId fid="tasmania_roads.1"/>
      </ogc:Filter>
    </wfs:Update>
  </wfs:Transaction>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_GetLegendGraphic-SLD.url
  
  Index: WMS_GetLegendGraphic-SLD.url
  ===================================================================
  wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states&SLD=http://localhost:8080/geoserver/conf/styles/green.sld
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_GetLegendGraphic-SLD_BODY.url
  
  Index: WMS_GetLegendGraphic-SLD_BODY.url
  ===================================================================
  wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states&SLD_BODY=%3C%3Fxml+version%3D%221.0%22+encoding%3D%22ISO-8859-1%22%3F%3E%3CStyledLayerDescriptor+version%3D%221.0.0%22+xsi%3AschemaLocation%3D%22http%3A%2F%2Fwww.opengis.net%2Fsld+StyledLayerDescriptor.xsd%22+xmlns%3D%22http%3A%2F%2Fwww.opengis.net%2Fsld%22+xmlns%3Aogc%3D%22http%3A%2F%2Fwww.opengis.net%2Fogc%22+xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22+xmlns%3Axsi%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance%22%3E%3CNamedLayer%3E%3CName%3EATestLayer%3C%2FName%3E%3CUserStyle%3E%3CName%3Epolyshp%3C%2FName%3E%3CFeatureTypeStyle%3E%3CRule%3E%3CPolygonSymbolizer%3E%3CFill%3E%3CCssParameter%20name%3D%22fill%22%3E%2366FF66%3C%2FCssParameter%3E%3C%2FFill%3E%3CStroke%2F%3E%3C%2FPolygonSymbolizer%3E%3C%2FRule%3E%3C%2FFeatureTypeStyle%3E%3C%2FUserStyle%3E%3C%2FNamedLayer%3E%3C%2FStyledLayerDescriptor%3E&
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_GetLegendGraphic.url
  
  Index: WMS_GetLegendGraphic.url
  ===================================================================
  wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_describeLayer.url
  
  Index: WMS_describeLayer.url
  ===================================================================
  wms?request=DescribeLayer&layers=topp:states
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_featureInfo.url
  
  Index: WMS_featureInfo.url
  ===================================================================
  wms?bbox=-130,24,-66,50&styles=population&format=jpeg&info_format=text/plain&request=GetFeatureInfo&layers=topp:states&query_layers=topp:states&width=550&height=250&x=170&y=160
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_getCapabilities.url
  
  Index: WMS_getCapabilities.url
  ===================================================================
  wms?request=getCapabilities
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_getMap.url
  
  Index: WMS_getMap.url
  ===================================================================
  wms?bbox=-130,24,-66,50&styles=population&Format=image/png&request=GetMap&layers=topp:states&width=550&height=250&srs=EPSG:4326
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_getMap_SLD_BODY_LiteralMode.url
  
  Index: WMS_getMap_SLD_BODY_LiteralMode.url
  ===================================================================
  wms?bbox=-130,24,-66,50&Format=image/png&request=GetMap&width=550&height=250&srs=EPSG:4326&SLD_BODY=%3CStyledLayerDescriptor%20version%3D%221.0.0%22%3E%3CUserLayer%3E%3CName%3Etopp:states%3C/Name%3E%3CUserStyle%3E%3CName%3EUserSelection%3C/Name%3E%3CFeatureTypeStyle%3E%3CRule%3E%3CFilter%20xmlns:gml%3D%22http://www.opengis.net/gml%22%3E%3CPropertyIsEqualTo%3E%3CPropertyName%3ESTATE_NAME%3C/PropertyName%3E%3CLiteral%3EIllinois%3C/Literal%3E%3C/PropertyIsEqualTo%3E%3C/Filter%3E%3CPolygonSymbolizer%3E%3CFill%3E%3CCssParameter%20name%3D%22fill%22%3E%23FF0000%3C/CssParameter%3E%3C/Fill%3E%3C/PolygonSymbolizer%3E%3C/Rule%3E%3CRule%3E%3CLineSymbolizer%3E%3CStroke/%3E%3C/LineSymbolizer%3E%3C/Rule%3E%3C/FeatureTypeStyle%3E%3C/UserStyle%3E%3C/UserLayer%3E%3C/StyledLayerDescriptor%3E
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/demo/WMS_getMap_SVG.url
  
  Index: WMS_getMap_SVG.url
  ===================================================================
  wms?bbox=-130,24,-66,50&request=GetMap&layers=topp:states&width=800&height=400&srs=EPSG:4326&styles=population&Format=image/svg+xml
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/featureTypes/Data_Bounds_data_bounds/info.xml
  
  Index: info.xml
  ===================================================================
  <featureType datastore = "Data_Bounds" >
  <name>data_bounds</name>
  <!--
  native wich EPGS code for the FeatureTypeInfoDTO
  -->
  <SRS>4326</SRS>
  <title>data_bounds_Type</title>
  <abstract>Generated from Data_Bounds</abstract>
  <numDecimals value = "8" />
  <keywords>metacat data</keywords>
  <latLonBoundingBox dynamic = "false" miny = "-90" maxy = "90" maxx = "180" minx = "-180"  />
  <!--
  the default style this FeatureTypeInfoDTO can be represented by.
  at least must contain the "default" attribute 
  -->
  <styles default = "data_bounds_style"  />
  </featureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/featureTypes/Data_Points_data_points/info.xml
  
  Index: info.xml
  ===================================================================
  <featureType datastore = "Data_Points" >
  <name>data_points</name>
  <!--
  native wich EPGS code for the FeatureTypeInfoDTO
  -->
  <SRS>4326</SRS>
  <title>data_points_Type</title>
  <abstract>Generated from Data_Points</abstract>
  <numDecimals value = "8" />
  <keywords>metacat data</keywords>
  <latLonBoundingBox dynamic = "true" miny = "-90" maxy = "90" maxx = "180" minx = "-180"  />
  <!--
  the default style this FeatureTypeInfoDTO can be represented by.
  at least must contain the "default" attribute 
  -->
  <styles default = "data_points_style"  />
  </featureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/featureTypes/countries_world_borders/info.xml
  
  Index: info.xml
  ===================================================================
  <featureType datastore = "countries" >
  <name>world_borders</name>
  <SRS>4326</SRS>
  <title>countries_type</title>
  <abstract>Freegis Worlddata Countries</abstract>
  <numDecimals value = "8" />
  <keywords>metacat data</keywords>
  <latLonBoundingBox dynamic = "true" miny = "-90" maxy = "90" maxx = "180" minx = "-180"  />
  <!--
  the default style this FeatureTypeInfoDTO can be represented by.
  at least must contain the "default" attribute 
  -->
  <styles default = "defaultPolygon"  />
  </featureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/featureTypes/kruger_bizunits_BNDRY_BUSINESSUNITS/info.xml
  
  Index: info.xml
  ===================================================================
  <featureType datastore = "kruger_bizunits" >
  <name>BNDRY_BUSINESSUNITS</name>
  <!--
  native wich EPGS code for the FeatureTypeInfoDTO
  -->
  <SRS>32736</SRS>
  <title>BNDRY_BUSINESSUNITS_Type</title>
  <abstract>Generated from kruger_bizunits</abstract>
  <numDecimals value = "8" />
  <keywords>kruger_bizunits BNDRY_BUSINESSUNITS</keywords>
  <latLonBoundingBox dynamic = "false" miny = "-25.535347249986696" maxy = "-22.325421658434053" maxx = "32.05331207584916" minx = "30.841566117389583"  />
  <!--
  the default style this FeatureTypeInfoDTO can be represented by.
  at least must contain the "default" attribute 
  -->
  <styles default = "simple_roads"  />
  </featureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/featureTypes/kruger_boundary_BNDRY_KRUGERNP/info.xml
  
  Index: info.xml
  ===================================================================
  <featureType datastore = "kruger_boundary" >
  <name>BNDRY_KRUGERNP</name>
  <!--
  native wich EPGS code for the FeatureTypeInfoDTO
  -->
  <SRS>32736</SRS>
  <title>BNDRY_KRUGERNP_Type</title>
  <abstract>Generated from kruger_boundary</abstract>
  <numDecimals value = "8" />
  <keywords>kruger_boundary BNDRY_KRUGERNP</keywords>
  <latLonBoundingBox dynamic = "false" miny = "-25.535347249986696" maxy = "-22.325421658434053" maxx = "32.05331207584916" minx = "30.841566117389583"  />
  <!--
  the default style this FeatureTypeInfoDTO can be represented by.
  at least must contain the "default" attribute 
  -->
  <styles default = "simple_roads"  />
  </featureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/featureTypes/kruger_roads_INFRA_ROADSPUBLIC_VIEW/info.xml
  
  Index: info.xml
  ===================================================================
  <featureType datastore = "kruger_roads" >
  <name>INFRA_ROADSPUBLIC_VIEW</name>
  <!--
  native wich EPGS code for the FeatureTypeInfoDTO
  -->
  <SRS>32736</SRS>
  <title>INFRA_ROADSPUBLIC_VIEW_Type</title>
  <abstract>Generated from kruger_roads</abstract>
  <numDecimals value = "8" />
  <keywords>INFRA_ROADSPUBLIC_VIEW kruger_roads</keywords>
  <latLonBoundingBox dynamic = "false" miny = "-25.48096454724333" maxy = "-22.38292047412276" maxx = "31.995959272344184" minx = "30.913907543515087"  />
  <!--
  the default style this FeatureTypeInfoDTO can be represented by.
  at least must contain the "default" attribute 
  -->
  <styles default = "krugerRoads"  />
  </featureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/featureTypes/kruger_soils_SOILS_VENTER/info.xml
  
  Index: info.xml
  ===================================================================
  <featureType datastore = "kruger_soils" >
  <name>SOILS_VENTER</name>
  <!--
  native wich EPGS code for the FeatureTypeInfoDTO
  -->
  <SRS>32736</SRS>
  <title>SOILS_VENTER_Type</title>
  <abstract>Generated from kruger_soils</abstract>
  <numDecimals value = "8" />
  <keywords>kruger_soils SOILS_VENTER</keywords>
  <latLonBoundingBox dynamic = "false" miny = "-25.535347249986696" maxy = "-22.325421658434053" maxx = "32.05331207584916" minx = "30.841566117389583"  />
  <!--
  the default style this FeatureTypeInfoDTO can be represented by.
  at least must contain the "default" attribute 
  -->
  <styles default = "cite_lakes"  />
  </featureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/featureTypes/states/info.xml
  
  Index: info.xml
  ===================================================================
  <featureType datastore = "states_shp" >
  <name>states</name>
  <!--
  native wich EPGS code for the FeatureTypeInfoDTO
  -->
  <SRS>4326</SRS>
  <title>USA Population</title>
  <abstract>This is some census data on the states.</abstract>
  <numDecimals value = "0" />
  <keywords>census, state boundaries, united states</keywords>
  <latLonBoundingBox dynamic = "false" miny = "24.955967" maxy = "49.371735" maxx = "-66.969849" minx = "-124.731422"  />
  <!--
  the default style this FeatureTypeInfoDTO can be represented by.
  at least must contain the "default" attribute 
  -->
  <styles default = "population"  />
  </featureType>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/data_bounds.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/data_bounds.prj
  
  Index: data_bounds.prj
  ===================================================================
  GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/data_bounds.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/data_bounds.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/data_points.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/data_points.prj
  
  Index: data_points.prj
  ===================================================================
  GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/data_points.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/data_points.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/metacat_testdata.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/metacat_testdata.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/metacat_shps/metacat_testdata.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/AddressGap.xml
  
  Index: AddressGap.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Address Gap</name>
    <description>Do the addresses have gaps.</description>
    <class>org.geotools.validation.network.AddressGapValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/AddressOverlap.xml
  
  Index: AddressOverlap.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Address Overlap</name>
    <description>Do the addresses overlap.</description>
    <class>org.geotools.validation.network.AddressOverlapValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/AngleSize.xml
  
  Index: AngleSize.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Angle Size</name>
    <description>Are the angle sizes too big/small?.</description>
    <class>org.geotools.validation.network.AngleSizeValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/Attribute.xml
  
  Index: Attribute.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Attribute</name>
    <description>Checks attributre relations as specified.</description>
    <class>org.geotools.validation.attributes.AttributeValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/Constraint.xml
  
  Index: Constraint.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>UniqueFID</name>
    <description>All features must pass the provided filter</description>
    <class>org.geotools.validation.attributes.UniqueFIDValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/ContainsIntegrity.xml
  
  Index: ContainsIntegrity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
  	<name>Geometry Contains Geometry</name>
  	<description> A Geometry Contains another Geometry.</description>
  	<class>
  		org.geotools.validation.spatial.relate.ContainsIntegrity
  	</class>
  </plugin>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/CrossesIntegrity.xml
  
  Index: CrossesIntegrity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
  	<name>Geometry Crosses Geometry</name>
  	<description> A Geometry crosses another Geometry.</description>
  	<class>
  		org.geotools.validation.spatial.relate.CrossesIntegrity
  	</class>
  </plugin>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/DisjointIntegrity.xml
  
  Index: DisjointIntegrity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
  	<name>Geometry Disjoint Geometry</name>
  	<description> A Geometry is disjoint from another Geometry.</description>
  	<class>
  		org.geotools.validation.spatial.relate.DisjointIntegrity
  	</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/Domain.xml
  
  Index: Domain.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Domain</name>
    <description>Checks for domain existance.</description>
    <class>org.geotools.validation.attributes.DomainValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/Equality.xml
  
  Index: Equality.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Equality</name>
    <description>Checks for equality between a set value and a feature.</description>
    <class>org.geotools.validation.attributes.EqualityValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/GazetteerName.xml
  
  Index: GazetteerName.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Gazetteer</name>
    <description>Checks Gazetteer for the existance of the specified name.</description>
    <class>org.geotools.validation.attributes.GazetteerNameValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/IntersectsIntegrity.xml
  
  Index: IntersectsIntegrity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
  	<name>Geometry Intersects Geometry</name>
  	<description> A Geometry Intersects another Geometry.</description>
  	<class>
  		org.geotools.validation.spatial.relate.IntersectsIntegrity
  	</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/IsValidGeometry.xml
  
  Index: IsValidGeometry.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Is Valid Geometry</name>
    <description>Is this a valid GML geometry for geoserver.</description>
    <class>org.geotools.validation.spatial.IsValidGeometryValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineCoveredByFeatureLine.xml
  
  Index: LineCoveredByFeatureLine.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Feature Covers Line</name>
    <description> A line is covered by a line feature.</description>
    <class>org.geotools.validation.spatial.LineCoveredByFeatureLineValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineCoveredByPolygon.xml
  
  Index: LineCoveredByPolygon.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Covers Line</name>
    <description> A line is covered by a polygon.</description>
    <class>org.geotools.validation.spatial.LineCoveredByPolygonValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineCoveredByPolygonBoundary.xml
  
  Index: LineCoveredByPolygonBoundary.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Boundary Covers Line</name>
    <description> A line is covered by a polygon boundary.</description>
    <class>org.geotools.validation.spatial.LineCoveredByPolygonBoundaryValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineEndPointCoveredByLine.xml
  
  Index: LineEndPointCoveredByLine.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Covers Line End</name>
    <description> Line end point is covered by another line.</description>
    <class>org.geotools.validation.spatial.LineEndPointCoveredByLineValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineIntersectsLineWithNode.xml
  
  Index: LineIntersectsLineWithNode.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Lines Node Intersect</name>
    <description> Lines must intersect at a node.</description>
    <class>org.geotools.validation.spatial.LineIntersectsLineWithNodeValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineMustBeASinglePart.xml
  
  Index: LineMustBeASinglePart.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Single Part</name>
    <description> Line must be a single part.</description>
    <class>org.geotools.validation.spatial.LineMustBeASinglePartValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineNoDangles.xml
  
  Index: LineNoDangles.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Without Dangles</name>
    <description> Line does not have dangles.</description>
    <class>org.geotools.validation.spatial.LineNoDanglesValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineNoPseudoNode.xml
  
  Index: LineNoPseudoNode.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Without Pseudo Node</name>
    <description> Line does not have a pseudo node.</description>
    <class>org.geotools.validation.spatial.LineNoPseudoNodeValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineNoSelfIntersect.xml
  
  Index: LineNoSelfIntersect.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Not Self Intersection</name>
    <description> Line does not intersect itself.</description>
    <class>org.geotools.validation.spatial.LineNoSelfIntersectValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineNoSelfOverlapping.xml
  
  Index: LineNoSelfOverlapping.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Not Self OverLapping</name>
    <description> Line does not touch itself.</description>
    <class>org.geotools.validation.spatial.LineNoSelfOverlappingValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LineNotTouchingPolygonInterior.xml
  
  Index: LineNotTouchingPolygonInterior.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Not Entering Polygon</name>
    <description> Line does not touch the polygon interior.</description>
    <class>org.geotools.validation.spatial.LineNotTouchingPolygonInteriorValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LinesNotIntersect.xml
  
  Index: LinesNotIntersect.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Lines Do Not Intersect</name>
    <description>One Line does not overlap the other line.</description>
    <class>org.geotools.validation.spatial.LinesNotIntersectValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/LinesNotOverlap.xml
  
  Index: LinesNotOverlap.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Not Overlapping Line</name>
    <description>One Line does not overlap the other line.</description>
    <class>org.geotools.validation.spatial.LinesNotOverlapValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/NameExists.xml
  
  Index: NameExists.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>NameExists</name>
    <description>All features must pass the provided filter</description>
    <class>org.geotools.validation.attributes.NullZeroValidation</class>
    <argument final="true">
      <name>typeRef</name>
      <string>*</string>
    </argument>
    <argument final="false">
      <name>attributeName</name>
      <string>name</string>
    </argument>
  </plugin>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/NameInList.xml
  
  Index: NameInList.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>NameInList</name>
    <description>All features must pass the provided filter</description>
    <class>org.geoserver.validation.plugins.filter.OGCFilter</class>
    <argument>
      <name>tempDirectory</name>
      <anyURI>file:///c:/temp</anyURI>
    </argument>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/NullZero.xml
  
  Index: NullZero.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Null Zero</name>
    <description>Checks for non null or zero values.</description>
    <class>org.geotools.validation.attributes.NullZeroValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/OverlapsIntegrity.xml
  
  Index: OverlapsIntegrity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
  	<name>Geometry Overlaps Geometry</name>
  	<description> A Geometry Overlaps another Geometry.</description>
  	<class>
  		org.geotools.validation.relate.OverlapsIntegrity
  	</class>
  </plugin>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PointCoveredByEndPointOfLine.xml
  
  Index: PointCoveredByEndPointOfLine.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line End Point Covers Point</name>
    <description>The point is covered by a line end point.</description>
    <class>org.geotools.validation.spatial.PointCoveredByEndPointOfLineValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PointCoveredByLine.xml
  
  Index: PointCoveredByLine.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Line Covers Point</name>
    <description>The point is covered by the line.</description>
    <class>org.geotools.validation.spatial.PointCoveredByLineValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PointCoveredByPolygon.xml
  
  Index: PointCoveredByPolygon.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Covers Point</name>
    <description>The point is covered by the polygon.</description>
    <class>org.geotools.validation.spatial.PointCoveredByPolygonValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PointCoveredByPolygonBoundary.xml
  
  Index: PointCoveredByPolygonBoundary.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Boundary Covers Point</name>
    <description>The point is covered by the polygon boundary.</description>
    <class>org.geotools.validation.spatial.PointCoveredByPolygonBoundaryValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PointInsidePolygon.xml
  
  Index: PointInsidePolygon.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Point Inside Polygon</name>
    <description>The point is inside the polygon.</description>
    <class>org.geotools.validation.spatial.PointInsidePolygonValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PolygonBoundaryCoveredByPolygon.xml
  
  Index: PolygonBoundaryCoveredByPolygon.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Covers Polygon Boundary</name>
    <description>One polygon boundary is covered by another polygon.</description>
    <class>org.geotools.validation.spatial.PolygonBoundaryCoveredByPolygonValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PolygonCoveredByFeaturePolygon.xml
  
  Index: PolygonCoveredByFeaturePolygon.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Covers Feature Polygon</name>
    <description>One polygon is covered by the feature polygon.</description>
    <class>org.geotools.validation.spatial.PolygonCoveredByFeaturePolygonValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PolygonCoveredByPolygon.xml
  
  Index: PolygonCoveredByPolygon.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Covers Polygon</name>
    <description>One polygon is covered by the other polygon.</description>
    <class>org.geotools.validation.spatial.PolygonCoveredByPolygonValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PolygonNoGaps.xml
  
  Index: PolygonNoGaps.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Gap Detection</name>
    <description>The polygon does not have gaps.</description>
    <class>org.geotools.validation.spatial.PolygonNoGapsValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PolygonNotCoveredByPolygon.xml
  
  Index: PolygonNotCoveredByPolygon.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Not Overlapping Line</name>
    <description>One polygon not covered by the other polygon.</description>
    <class>org.geotools.validation.spatial.PolygonNotCoveredByPolygonValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PolygonNotOverlappingLine.xml
  
  Index: PolygonNotOverlappingLine.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Not Overlapping Line</name>
    <description>One polygon cannot overlap the line.</description>
    <class>org.geotools.validation.spatial.PolygonNotOverlappingLineValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/PolygonNotOverlappingPolygon.xml
  
  Index: PolygonNotOverlappingPolygon.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Polygon Not Overlapping Polygon</name>
    <description>One polygon cannot overlap the other polygon.</description>
    <class>org.geotools.validation.spatial.PolygonNotOverlappingPolygonValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/Range.xml
  
  Index: Range.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Range</name>
    <description>Checks for a range value.</description>
    <class>org.geotools.validation.attributes.RangeValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/RelateIntegrity.xml
  
  Index: RelateIntegrity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
  	<name>Geometry Relate Geometry</name>
  	<description> Relate 2 Geometries using a DE9I Matrix.</description>
  	<class>
  		org.geotools.validation.spatial.relate.RelateIntegrity
  	</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/SQL.xml
  
  Index: SQL.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>SQL</name>
    <description>Checks that the SQL presented has results.</description>
    <class>org.geotools.validation.attributes.SQLValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/SingleValue.xml
  
  Index: SingleValue.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Single Value</name>
    <description>Checks for a single value.</description>
    <class>org.geotools.validation.attributes.SingleValueValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/StarNode.xml
  
  Index: StarNode.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Star Node</name>
    <description>Does this have a star node.</description>
    <class>org.geotools.validation.network.StarNodeValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/TouchesIntegrity.xml
  
  Index: TouchesIntegrity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
  	<name>Geometry Touches Geometry</name>
  	<description> A Geometry touches another Ggeometry.</description>
  	<class>
  		org.geotools.validation.spatial.relate.TouchesIntegrity
  	</class>
  </plugin>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/UniqueFID.xml
  
  Index: UniqueFID.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>FID Uniqueness</name>
    <description>Check for uniqueness in FID.</description>
    <class>org.geotools.validation.attributes.UniqueFIDValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/Uniquity.xml
  
  Index: Uniquity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
    <name>Uniquity</name>
    <description>Check for uniqueness.</description>
    <class>org.geotools.validation.attributes.UniquityValidation</class>
  </plugin>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/plugIns/WithinIntegrity.xml
  
  Index: WithinIntegrity.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <plugin xmlns="pluginSchema" 
  xmlns:gml="http://www.opengis.net/gml" 
  xmlns:ogc="http://www.opengis.net/ogc" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  xs:schemaLocation="pluginSchema /data/capabilities/validate/pluginSchema.xsd">
  	<name>Geometry Within Geometry</name>
  	<description> A geometry is within another Geometry.</description>
  	<class>
  		org.geotools.validation.spatial.relate.WithinIntegrity
  	</class>
  </plugin>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_BUSINESSUNITS.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_BUSINESSUNITS.prj
  
  Index: BNDRY_BUSINESSUNITS.prj
  ===================================================================
  PROJCS["WGS_1984_UTM_Zone_36S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",33.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_BUSINESSUNITS.sbn
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_BUSINESSUNITS.sbx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_BUSINESSUNITS.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_BUSINESSUNITS.shp.xml
  
  Index: BNDRY_BUSINESSUNITS.shp.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <metadata>
  	<idinfo>
  		<citation>
  			<citeinfo>
  				<origin>Kruger National Park Scientific Services GIS Lab</origin>
  				<pubdate>20010101</pubdate>
  				<title Sync="TRUE">BNDRY_BUSINESSUNITS</title>
  				<edition>February 2001</edition>
  				<geoform Sync="TRUE">vector digital data</geoform>
  				<pubinfo>
  					<pubplace>Skukuza, Kruger National Park</pubplace>
  					<publish>KNP GIS Lab</publish>
  				</pubinfo>
  				<othercit>Not Applicable</othercit>
  				<lworkcit>
  					<citeinfo>
  						<origin></origin>
  						<pubdate></pubdate>
  						<title></title>
  						<pubinfo>
  							<pubplace></pubplace>
  							<publish></publish>
  						</pubinfo>
  						<onlink></onlink>
  					</citeinfo>
  				</lworkcit>
  				<ftname Sync="TRUE">BNDRY_BUSINESSUNITS</ftname><onlink Sync="TRUE">\\Gislab\gisdata\KNP_data\Boundaries\BNDRY_BUSINESSUNITS.shp</onlink></citeinfo>
  		</citation>
  		<descript>
  			<abstract>
  This is a polygon theme indicating the extent of the four
  Business Units within Kruger National Park . The KNP falls
  under the authority of South African National Parks (www.parks-sa.co.za).
  </abstract>
  			<purpose>
  For the KNP Scientific Services GIS database - for research
  and cartograhic products. This database is intended to be
  extended or incorporated into a future KNP "Regional GIS"
  node of SANP.
  </purpose>
  			<supplinf>Not Applicable</supplinf>
  			<langdata Sync="TRUE">en</langdata></descript>
  		<timeperd>
  			<timeinfo>
  				<rngdates>
  					<begdate>200103027</begdate>
  					<enddate>200103027</enddate>
  				</rngdates>
  			</timeinfo>
  			<current>20010702</current>
  		</timeperd>
  		<status>
  			<progress>Complete</progress>
  			<update>Continually</update>
  		</status>
  		<spdom>
  			<bounding>
  				<westbc Sync="TRUE">30.841566</westbc>
  				<eastbc Sync="TRUE">32.053312</eastbc>
  				<northbc Sync="TRUE">-22.325422</northbc>
  				<southbc Sync="TRUE">-25.535347</southbc>
  			</bounding>
  			<lboundng><leftbc Sync="TRUE">283091.000000</leftbc><rightbc Sync="TRUE">402511.000000</rightbc><bottombc Sync="TRUE">7175416.000000</bottombc><topbc Sync="TRUE">7529638.000000</topbc></lboundng></spdom>
  		<keywords>
  			<theme>
  				<themekt>None</themekt>
  				<themekey>Boundary</themekey>
  				<themekey>Kruger National Park</themekey>
  				<themekey>Roads</themekey>
  				<themekey>Rivers</themekey>
  				<themekey>Business Units</themekey></theme>
  			<place>
  				<placekt>None</placekt>
  				<placekey>Kruger National Park</placekey>
  				<placekey>Mpumalanga</placekey>
  				<placekey>Northern Province</placekey>
  				<placekey>South Africa</placekey>
  			</place>
  		</keywords>
  		<accconst>None</accconst>
  		<useconst>Use at own risk. See Liability and Accuracy sections</useconst>
  		<ptcontac>
  			<cntinfo>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time</hours>
  				<cntorgp><cntorg>South African National Parks</cntorg><cntper>Don Ntsala</cntper></cntorgp></cntinfo>
  		</ptcontac>
  		<native Sync="TRUE">Microsoft Windows 2000 Version 5.0 (Build 2195) Service Pack 3; ESRI ArcCatalog 8.2.0.700</native>
  		<natvform Sync="TRUE">Shapefile</natvform></idinfo>
  	<dataqual>
  		<attracc>
  			<attraccr>Not applicable</attraccr>
  		</attracc>
  		<logic>Not Applicable</logic>
  		<complete>
  Complete, but due for an update based on recently acquired
  cadastral boundaries.
  </complete>
  		<posacc>
  			<horizpa>
  				<horizpar>Believed to be within 50m of the true location</horizpar>
  			</horizpa>
  			<vertacc>
  				<vertaccr>Not applicable.</vertaccr>
  			</vertacc>
  		</posacc>
  		<lineage>
  			<srcinfo>
  				<srccite>
  					<citeinfo>
  						<origin>Chief Directorate - Surveys and Mapping</origin>
  						<pubdate>Unknown</pubdate>
  						<title>Topographic map series base data 1</title>
  						<edition>Unknown</edition>
  						<geoform>map</geoform>
  						<pubinfo>
  							<pubplace>Mowbray, Cape Town</pubplace>
  							<publish>Chief Directorate - Surveys and Mapping</publish>
  						</pubinfo>
  						<othercit>
  Nothing is known regarding the lineage of this layer, but
  it is most likely to have been digitized off 1:50,000
  topographic maps.
  </othercit>
  						<onlink>http://w3sli.wcape.gov.za/surveys/</onlink>
  						<lworkcit>
  							<citeinfo>
  								<origin></origin>
  								<pubdate></pubdate>
  								<title></title>
  								<pubinfo>
  									<pubplace></pubplace>
  									<publish></publish>
  								</pubinfo>
  								<onlink></onlink>
  							</citeinfo>
  						</lworkcit>
  					</citeinfo>
  				</srccite>
  				<srcscale>50000</srcscale>
  				<typesrc>Unknown</typesrc>
  				<srctime>
  					<timeinfo>
  						<rngdates>
  							<begdate>unknown</begdate>
  							<enddate>unknown</enddate>
  						</rngdates>
  					</timeinfo>
  					<srccurr>Unknown</srccurr>
  				</srctime>
  				<srccontr>Source data as supplied by Surveys and Mapping were
  converted by GIMS from ReGIS format to ARC/INFO coverages,
  cleaned and built (tolerances unknown). They were also
  edge-matched and the national datum transformation from
  Cape to Hartebeesthoek94 datum was applied with an accuracy
  higher than that of the actual data.
  </srccontr></srcinfo>
  			<srcinfo>
  				<srccite>
  					<citeinfo>
  						<origin>Chief Directorate - Surveys and Mapping</origin>
  						<pubdate>Unknown</pubdate>
  						<title>Topographic map series base data 1</title>
  						<edition>Unknown</edition>
  						<geoform>map</geoform>
  						<pubinfo>
  							<pubplace>Mowbray, Cape Town</pubplace>
  							<publish>Chief Directorate - Surveys and Mapping</publish>
  						</pubinfo>
  						<othercit></othercit>
  						<onlink>http://w3sli.wcape.gov.za/surveys/</onlink>
  						<lworkcit>
  							<citeinfo>
  								<origin></origin>
  								<pubdate></pubdate>
  								<title></title>
  								<pubinfo>
  									<pubplace></pubplace>
  									<publish></publish>
  								</pubinfo>
  								<onlink></onlink>
  							</citeinfo>
  						</lworkcit>
  					</citeinfo>
  				</srccite>
  				<srcscale>50000?</srcscale>
  				<typesrc>Unknown</typesrc>
  				<srctime>
  					<timeinfo>
  						<rngdates>
  							<begdate>Unknown</begdate>
  							<enddate>Unknown</enddate>
  						</rngdates>
  					</timeinfo>
  					<srccurr>Unknown</srccurr>
  				</srctime>
  				<srccitea></srccitea>
  				<srccontr>
  Roads and rivers from the source data were selected to form
  the boundaries of the Business Units.
  </srccontr>
  			</srcinfo>
  			<srcinfo>
  				<srccite>
  					<citeinfo>
  						<origin>Chief Directorate - Surveys and Mapping</origin>
  						<pubdate>Unknown</pubdate>
  						<title>Topographic map series base data 1</title>
  						<edition>Unknown</edition>
  						<geoform>map</geoform>
  						<pubinfo>
  							<pubplace>Mowbray, Cape Town</pubplace>
  							<publish>Chief Directorate - Surveys and Mapping</publish>
  						</pubinfo>
  						<othercit></othercit>
  						<onlink>http://w3sli.wcape.gov.za/surveys/</onlink>
  						<lworkcit>
  							<citeinfo>
  								<origin></origin>
  								<pubdate></pubdate>
  								<title></title>
  								<pubinfo>
  									<pubplace></pubplace>
  									<publish></publish>
  								</pubinfo>
  								<onlink></onlink>
  							</citeinfo>
  						</lworkcit>
  					</citeinfo>
  				</srccite>
  				<srcscale>50000?</srcscale>
  				<typesrc>Unknown</typesrc>
  				<srctime>
  					<timeinfo>
  						<rngdates>
  							<begdate>Unknown</begdate>
  							<enddate>Unknown</enddate>
  						</rngdates>
  					</timeinfo>
  					<srccurr>Unknown</srccurr>
  				</srctime>
  				<srccitea></srccitea>
  				<srccontr>
  Roads and rivers from the source data were selected to form
  the boundaries of the Business Units.
  </srccontr>
  			</srcinfo>
  			<procstep>
  				<srcused>Unkown</srcused>
  				<procdate>Unknown</procdate>
  				<srcprod>Unknown</srcprod>
  				<proccont>
  					<cntinfo>
  						<cntperp>
  							<cntper>Ken Wilkinson</cntper>
  							<cntorg>Geographic Information Management Systems</cntorg>
  						</cntperp>
  						<cntpos>Data Manager</cntpos>
  						<cntaddr>
  							<addrtype>mailing and physical address</addrtype>
  							<address></address>
  							<city>Pretoria</city>
  							<state>Gauteng</state>
  							<postal></postal>
  							<country>South Africa</country>
  						</cntaddr>
  						<cntvoice>+27 (0)12 345-8000</cntvoice>
  						<cntfax>+27 (0)12 345-8001</cntfax>
  						<cntemail>support at gims.com</cntemail>
  						<hours>Monday - Friday 08:00 - 17:00 local time (GMT + 2)</hours>
  					</cntinfo>
  				</proccont>
  				<procdesc>Roads and rivers layers where edited in Arc View to form
  the boundaries of the Business units layer
  </procdesc></procstep>
  			<procstep><procdesc Sync="TRUE">Dataset moved.</procdesc><srcused Sync="TRUE">F:\KNP_data_UTM\Boundaries\business_units</srcused><date Sync="TRUE">20030519</date><time Sync="TRUE">11200700</time></procstep><procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE"></srcused><date Sync="TRUE">20030520</date><time Sync="TRUE">09520000</time></procstep><procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE">Server=giscentral; Service=esri_sde; Database=gislab; User=sde; Version=sde.DEFAULT</srcused><date Sync="TRUE">20031223</date><time Sync="TRUE">15510600</time></procstep></lineage>
  	</dataqual>
  	<spdoinfo>
  		<direct Sync="TRUE">Vector</direct>
  		<ptvctinf>
  			<sdtsterm Name="BNDRY_BUSINESSUNITS">
  				<sdtstype Sync="TRUE">G-polygon</sdtstype>
  				<ptvctcnt Sync="TRUE">4</ptvctcnt>
  			</sdtsterm>
  			<esriterm Name="BNDRY_BUSINESSUNITS"><efeatyp Sync="TRUE">Simple</efeatyp><efeageom Sync="TRUE">Polygon</efeageom><esritopo Sync="TRUE">FALSE</esritopo><efeacnt Sync="TRUE">4</efeacnt><spindex Sync="TRUE">TRUE</spindex><linrefer Sync="TRUE">FALSE</linrefer></esriterm></ptvctinf>
  	</spdoinfo>
  	<spref>
  		<horizsys>
  			<planar>
  				<planci>
  					<plance Sync="TRUE">coordinate pair</plance>
  					<coordrep>
  						<absres Sync="TRUE">0.000512</absres>
  						<ordres Sync="TRUE">0.000512</ordres>
  					</coordrep>
  					<plandu Sync="TRUE">meters</plandu>
  				</planci>
  				<gridsys><gridsysn Sync="TRUE">Universal Transverse Mercator</gridsysn><utm><utmzone Sync="TRUE">-36</utmzone><transmer><sfctrmer Sync="TRUE">0.999600</sfctrmer><longcm Sync="TRUE">33.000000</longcm><latprjo Sync="TRUE">0.000000</latprjo><feast Sync="TRUE">500000.000000</feast><fnorth Sync="TRUE">10000000.000000</fnorth></transmer></utm></gridsys></planar>
  			<geodetic>
  				<horizdn Sync="TRUE">D_WGS_1984</horizdn>
  				<ellips Sync="TRUE">WGS_1984</ellips>
  				<semiaxis Sync="TRUE">6378137.000000</semiaxis>
  				<denflat Sync="TRUE">298.257224</denflat>
  			</geodetic>
  			<cordsysn><geogcsn Sync="TRUE">GCS_WGS_1984</geogcsn><projcsn Sync="TRUE">WGS_1984_UTM_Zone_36S</projcsn></cordsysn></horizsys>
  		<vertdef><altsys><altenc Sync="TRUE">Explicit elevation coordinate included with horizontal coordinates</altenc><altres Sync="TRUE">1.000000</altres></altsys></vertdef></spref>
  	<eainfo>
  		<detailed Name="BNDRY_BUSINESSUNITS">
  			<enttyp>
  				<enttypl Sync="TRUE">BNDRY_BUSINESSUNITS</enttypl>
  				<enttypd>Shapefile Attribute Table</enttypd>
  				<enttypds>None</enttypds>
  				<enttypt Sync="TRUE">Feature Class</enttypt><enttypc Sync="TRUE">4</enttypc></enttyp>
  			<attr>
  				<attrlabl Sync="TRUE">FID</attrlabl>
  				<attrdef Sync="TRUE">Internal feature number.</attrdef>
  				<attrdefs Sync="TRUE">ESRI</attrdefs>
  				<attrdomv>
  					<udom Sync="TRUE">Sequential unique whole numbers that are automatically generated.</udom>
  				</attrdomv>
  				<attalias Sync="TRUE">FID</attalias><attrtype Sync="TRUE">OID</attrtype><attwidth Sync="TRUE">4</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale></attr>
  			<attr>
  				<attrlabl Sync="TRUE">Shape</attrlabl>
  				<attrdefs Sync="TRUE">ESRI</attrdefs>
  				<attrdomv>
  					<udom Sync="TRUE">Coordinates defining the features.</udom>
  				</attrdomv>
  				<attalias Sync="TRUE">Shape</attalias><attrtype Sync="TRUE">Geometry</attrtype><attwidth Sync="TRUE">0</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale><attrdef Sync="TRUE">Feature geometry.</attrdef></attr>
  			<attr>
  				<attrlabl Sync="TRUE">OBJECTID</attrlabl>
  				<attrdefs>none</attrdefs>
  				<attrdomv>
  					<udom>Character Field</udom>
  				</attrdomv>
  				<attalias Sync="TRUE">OBJECTID</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">10</attwidth></attr>
  			<attr><attrlabl Sync="TRUE">REGION</attrlabl><attalias Sync="TRUE">REGION</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">16</attwidth><attrdomv><udom>Character Field</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">BU_LEADER</attrlabl><attalias Sync="TRUE">BU_LEADER</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">30</attwidth><attrdef>Area in hectares</attrdef><attrdomv><udom>Character Field</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">TEL_NO</attrlabl><attalias Sync="TRUE">TEL_NO</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">16</attwidth><attrdef>Perimeter in km</attrdef><attrdomv><udom>Character Field</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">AREA_HA</attrlabl><attalias Sync="TRUE">AREA_HA</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">19</attwidth><atnumdec Sync="TRUE">3</atnumdec><attrdef Sync="TRUE">Feature geometry.</attrdef><attrdefs Sync="TRUE">ESRI
 </attrdefs><attrdomv><udom Sync="TRUE">Coordinates defining the features.</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">PERIM_KM</attrlabl><attalias Sync="TRUE">PERIM_KM</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">19</attwidth><atnumdec Sync="TRUE">3</atnumdec></attr><attr><attrlabl Sync="TRUE">SHAPE_area</attrlabl><attalias Sync="TRUE">SHAPE_area</attalias><attrtype Sync="TRUE">Float</attrtype><attwidth Sync="TRUE">19</attwidth><attrdef Sync="TRUE">Area of feature in internal units squared.</attrdef><attrdefs Sync="TRUE">ESRI</attrdefs><attrdomv><udom Sync="TRUE">Positive real numbers that are automatically generated.</udom></attrdomv><atnumdec Sync="TRUE">11</atnumdec></attr><attr><attrlabl Sync="TRUE">SHAPE_len</attrlabl><attalias Sync="TRUE">SHAPE_len</attalias><attrtype Sync="TRUE">Float</attrtype><attwidth Sync="TRUE">19</attwidth><atnumdec Sync="TRUE">11</atnumdec></attr></detailed>
  		<overview>
  		</overview>
  	</eainfo>
  	<distinfo>
  		<distrib>
  			<cntinfo>
  				<cntorgp>
  					<cntorg>South African National Parks</cntorg>
  					<cntper>Don Ntsala</cntper>
  				</cntorgp>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time</hours>
  			</cntinfo>
  		</distrib>
  		<resdesc>KNP SS GIS database</resdesc>
  		<distliab>
  Users must assume responsibility to determine appropriate
  use of these data. The data were gathered for scientific
  use and do not conform to survey accuracy. The data are
  provided "as-is" to the public, especially intended for
  researchers and the KNP GIS Lab may not be held liable for
  any loss or damage incurred due to inaccuracy of the data.
  </distliab>
  		<custom>
  Send an e-mail request to gismaster at parks-sa.co.za or phone
  during office hours +27 (0)13 735-4257 to request these
  data in digital form. Nominal fees are charged for data
  conversion, storage medium, packaging and postage if the
  requested data are practically too large to send as e-mail attachments.
  </custom>
  		<stdorder><digform><digtinfo><transize Sync="TRUE">0.201</transize><dssize Sync="TRUE">0.201</dssize></digtinfo></digform></stdorder></distinfo>
  	<metainfo>
  		<metd Sync="TRUE">20040526</metd>
  		<metrd>20010702</metrd>
  		<metc>
  			<cntinfo>
  				<cntorgp>
  					<cntorg>South African National Parks</cntorg>
  					<cntper>Don Ntsala</cntper>
  				</cntorgp>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>Mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time</hours>
  			</cntinfo>
  		</metc>
  		<metstdn Sync="TRUE">FGDC Content Standards for Digital Geospatial Metadata</metstdn>
  		<metstdv Sync="TRUE">FGDC-STD-001-1998</metstdv>
  		<langmeta Sync="TRUE">en</langmeta><mettc Sync="TRUE">local time</mettc><metextns><onlink Sync="TRUE">http://www.esri.com/metadata/esriprof80.html</onlink><metprof Sync="TRUE">ESRI Metadata Profile</metprof></metextns></metainfo>
  	<Esri><CreaDate>20031223</CreaDate><CreaTime>15510600</CreaTime><SyncOnce>FALSE</SyncOnce><SyncDate>20040526</SyncDate><SyncTime>11244000</SyncTime><ModDate>20040526</ModDate><ModTime>11285300</ModTime><PublishStatus>Published</PublishStatus><MetaID>{0CFCB7A8-2370-4209-9EAE-FA6A9A09D80C}</MetaID></Esri><Binary><Thumbnail><Data EsriPropertyType="Picture">Qk3uNwEAAAAAADYAAAAoAAAAyAAAAIUAAAABABgAAAAAALg3AQAAAAAAAAAAAAAAAAAAAAAA////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////8fHx4uLi////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////wtTUntTUudTUvcXF////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////nLe3ntTUr///r///r///ntTU
  tMXF////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////ntTUr///r///r///r///r///r///rre3////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////xcXFqvHxr///r///r///r///
  r///r///p9TU1NTU////pbe3wtTU////////////////////////////////////////wtTU4uLi
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////sNTUr///r///r///r///r///r///r///r///p9TUxcXFnLe3pOLiy9TU////
  ////////////////////////////////k7e3wtTU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////4uLiqvHxr///r///r///r///
  r///r///r///r///r///r///r///r///pOLivcXFvcXF4uLi////8fHx4uLirre3////1NTUntTU
  ntTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////q8XFr///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///1NTU4uLipOLiqvHxpOLi8fHxvcXFqvHxpOLi8fHx////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////8fHxpOLir///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///ntTU1NTUudTUpOLir///r///sNTUpOLi
  r///r///1NTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////4uLiqvHxr///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///qvHxosXFr///r///r///r///r///r///r///r///y9TU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////xcXFqvHxr///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///udTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////vcXFr///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////4uLip9TUr///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///udTU////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////k7e3r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////xcXFqvHxr///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///udTU////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////udTUr///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////xcXFr///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///udTU////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////1NTUr///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////osXFr///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///udTU////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////4uLiqvHxr///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  pbe3r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///1NTU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////y9TUudTUp9TUpOLipOLiqvHxp9TUudTUosXF
  r///qvHxr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///1NTU
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////4uLi4uLi4uLi1NTU4uLi////8fHx1NTUxcXFudTUjqiok7e3k7e3pOLimcXFjqio
  ntTUr///r///r///r///r///r///r///pOLi8fHx////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////p9TUr///pOLir///k7e3qvHxr///r///r///r///r///r///r///ntTU
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////ntTUr///r///r///
  ntTUr///r///r///r///pOLipOLir///mcXFjqio////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////1NTUr///r///r///r///qvHxntTUntTUntTUntTUpOLiqvHxntTUr///
  ntTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////y9TUr///r///r///
  r///r///r///r///r///r///r///r///r///r///ntTU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////udTUr///r///r///r///r///r///r///r///r///r///r///r///
  r///sNTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////udTUr///r///
  r///r///r///r///r///r///r///r///r///r///r///udTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////wtTUr///r///r///r///r///r///r///r///r///r///r///
  r///r///udTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////1NTUr///
  r///r///r///r///r///r///r///r///r///r///r///r///udTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////wtTUr///r///r///r///r///r///r///r///r///r///
  r///r///r///y9TU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////p9TU
  r///r///r///r///r///r///r///r///r///r///r///r///r///wtTU////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////ntTUr///r///r///r///r///r///r///r///r///
  r///r///r///r///udTU////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ntTUr///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////8fHx1NTUosXFr///r///r///r///r///r///r///r///
  r///r///r///r///r///udTU////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////y9TUosXFpOLi
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////8fHxp9TUr///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///udTU////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////tMXFr///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////4uLiqvHxr///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///udTU////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////tMXFudTUosXFr///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////sNTUr///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///udTU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////4uLiwtTUqvHxr///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////8fHxsNTUqvHxr///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///wtTU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////ntTUr///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  1NTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////p9TUr///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///1NTU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////4uLi
  qvHxr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  pOLi8fHx////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////y9TUr///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///p9TU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////1NTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  qvHx2uLi////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////y9TUr///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///udTU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////sNTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  p9TU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////y9TUpOLir///r///r///r///r///
  r///r///r///r///r///r///r///r///r///qvHxy9TU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////4uLiqvHxr///r///r///r///r///r///r///r///r///r///r///r///r///
  ntTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////ntTUr///r///r///
  r///r///r///r///r///r///r///r///r///r///p9TU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////qKioudTU
  udTUudTUudTUudTUwtTU1NTUntTUr///r///r///r///r///r///r///r///r///r///r///r///
  r///udTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////4uLimcXFk7e3mcXFntTUqvHxr///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///udTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////4uLiiJqar///
  r///r///r///mcXFk7e3ntTUr///r///mcXFpOLipOLintTUr///pOLintTUntTUr///r///r///
  r///r///udTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////1NTUr///r///r///r///r///r///r///mcXFmcXFmcXFqvHx
  mcXFpOLimcXFqvHxmcXFr///ntTUpOLir///r///r///r///1NTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////xcXFr///
  r///r///r///r///r///r///r///r///r///r///r///r///r///ntTUpOLir///pOLimcXFr///
  pOLiqvHxr///1NTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////2uLiqvHxr///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///qvHxk7e3pOLimcXFmcXF4uLi////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////p9TUr///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///osXF////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////ntTUr///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///qvHxudTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////4uLiqvHx
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///pOLi2uLi////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////1NTUr///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///pOLi8fHx////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////1NTU
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///udTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////wtTUr///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///qvHx4uLi////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  udTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///sNTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////udTUr///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///qvHx4uLi////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////udTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///p9TU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////udTUr///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///udTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////ntTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///udTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////ntTUr///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///1NTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////rre3qvHxr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///1NTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////1NTUpOLir///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///p9TU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLiosXFr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///qvHx2uLi////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////1NTUntTUr///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///qvHx2uLi////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLinLe3pOLir///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///udTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////nLe3r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///udTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLiqvHxr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///ntTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////udTUr///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///udTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////ntTUr///r///r///r///r///ntTUmcXFr///r///r///r///r///r///r///r///
  r///r///1NTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////1NTUpOLipOLir///r///r///r///
  ntTUqvHxk7e3pOLir///r///r///r///r///r///r///r///1NTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////udTUr///qvHxntTUpOLir///r///ntTUr///r///ntTUntTUr///r///r///r///
  r///r///r///1NTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////p9TUr///r///r///qvHxntTU
  ntTUpOLir///r///r///qvHxk7e3r///r///r///r///r///r///1NTU////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////1NTUr///r///r///r///r///r///r///r///r///r///r///r///r///ntTUr///
  qvHxntTUpOLipOLi1NTU////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////sNTUr///r///r///r///r///
  r///r///r///r///r///r///r///r///mcXFmcXFmcXFr///pOLipOLiy9TU////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////4uLiqvHxr///r///r///r///r///r///r///r///r///r///r///r///r///qvHx
  r///r///r///r///r///udTU////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////y9TUr///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////sNTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///udTU////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////8fHxpOLir///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////wtTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///wtTU////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////p9TUr///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///1NTU////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////1NTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///ntTU////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////wtTUr///r///r///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///udTU////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////y9TUr///r///r///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///1NTU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////4uLiqvHxr///r///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///ntTU////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////ntTUr///r///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///wtTU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////sNTUr///
  r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///pOLi8fHx
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////1NTUr///r///r///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///p9TU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////8fHx
  pOLir///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///y9TU
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////ntTUr///r///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///1NTU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////sNTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///r///pOLi
  8fHx////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////1NTUr///r///r///r///r///r///r///
  r///r///r///r///r///r///r///r///r///udTU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////ntTUr///r///r///r///r///r///r///r///r///r///r///r///r///r///qvHx
  4uLi////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////sNTUr///r///r///r///r///
  r///r///r///r///r///r///r///r///r///ntTU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////y9TUr///r///r///r///r///r///r///r///r///r///r///r///r///r///
  udTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////4uLi1NTUtMXFpOLir///r///r///
  r///r///r///r///r///r///r///r///r///r///y9TU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////4uLinLe3qvHxr///r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  ntTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////oKioqvHxr///r///r///r///r///
  r///r///r///r///r///r///r///r///r///r///udTU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////k7e3r///r///r///r///r///r///r///r///r///r///r///r///r///r///
  r///1NTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////8fHxnLe3r///r///r///
  r///r///r///r///r///r///r///r///r///r///pOLi8fHx////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////q8XFr///r///r///r///r///r///r///r///r///r///r///
  r///sNTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////pbe3qvHxr///
  r///r///r///r///r///r///r///r///r///r///r///y9TU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////osXFr///r///r///r///r///r///r///r///r///r///r///
  r///pOLi8fHx////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////y9TUqvHx
  k7e3qvHxr///r///r///r///r///r///r///r///r///udTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////1NTU8fHxoKior///r///r///r///r///r///r///
  r///r///1NTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLipOLir///r///r///r///r///r///r///qvHx4uLi////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////4uLiqvHxr///r///r///r///r///
  r///r///p9TU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////4uLiqvHxr///r///r///r///r///r///qvHxy9TU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////ntTUr///r///r///r///
  r///r///vcXF////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////tMXFr///r///r///osXFy9TUudTU8fHx////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////vcXFp9TUp9TU
  1NTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////</Data></Thumbnail></Binary><distInfo><distributor><distorTran><onLineSrc><linkage Sync="TRUE">file://\\Gislab\gisdata\KNP_data\Boundaries\BNDRY_BUSINESSUNITS.shp</linkage><protocol Sync="TRUE">Local Area Network</protocol><orDesc Sync="TRUE">002</orDesc></onLineSrc><transSize Sync="TRUE">0.201</transSize></distorTran><distorFormat><formatName Sync="TRUE">Shapefile</formatName></distorFormat></distributor></distInfo><dataIdInfo><envirDesc Sync="TRUE">Microsoft Windows 2000 Version 5.0 (Build 2195) Service Pack 3; ESRI ArcCatalog 8.2.0.700</envirDesc><dataLang><languageCode Sync="TRUE" value="en"></languageCode></dataLang><idCitation><resTitle Sync="TRUE">BNDRY_BUSINESSUNITS</resTitle><presForm><PresFormCd Sync="TRUE" value="005"></PresFormCd></presForm></idCitation><spatRpType><SpatRepTypCd Sync="TRUE" value="001"></SpatRepTypCd></spatRpType><geoBox esriExtentType="native"><westBL Sync="TRUE">283091</we
 stBL><eastBL Sync="TRUE">402511</eastBL><northBL Sync="TRUE">7529638</northBL><southBL Sync="TRUE">7175416</southBL><exTypeCode Sync="TRUE">1</exTypeCode></geoBox><geoBox esriExtentType="decdegrees"><westBL Sync="TRUE">30.841566</westBL><eastBL Sync="TRUE">32.053312</eastBL><northBL Sync="TRUE">-22.325422</northBL><southBL Sync="TRUE">-25.535347</southBL><exTypeCode Sync="TRUE">1</exTypeCode></geoBox></dataIdInfo><mdLang><languageCode Sync="TRUE" value="en"></languageCode></mdLang><mdStanName Sync="TRUE">ISO 19115 Geographic Information - Metadata</mdStanName><mdStanVer Sync="TRUE">DIS_ESRI1.0</mdStanVer><mdChar><CharSetCd Sync="TRUE" value="004"></CharSetCd></mdChar><mdHrLv><ScopeCd Sync="TRUE" value="005"></ScopeCd></mdHrLv><mdHrLvName Sync="TRUE">dataset</mdHrLvName><refSysInfo><RefSystem><refSysID><identCode Sync="TRUE">WGS_1984_UTM_Zone_36S</identCode></refSysID></RefSystem></refSysInfo><spatRepInfo><VectSpatRep><topLvl><TopoLevCd Sync="TRUE" value="001"></TopoLevCd></t
 opLvl><geometObjs Name="BNDRY_BUSINESSUNITS"><geoObjTyp><GeoObjTypCd Sync="TRUE" value="001"></GeoObjTypCd></geoObjTyp><geoObjCnt Sync="TRUE">4</geoObjCnt></geometObjs></VectSpatRep></spatRepInfo><mdDateSt Sync="TRUE">20040526</mdDateSt><mdFileID Sync="TRUE">{389B7C6B-EBCF-45C1-B1AB-96C5E6DF5D16}</mdFileID></metadata>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_BUSINESSUNITS.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_KRUGERNP.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_KRUGERNP.prj
  
  Index: BNDRY_KRUGERNP.prj
  ===================================================================
  PROJCS["WGS_1984_UTM_Zone_36S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",33.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_KRUGERNP.sbn
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_KRUGERNP.sbx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_KRUGERNP.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_KRUGERNP.shp.xml
  
  Index: BNDRY_KRUGERNP.shp.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <metadata>
  	<idinfo>
  		<citation>
  			<citeinfo>
  				<origin>Kruger National Park Scientific Services GIS Lab</origin>
  				<pubdate>20010101</pubdate>
  				<title Sync="TRUE">BNDRY_KRUGERNP</title>
  				<edition>February 2001</edition>
  				<geoform Sync="TRUE">vector digital data</geoform>
  				<pubinfo>
  					<pubplace>Skukuza, Kruger National Park</pubplace>
  					<publish>KNP GIS Lab</publish>
  				</pubinfo>
  				<othercit>
  This data layer was extracted from an historic GIS and
  nothing is known regarding its accuracy, time and date of
  capture etc.
  </othercit>
  				<lworkcit>
  					<citeinfo>
  						<origin></origin>
  						<pubdate></pubdate>
  						<title></title>
  						<pubinfo>
  							<pubplace></pubplace>
  							<publish></publish>
  						</pubinfo>
  						<onlink></onlink>
  					</citeinfo>
  				</lworkcit>
  				<ftname Sync="TRUE">BNDRY_KRUGERNP</ftname><onlink Sync="TRUE">\\muse\homes\current_projects\kruger\KNP_data\Boundaries\BNDRY_KRUGERNP.shp</onlink></citeinfo>
  		</citation>
  		<descript>
  			<abstract>
  This is a single polygon theme indicating the extent of the
  Kruger National Park (KNP). The KNP falls under the
  authority of South African National Parks (www.parks-sa.co.za).
  </abstract>
  			<purpose>
  For the KNP Scientific Services GIS database - for research
  and cartograhic products. This database is intended to be
  extended or incorporated into a future KNP "Regional GIS"
  node of SANP.
  </purpose>
  			<langdata Sync="TRUE">en</langdata></descript>
  		<timeperd>
  			<timeinfo>
  				<rngdates>
  					<begdate>unknown</begdate>
  					<enddate>unknown</enddate>
  				</rngdates>
  			</timeinfo>
  			<current>Unknown</current>
  		</timeperd>
  		<status>
  			<progress>Complete</progress>
  			<update>As needed</update>
  		</status>
  		<spdom>
  			<bounding>
  				<westbc Sync="TRUE">30.841566</westbc>
  				<eastbc Sync="TRUE">32.053312</eastbc>
  				<northbc Sync="TRUE">-22.325422</northbc>
  				<southbc Sync="TRUE">-25.535347</southbc>
  			</bounding>
  			<lboundng><leftbc Sync="TRUE">283091.000000</leftbc><rightbc Sync="TRUE">402511.000000</rightbc><bottombc Sync="TRUE">7175416.000000</bottombc><topbc Sync="TRUE">7529638.000000</topbc></lboundng></spdom>
  		<keywords>
  			<theme>
  				<themekt>None</themekt>
  				<themekey>Kruger National Park</themekey>
  				<themekey>Boundary</themekey>
  			</theme>
  			<place>
  				<placekt>None</placekt>
  				<placekey>Kruger National Park</placekey>
  				<placekey>Mpumalanga</placekey>
  				<placekey>Northern Province</placekey>
  				<placekey>South Africa</placekey>
  			</place>
  		</keywords>
  		<accconst>None</accconst>
  		<useconst>Use at own risk. See Liability and Accuracy sections</useconst>
  		<ptcontac>
  			<cntinfo>
  				<cntorgp>
  					<cntorg>South African National Parks</cntorg>
  					<cntper>Don Ntsala</cntper>
  				</cntorgp>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>
  Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time
  (GMT + 2)
  </hours>
  			</cntinfo>
  		</ptcontac>
  		<native Sync="TRUE">Microsoft Windows 2000 Version 5.1 (Build 2600) Service Pack 1; ESRI ArcCatalog 8.3.0.800</native>
  		<natvform Sync="TRUE">Shapefile</natvform></idinfo>
  	<dataqual>
  		<attracc>
  			<attraccr>Not applicable</attraccr>
  		</attracc>
  		<logic>Not Applicable</logic>
  		<complete>
  Complete, but due for an update based on recently acquired
  cadastral boundaries.
  </complete>
  		<posacc>
  			<horizpa>
  				<horizpar>Believed to be within 50m of the true location</horizpar>
  			</horizpa>
  			<vertacc>
  				<vertaccr>Not applicable.</vertaccr>
  			</vertacc>
  		</posacc>
  		<lineage>
  			<srcinfo>
  				<srccite>
  					<citeinfo>
  						<origin></origin>
  						<pubdate></pubdate>
  						<title>Lineage unkown</title>
  						<edition></edition>
  						<geoform>map</geoform>
  						<pubinfo>
  							<pubplace></pubplace>
  							<publish></publish>
  						</pubinfo>
  						<othercit>
  Nothing is known regarding the lineage of this layer, but
  it is most likely to have been digitized off 1:50,000
  topographic maps.
  </othercit>
  						<onlink></onlink>
  						<lworkcit>
  							<citeinfo>
  								<origin></origin>
  								<pubdate></pubdate>
  								<title></title>
  								<pubinfo>
  									<pubplace></pubplace>
  									<publish></publish>
  								</pubinfo>
  								<onlink></onlink>
  							</citeinfo>
  						</lworkcit>
  					</citeinfo>
  				</srccite>
  				<srcscale>50000?</srcscale>
  				<srctime>
  					<timeinfo>
  						<rngdates>
  						</rngdates>
  					</timeinfo>
  				</srctime>
  				<srccontr>Source data as supplied by Surveys and Mapping were
  converted by GIMS from ReGIS format to ARC/INFO coverages,
  cleaned and built (tolerances unknown). They were also
  edge-matched and the national datum transformation from
  Cape to Hartebeesthoek94 datum was applied with an accuracy
  higher than that of the actual data.
  </srccontr>
  			</srcinfo>
  			<srcinfo>
  				<srccite>
  					<citeinfo>
  						<origin>Chief Directorate - Surveys and Mapping</origin>
  						<pubdate>Unknown</pubdate>
  						<title>Topographic map series base data 1:50,000</title>
  						<edition>Unknown</edition>
  						<geoform>map</geoform>
  						<pubinfo>
  							<pubplace>Mowbray, Cape Town</pubplace>
  							<publish>Chief Directorate - Surveys and Mapping</publish>
  						</pubinfo>
  						<othercit>
  Nothing is known regarding the lineage of this layer, but
  it is most likely to have been digitized off 1:50,000
  topographic maps.
  </othercit>
  						<onlink>http://w3sli.wcape.gov.za/surveys/</onlink>
  						<lworkcit>
  							<citeinfo>
  								<origin></origin>
  								<pubdate></pubdate>
  								<title></title>
  								<pubinfo>
  									<pubplace></pubplace>
  									<publish></publish>
  								</pubinfo>
  								<onlink></onlink>
  							</citeinfo>
  						</lworkcit>
  					</citeinfo>
  				</srccite>
  				<srcscale>50000?</srcscale>
  				<typesrc>Unknown</typesrc>
  				<srctime>
  					<timeinfo>
  						<rngdates>
  							<begdate>Unknown</begdate>
  							<enddate>Unknown</enddate>
  						</rngdates>
  					</timeinfo>
  					<srccurr></srccurr>
  				</srctime>
  				<srccitea></srccitea>
  				<srccontr></srccontr>
  			</srcinfo>
  			<srcinfo>
  				<srccite>
  					<citeinfo>
  						<origin>Chief Directorate - Surveys and Mapping</origin>
  						<pubdate>Unknown</pubdate>
  						<title>Topographic map series base data 1</title>
  						<edition>Unknown</edition>
  						<geoform>map</geoform>
  						<pubinfo>
  							<pubplace>Mowbray, Cape Town</pubplace>
  							<publish>Chief Directorate - Surveys and Mapping</publish>
  						</pubinfo>
  						<othercit>
  Nothing is known regarding the lineage of this layer, but
  it is most likely to have been digitized off 1:50,000
  topographic maps.
  </othercit>
  						<onlink>http://w3sli.wcape.gov.za/surveys/</onlink>
  						<lworkcit>
  							<citeinfo>
  								<origin></origin>
  								<pubdate></pubdate>
  								<title></title>
  								<pubinfo>
  									<pubplace></pubplace>
  									<publish></publish>
  								</pubinfo>
  								<onlink></onlink>
  							</citeinfo>
  						</lworkcit>
  					</citeinfo>
  				</srccite>
  				<srcscale>50000?</srcscale>
  				<typesrc>Unknown</typesrc>
  				<srctime>
  					<timeinfo>
  						<rngdates>
  							<begdate>Unknown</begdate>
  							<enddate>Unknown</enddate>
  						</rngdates>
  					</timeinfo>
  					<srccurr>Unknown</srccurr>
  				</srctime>
  				<srccitea></srccitea>
  				<srccontr></srccontr>
  			</srcinfo>
  			<procstep>
  				<procdesc>No information is available regarding the process steps</procdesc>
  				<proccont>
  					<cntinfo>
  						<cntperp>
  							<cntper></cntper>
  							<cntorg></cntorg>
  						</cntperp>
  						<cntpos></cntpos>
  						<cntaddr>
  							<addrtype>mailing and physical address</addrtype>
  							<address></address>
  							<city></city>
  							<state></state>
  							<postal></postal>
  							<country></country>
  						</cntaddr>
  						<cntvoice></cntvoice>
  						<cntfax></cntfax>
  						<cntemail></cntemail>
  						<hours></hours>
  					</cntinfo>
  				</proccont>
  			</procstep>
  			<procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE">F:\KNP_data_UTM\Common\boundary</srcused><date Sync="TRUE">20030519</date><time Sync="TRUE">12265100</time></procstep><procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE"></srcused><date Sync="TRUE">20030521</date><time Sync="TRUE">15511400</time></procstep><procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE">Server=giscentral; Service=esri_sde; Database=gislab; User=sde; Version=sde.DEFAULT</srcused><date Sync="TRUE">20031223</date><time Sync="TRUE">15510800</time></procstep></lineage>
  	</dataqual>
  	<spdoinfo>
  		<direct Sync="TRUE">Vector</direct>
  		<ptvctinf>
  			<sdtsterm Name="BNDRY_KRUGERNP">
  				<sdtstype Sync="TRUE">G-polygon</sdtstype>
  				<ptvctcnt Sync="TRUE">1</ptvctcnt>
  			</sdtsterm>
  			<esriterm Name="BNDRY_KRUGERNP"><efeatyp Sync="TRUE">Simple</efeatyp><efeageom Sync="TRUE">Polygon</efeageom><esritopo Sync="TRUE">FALSE</esritopo><efeacnt Sync="TRUE">1</efeacnt><spindex Sync="TRUE">TRUE</spindex><linrefer Sync="TRUE">FALSE</linrefer></esriterm></ptvctinf>
  	</spdoinfo>
  	<spref>
  		<horizsys>
  			<planar>
  				<planci>
  					<plance Sync="TRUE">coordinate pair</plance>
  					<coordrep>
  						<absres Sync="TRUE">0.000512</absres>
  						<ordres Sync="TRUE">0.000512</ordres>
  					</coordrep>
  					<plandu Sync="TRUE">meters</plandu>
  				</planci>
  				<gridsys><gridsysn Sync="TRUE">Universal Transverse Mercator</gridsysn><utm><utmzone Sync="TRUE">-36</utmzone><transmer><sfctrmer Sync="TRUE">0.999600</sfctrmer><longcm Sync="TRUE">33.000000</longcm><latprjo Sync="TRUE">0.000000</latprjo><feast Sync="TRUE">500000.000000</feast><fnorth Sync="TRUE">10000000.000000</fnorth></transmer></utm></gridsys></planar>
  			<geodetic>
  				<horizdn Sync="TRUE">D_WGS_1984</horizdn>
  				<ellips Sync="TRUE">WGS_1984</ellips>
  				<semiaxis Sync="TRUE">6378137.000000</semiaxis>
  				<denflat Sync="TRUE">298.257224</denflat>
  			</geodetic>
  			<cordsysn><geogcsn Sync="TRUE">GCS_WGS_1984</geogcsn><projcsn Sync="TRUE">WGS_1984_UTM_Zone_36S</projcsn></cordsysn></horizsys>
  		<vertdef><altsys><altenc Sync="TRUE">Explicit elevation coordinate included with horizontal coordinates</altenc><altres Sync="TRUE">1.000000</altres></altsys></vertdef></spref>
  	<eainfo>
  		<detailed Name="BNDRY_KRUGERNP">
  			<enttyp>
  				<enttypl Sync="TRUE">BNDRY_KRUGERNP</enttypl>
  				<enttypd>Shapefile Attribute Table</enttypd>
  				<enttypds>None</enttypds>
  				<enttypt Sync="TRUE">Feature Class</enttypt><enttypc Sync="TRUE">1</enttypc></enttyp>
  			<attr>
  				<attrlabl Sync="TRUE">FID</attrlabl>
  				<attrdef Sync="TRUE">Internal feature number.</attrdef>
  				<attrdefs Sync="TRUE">ESRI</attrdefs>
  				<attrdomv>
  					<udom Sync="TRUE">Sequential unique whole numbers that are automatically generated.</udom>
  				</attrdomv>
  				<attalias Sync="TRUE">FID</attalias><attrtype Sync="TRUE">OID</attrtype><attwidth Sync="TRUE">4</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale></attr>
  			<attr>
  				<attrlabl Sync="TRUE">Shape</attrlabl>
  				<attrdef Sync="TRUE">Feature geometry.</attrdef>
  				<attrdefs Sync="TRUE">ESRI</attrdefs>
  				<attrdomv>
  					<udom Sync="TRUE">Coordinates defining the features.</udom>
  				</attrdomv>
  				<attalias Sync="TRUE">Shape</attalias><attrtype Sync="TRUE">Geometry</attrtype><attwidth Sync="TRUE">0</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale></attr>
  			<attr><attrlabl Sync="TRUE">OBJECTID</attrlabl><attalias Sync="TRUE">OBJECTID</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">10</attwidth></attr><attr><attrlabl Sync="TRUE">NAME</attrlabl><attalias Sync="TRUE">NAME</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">30</attwidth></attr><attr><attrlabl Sync="TRUE">AREA_KM2</attrlabl><attalias Sync="TRUE">AREA_KM2</attalias><attrtype Sync="TRUE">Float</attrtype><attwidth Sync="TRUE">19</attwidth><atnumdec Sync="TRUE">11</atnumdec></attr><attr><attrlabl Sync="TRUE">AREA_HA</attrlabl><attalias Sync="TRUE">AREA_HA</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">10</attwidth></attr><attr><attrlabl Sync="TRUE">SHAPE_area</attrlabl><attalias Sync="TRUE">SHAPE_area</attalias><attrtype Sync="TRUE">Float</attrtype><attwidth Sync="TRUE">19</attwidth><attrdef Sync="TRUE">Area of feature in internal units squared.</attrdef><attrdefs Sync="TRUE">ESRI</attrdefs><attrdomv>
 <udom Sync="TRUE">Positive real numbers that are automatically generated.</udom></attrdomv><atnumdec Sync="TRUE">11</atnumdec></attr><attr><attrlabl Sync="TRUE">SHAPE_len</attrlabl><attalias Sync="TRUE">SHAPE_len</attalias><attrtype Sync="TRUE">Float</attrtype><attwidth Sync="TRUE">19</attwidth><atnumdec Sync="TRUE">11</atnumdec></attr></detailed>
  		<overview>
  		</overview>
  	</eainfo>
  	<distinfo>
  		<distrib>
  			<cntinfo>
  				<cntorgp>
  					<cntorg>South African National Parks</cntorg>
  					<cntper>Don Ntsala</cntper>
  				</cntorgp>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>
  Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time
  (GMT + 2)
  </hours>
  			</cntinfo>
  		</distrib>
  		<resdesc>KNP SS GIS database</resdesc>
  		<distliab>
  Users must assume responsibility to determine appropriate
  use of these data. The data were gathered for scientific
  use and do not conform to survey accuracy. The data are
  provided "as-is" to the public, especially intended for
  researchers and the KNP GIS Lab may not be held liable for
  any loss or damage incurred due to inaccuracy of the data.
  </distliab>
  		<custom>
  Send an e-mail request to gismaster at parks-sa.co.za or phone
  during office hours +27 (0)13 735-4257 to request these
  data in digital form. Nominal fees are charged for data
  conversion, storage medium, packaging and postage if the
  requested data are practically too large to send as e-mail attachments.
  </custom>
  		<stdorder><digform><digtinfo><transize Sync="TRUE">0.149</transize><dssize Sync="TRUE">0.149</dssize></digtinfo></digform></stdorder></distinfo>
  	<metainfo>
  		<metd Sync="TRUE">20040608</metd>
  		<metrd>20010223</metrd>
  		<metc>
  			<cntinfo>
  				<cntorgp>
  					<cntorg>South African National Parks</cntorg>
  					<cntper>Don Ntsala</cntper>
  				</cntorgp>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>Mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>
  Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time
  (GMT + 2)
  </hours>
  			</cntinfo>
  		</metc>
  		<metstdn Sync="TRUE">FGDC Content Standards for Digital Geospatial Metadata</metstdn>
  		<metstdv Sync="TRUE">FGDC-STD-001-1998</metstdv>
  		<langmeta Sync="TRUE">en</langmeta><mettc Sync="TRUE">local time</mettc><metextns><onlink Sync="TRUE">http://www.esri.com/metadata/esriprof80.html</onlink><metprof Sync="TRUE">ESRI Metadata Profile</metprof></metextns></metainfo>
  	<Esri><CreaDate>20031223</CreaDate><CreaTime>15510800</CreaTime><SyncOnce>FALSE</SyncOnce><SyncDate>20040608</SyncDate><SyncTime>16220800</SyncTime><ModDate>20040608</ModDate><ModTime>16220800</ModTime><PublishStatus>Published</PublishStatus><MetaID>{8BCD6248-5187-4192-9599-33212585594C}</MetaID></Esri><Binary><Thumbnail><Data EsriPropertyType="Picture">Qk3uNwEAAAAAADYAAAAoAAAAyAAAAIUAAAABABgAAAAAALg3AQAAAAAAAAAAAAAAAAAAAAAA////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////8fHx4uLi////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////wdTTnNTTuNTTu8XF////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////mre2nNTTrf//rf//rf//nNTT
  ssXF////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////nNTTrf//rf//rf//rf//rf//rf//rbe2////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////xcXFqPHxrf//rf//rf//rf//
  rf//rf//ptTT09TT////pLe2wdTT////////////////////////////////////////wdTT4uLi
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////r9TTrf//rf//rf//rf//rf//rf//rf//rf//ptTTxcXFmre2ouLiytTT////
  ////////////////////////////////kbe2wdTT////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////4uLiqPHxrf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//ouLiu8XFu8XF4uLi////8fHx4uLirbe2////09TTnNTT
  nNTT////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////qcXFrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//09TT4uLiouLiqPHxouLi8fHxu8XFqPHxouLi8fHx////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////8fHxouLirf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//nNTT09TTuNTTouLirf//rf//r9TTouLi
  rf//rf//09TT////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////4uLiqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//qPHxoMXFrf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////xcXFqPHxrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//wdTT////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////u8XFrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////4uLiptTTrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//uNTT////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////kbe2rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////xcXFqPHxrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//uNTT////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////uNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////xcXFrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////09TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////oMXFrf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////4uLiqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ssXFrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////ytTTuNTTptTTouLiouLiqPHxptTTuNTToMXF
  rf//qPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////4uLi4uLi4uLi09TT4uLi////8fHx09TTxcXFuNTToMXFouLirf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//ouLi8fHx////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////ptTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//nNTT
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////nNTTrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//nNTT////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////09TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  nNTT////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////ytTTrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//nNTT////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////uNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//r9TT////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////uNTTrf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////wdTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//uNTT////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////09TTrf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ytTT////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////wdTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//09TT////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////ptTT
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////nNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//09TT////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  nNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////8fHx09TToMXFrf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//ytTT////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////ytTTr9TTouLi
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////8fHxptTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////ssXFrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////4uLiqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////ssXFuNTToMXFrf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////r9TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////4uLiwdTTqPHxrf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////8fHxr9TTqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//ytTT////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////nNTTrf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  09TT////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////ptTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////4uLi
  qPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  ouLi8fHx////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////ytTTrf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ptTT////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////09TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  qPHx2eLi////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////ytTTrf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////r9TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  ouLi8fHx////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////ytTTouLirf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//qPHxwdTT////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////4uLiqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  nNTT////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////nNTTrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ptTT////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////ssXFuNTT
  uNTTuNTTuNTTuNTTuNTT09TTnNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//uNTT////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////4uLiqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////4uLiouLirf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//uNTT////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////09TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////xcXFrf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//09TT////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////2eLiqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//qPHx4uLi////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////ptTTrf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//oMXF////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////nNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//qPHxuNTT////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////4uLiqPHx
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//ouLi2eLi////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////09TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//qPHx4uLi////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////09TT
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//r9TT////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////wdTTrf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//qPHx4uLi////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  uNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//r9TT////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////uNTTrf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//qPHx4uLi////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////uNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//ptTT////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////uNTTrf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////nNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//uNTT////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////nNTTrf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////rbe2qPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//09TT////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////09TTouLirf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ptTT////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLioMXFrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//qPHx2eLi////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////09TTnNTTrf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//qPHx2eLi////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLimre2ouLirf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//uNTT////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////mre2rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLiqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//ouLi8fHx////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////wdTTrf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////ptTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//ytTT////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////09TTrf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////uNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//09TT////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////ptTTrf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////09TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//09TT////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////r9TTrf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////4uLiqPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//uNTT////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////wdTTrf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////r9TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////nNTTrf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////ytTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//09TT////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////ptTTrf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ouLi8fHx////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////09TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//ptTT////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////wdTTrf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////ytTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//09TT////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////4uLiqPHxrf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//nNTT////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////nNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////ptTTrf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//09TT
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////uNTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//nNTT////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////09TT
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//r9TT
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////8fHxouLirf//rf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//ytTT////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////r9TTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ouLi
  8fHx////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////ytTTrf//rf//rf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//r9TT////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////8fHxouLirf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  ytTT////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////r9TTrf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//ouLi8fHx////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////ytTTrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  r9TT////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////4uLi09TTssXFqPHxrf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ytTT////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////4uLimre2qPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  nNTT////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////nqinqPHxrf//rf//rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////kbe2rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//09TT////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////8fHxmre2rf//rf//rf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ouLi8fHx////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////qcXFrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//r9TT////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////pLe2qPHxrf//
  rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//ytTT////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////oMXFrf//rf//rf//rf//rf//rf//rf//rf//rf//rf//rf//
  rf//ouLi8fHx////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////ytTTqPHx
  kbe2qPHxrf//rf//rf//rf//rf//rf//rf//rf//rf//uNTT////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////09TT8fHxnqinrf//rf//rf//rf//rf//rf//rf//
  rf//rf//09TT////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLiouLirf//rf//rf//rf//rf//rf//rf//nNTT////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////4uLiqPHxrf//rf//rf//rf//rf//
  rf//rf//r9TT////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////09TTrf//rf//rf//rf//rf//rf//rf//qPHxytTT////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////nNTTrf//rf//rf//rf//
  rf//rf//u8XF////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////qcXFrf//rf//rf//ptTTytTTuNTT8fHx////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////u8XFptTTptTT
  09TT////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////</Data></Thumbnail></Binary><distInfo><distributor><distorTran><onLineSrc><linkage Sync="TRUE">file://\\muse\homes\current_projects\kruger\KNP_data\Boundaries\BNDRY_KRUGERNP.shp</linkage><protocol Sync="TRUE">Local Area Network</protocol><orDesc Sync="TRUE">002</orDesc></onLineSrc><transSize Sync="TRUE">0.149</transSize></distorTran><distorFormat><formatName Sync="TRUE">Shapefile</formatName></distorFormat></distributor></distInfo><dataIdInfo><envirDesc Sync="TRUE">Microsoft Windows 2000 Version 5.1 (Build 2600) Service Pack 1; ESRI ArcCatalog 8.3.0.800</envirDesc><dataLang><languageCode Sync="TRUE" value="en"></languageCode></dataLang><idCitation><resTitle Sync="TRUE">BNDRY_KRUGERNP</resTitle><presForm><PresFormCd Sync="TRUE" value="005"></PresFormCd></presForm></idCitation><spatRpType><SpatRepTypCd Sync="TRUE" value="001"></SpatRepTypCd></spatRpType><geoBox esriExtentType="decdegrees"><westBL Sync="TR
 UE">30.841566</westBL><eastBL Sync="TRUE">32.053312</eastBL><northBL Sync="TRUE">-22.325422</northBL><southBL Sync="TRUE">-25.535347</southBL><exTypeCode Sync="TRUE">1</exTypeCode></geoBox><dataExt><geoEle><GeoBndBox esriExtentType="native"><westBL Sync="TRUE">283091</westBL><eastBL Sync="TRUE">402511</eastBL><northBL Sync="TRUE">7529638</northBL><southBL Sync="TRUE">7175416</southBL><exTypeCode Sync="TRUE">1</exTypeCode></GeoBndBox></geoEle></dataExt></dataIdInfo><mdLang><languageCode Sync="TRUE" value="en"></languageCode></mdLang><mdStanName Sync="TRUE">ISO 19115 Geographic Information - Metadata</mdStanName><mdStanVer Sync="TRUE">DIS_ESRI1.0</mdStanVer><mdChar><CharSetCd Sync="TRUE" value="004"></CharSetCd></mdChar><mdHrLv><ScopeCd Sync="TRUE" value="005"></ScopeCd></mdHrLv><mdHrLvName Sync="TRUE">dataset</mdHrLvName><refSysInfo><RefSystem><refSysID><identCode Sync="TRUE">WGS_1984_UTM_Zone_36S</identCode></refSysID></RefSystem></refSysInfo><spatRepInfo><VectSpatRep><topLv
 l><TopoLevCd Sync="TRUE" value="001"></TopoLevCd></topLvl><geometObjs Name="BNDRY_KRUGERNP"><geoObjTyp><GeoObjTypCd Sync="TRUE" value="001"></GeoObjTypCd></geoObjTyp><geoObjCnt Sync="TRUE">1</geoObjCnt></geometObjs></VectSpatRep></spatRepInfo><mdDateSt Sync="TRUE">20040608</mdDateSt><mdFileID Sync="TRUE">{DC1097E9-4E0C-49B9-98CD-A153D308731C}</mdFileID></metadata>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/BNDRY_KRUGERNP.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/INFRA_ROADSPUBLIC_VIEW.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/INFRA_ROADSPUBLIC_VIEW.prj
  
  Index: INFRA_ROADSPUBLIC_VIEW.prj
  ===================================================================
  PROJCS["WGS_1984_UTM_Zone_36S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",33.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/INFRA_ROADSPUBLIC_VIEW.sbn
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/INFRA_ROADSPUBLIC_VIEW.sbx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/INFRA_ROADSPUBLIC_VIEW.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/INFRA_ROADSPUBLIC_VIEW.shp.xml
  
  Index: INFRA_ROADSPUBLIC_VIEW.shp.xml
  ===================================================================
  <?xml version="1.0"?>
  <!--<!DOCTYPE metadata SYSTEM "http://www.esri.com/metadata/esriprof80.dtd">-->
  <metadata xml:lang="en"><Esri><CreaDate>20030925</CreaDate><CreaTime>10263700</CreaTime><SyncOnce>FALSE</SyncOnce><SyncDate>20040518</SyncDate><SyncTime>14332600</SyncTime><ModDate>20040518</ModDate><ModTime>14332600</ModTime><MetaID>{2CC4A9DA-44ED-461B-9AC7-74D018EBF46C}</MetaID></Esri><idinfo><native Sync="TRUE">Microsoft Windows 2000 Version 5.0 (Build 2195) Service Pack 3; ESRI ArcCatalog 8.2.0.700</native><descript><langdata Sync="TRUE">en</langdata><abstract>REQUIRED: A brief narrative summary of the data set.</abstract><purpose>REQUIRED: A summary of the intentions with which the data set was developed.</purpose></descript><citation><citeinfo><origin>REQUIRED: The name of an organization or individual that developed the data set.</origin><pubdate>REQUIRED: The date when the data set is published or otherwise made available for release.</pubdate><title Sync="TRUE">INFRA_ROADSPUBLIC_VIEW</title><ftname Sync="TRUE">INFRA_ROADSPUBLIC_VIEW</ftname><geoform Sync="TRUE">vec
 tor digital data</geoform><onlink Sync="TRUE">\\Gislab\gisdata\KNP_data\Infrastructure\INFRA_ROADSPUBLIC_VIEW.shp</onlink></citeinfo></citation><timeperd><current>REQUIRED: The basis on which the time period of content information is determined.</current><timeinfo><sngdate><caldate>REQUIRED: The year (and optionally month, or month and day) for which the data set corresponds to the ground.</caldate></sngdate></timeinfo></timeperd><status><progress>REQUIRED: The state of the data set.</progress><update>REQUIRED: The frequency with which changes and additions are made to the data set after the initial data set is completed.</update></status><spdom><bounding><westbc Sync="TRUE">30.913908</westbc><eastbc Sync="TRUE">31.995959</eastbc><northbc Sync="TRUE">-22.382920</northbc><southbc Sync="TRUE">-25.480965</southbc></bounding><lboundng><leftbc Sync="TRUE">290271.000000</leftbc><rightbc Sync="TRUE">396646.000000</rightbc><bottombc Sync="TRUE">7181395.000000</bottombc><topbc Sync="
 TRUE">7523368.000000</topbc></lboundng></spdom><keywords><theme><themekt>REQUIRED: Reference to a formally registered thesaurus or a similar authoritative source of theme keywords.</themekt><themekey>REQUIRED: Common-use word or phrase used to describe the subject of the data set.</themekey></theme></keywords><accconst>REQUIRED: Restrictions and legal prerequisites for accessing the data set.</accconst><useconst>REQUIRED: Restrictions and legal prerequisites for using the data set after access is granted.</useconst><natvform Sync="TRUE">Shapefile</natvform></idinfo><dataIdInfo><envirDesc Sync="TRUE">Microsoft Windows 2000 Version 5.0 (Build 2195) Service Pack 3; ESRI ArcCatalog 8.2.0.700</envirDesc><dataLang><languageCode Sync="TRUE" value="en"></languageCode></dataLang><idCitation><resTitle Sync="TRUE">INFRA_ROADSPUBLIC_VIEW</resTitle><presForm><PresFormCd Sync="TRUE" value="005"></PresFormCd></presForm></idCitation><spatRpType><SpatRepTypCd Sync="TRUE" value="001"></SpatRe
 pTypCd></spatRpType><geoBox esriExtentType="native"><westBL Sync="TRUE">290271</westBL><eastBL Sync="TRUE">396646</eastBL><northBL Sync="TRUE">7523368</northBL><southBL Sync="TRUE">7181395</southBL><exTypeCode Sync="TRUE">1</exTypeCode></geoBox><geoBox esriExtentType="decdegrees"><westBL Sync="TRUE">30.913908</westBL><eastBL Sync="TRUE">31.995959</eastBL><northBL Sync="TRUE">-22.38292</northBL><southBL Sync="TRUE">-25.480965</southBL><exTypeCode Sync="TRUE">1</exTypeCode></geoBox></dataIdInfo><metainfo><langmeta Sync="TRUE">en</langmeta><metstdn Sync="TRUE">FGDC Content Standards for Digital Geospatial Metadata</metstdn><metstdv Sync="TRUE">FGDC-STD-001-1998</metstdv><mettc Sync="TRUE">local time</mettc><metc><cntinfo><cntorgp><cntper>REQUIRED: The person responsible for the metadata information.</cntper><cntorg>REQUIRED: The organization responsible for the metadata information.</cntorg></cntorgp><cntaddr><addrtype>REQUIRED: The mailing and/or physical address for the organ
 ization or individual.</addrtype><city>REQUIRED: The city of the address.</city><state>REQUIRED: The state or province of the address.</state><postal>REQUIRED: The ZIP or other postal code of the address.</postal></cntaddr><cntvoice>REQUIRED: The telephone number by which individuals can speak to the organization or individual.</cntvoice></cntinfo></metc><metd Sync="TRUE">20040518</metd><metextns><onlink Sync="TRUE">http://www.esri.com/metadata/esriprof80.html</onlink><metprof Sync="TRUE">ESRI Metadata Profile</metprof></metextns></metainfo><mdLang><languageCode Sync="TRUE" value="en"></languageCode></mdLang><mdStanName Sync="TRUE">ISO 19115 Geographic Information - Metadata</mdStanName><mdStanVer Sync="TRUE">DIS_ESRI1.0</mdStanVer><mdChar><CharSetCd Sync="TRUE" value="004"></CharSetCd></mdChar><mdHrLv><ScopeCd Sync="TRUE" value="005"></ScopeCd></mdHrLv><mdHrLvName Sync="TRUE">dataset</mdHrLvName><distinfo><resdesc Sync="TRUE">Downloadable Data</resdesc><stdorder><digform><d
 igtinfo><transize Sync="TRUE">0.399</transize><dssize Sync="TRUE">0.399</dssize></digtinfo></digform></stdorder></distinfo><distInfo><distributor><distorTran><onLineSrc><orDesc Sync="TRUE">002</orDesc><linkage Sync="TRUE">file://\\Gislab\gisdata\KNP_data\Infrastructure\INFRA_ROADSPUBLIC_VIEW.shp</linkage><protocol Sync="TRUE">Local Area Network</protocol></onLineSrc><transSize Sync="TRUE">0.399</transSize></distorTran><distorFormat><formatName Sync="TRUE">Shapefile</formatName></distorFormat></distributor></distInfo><spdoinfo><direct Sync="TRUE">Vector</direct><ptvctinf><esriterm Name="INFRA_ROADSPUBLIC_VIEW"><efeatyp Sync="TRUE">Simple</efeatyp><efeageom Sync="TRUE">Polyline</efeageom><esritopo Sync="TRUE">FALSE</esritopo><efeacnt Sync="TRUE">165</efeacnt><spindex Sync="TRUE">FALSE</spindex><linrefer Sync="TRUE">FALSE</linrefer></esriterm><sdtsterm Name="INFRA_ROADSPUBLIC_VIEW"><sdtstype Sync="TRUE">String</sdtstype><ptvctcnt Sync="TRUE">165</ptvctcnt></sdtsterm></ptvctinf>
 </spdoinfo><spref><horizsys><cordsysn><geogcsn Sync="TRUE">GCS_WGS_1984</geogcsn><projcsn Sync="TRUE">WGS_1984_UTM_Zone_36S</projcsn></cordsysn><planar><planci><plance Sync="TRUE">coordinate pair</plance><plandu Sync="TRUE">meters</plandu><coordrep><absres Sync="TRUE">0.000512</absres><ordres Sync="TRUE">0.000512</ordres></coordrep></planci><gridsys><gridsysn Sync="TRUE">Universal Transverse Mercator</gridsysn><utm><utmzone Sync="TRUE">-36</utmzone><transmer><sfctrmer Sync="TRUE">0.999600</sfctrmer><longcm Sync="TRUE">33.000000</longcm><latprjo Sync="TRUE">0.000000</latprjo><feast Sync="TRUE">500000.000000</feast><fnorth Sync="TRUE">10000000.000000</fnorth></transmer></utm></gridsys></planar><geodetic><horizdn Sync="TRUE">D_WGS_1984</horizdn><ellips Sync="TRUE">WGS_1984</ellips><semiaxis Sync="TRUE">6378137.000000</semiaxis><denflat Sync="TRUE">298.257224</denflat></geodetic></horizsys><vertdef><altsys><altenc Sync="TRUE">Explicit elevation coordinate included with horizonta
 l coordinates</altenc><altres Sync="TRUE">1.000000</altres></altsys></vertdef></spref><refSysInfo><RefSystem><refSysID><identCode Sync="TRUE">WGS_1984_UTM_Zone_36S</identCode></refSysID></RefSystem></refSysInfo><spatRepInfo><VectSpatRep><topLvl><TopoLevCd Sync="TRUE" value="001"></TopoLevCd></topLvl><geometObjs Name="INFRA_ROADSPUBLIC_VIEW"><geoObjTyp><GeoObjTypCd Sync="TRUE" value="001"></GeoObjTypCd></geoObjTyp><geoObjCnt Sync="TRUE">165</geoObjCnt></geometObjs></VectSpatRep></spatRepInfo><eainfo><detailed Name="INFRA_ROADSPUBLIC_VIEW"><enttyp><enttypl Sync="TRUE">INFRA_ROADSPUBLIC_VIEW</enttypl><enttypt Sync="TRUE">Feature Class</enttypt><enttypc Sync="TRUE">165</enttypc></enttyp><attr><attrlabl Sync="TRUE">FID</attrlabl><attalias Sync="TRUE">FID</attalias><attrtype Sync="TRUE">OID</attrtype><attwidth Sync="TRUE">4</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale><attrdef Sync="TRUE">Internal feature number.</attrdef><attrdefs Sync="TRUE">ESRI
 </attrdefs><attrdomv><udom Sync="TRUE">Sequential unique whole numbers that are automatically generated.</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">Shape</attrlabl><attalias Sync="TRUE">Shape</attalias><attrtype Sync="TRUE">Geometry</attrtype><attwidth Sync="TRUE">0</a
ttwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale><attrdef Sync="TRUE">Feature geometry.</attrdef><attrdefs Sync="TRUE">ESRI</attrdefs><attrdomv><udom Sync="TRUE">Coordinates defining the features.</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">OBJECTID</attrlabl><attalias Sync="TRUE">OBJECTID</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">10</attwidth></attr><attr><attrlabl Sync="TRUE">CODE</attrlabl><attalias Sync="TRUE">CODE</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">16</attwidth></attr><attr><attrlabl Sync="TRUE">NAME</attrlabl><attalias Sync="TRUE">NAME</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">100</attwidth></attr><attr><attrlabl Sync="TRUE">TYPE</attrlabl><attalias Sync="TRUE">TYPE</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">70</attwidth></attr><attr><attrlabl Sync="TRUE">Shape_len</attrlabl><attalias Sync="TRUE">Shape_len</attalias
 ><attrtype Sync="TRUE">Float</attrtype><attwidth Sync="TRUE">19</attwidth><attrdef Sync="TRUE">Internal feature number.</attrdef><attrdefs Sync="TRUE">ESRI</attrdefs><attrdomv><udom Sync="TRUE">Sequential unique whole numbers that are automatically generated.</udom></attrdomv><atnumdec Sync="TRUE">11</atnumdec></attr><attr><attrlabl Sync="TRUE">SHAPE_fid</attrlabl><attalias Sync="TRUE">SHAPE_fid</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">9</attwidth></attr></detailed></eainfo><mdDateSt Sync="TRUE">20040518</mdDateSt><dataqual><lineage><procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE">Server=GISCentral; Service=esri_sde; Database=gislab; User=sde; Version=sde.DEFAULT</srcused><date Sync="TRUE">20030925</date><time Sync="TRUE">10263700</time></procstep></lineage></dataqual></metadata>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/INFRA_ROADSPUBLIC_VIEW.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/SOILS_VENTER.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/SOILS_VENTER.prj
  
  Index: SOILS_VENTER.prj
  ===================================================================
  PROJCS["WGS_1984_UTM_Zone_36S",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",33.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/SOILS_VENTER.sbn
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/SOILS_VENTER.sbx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/SOILS_VENTER.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/SOILS_VENTER.shp.xml
  
  Index: SOILS_VENTER.shp.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <metadata>
  	<idinfo>
  		<citation>
  			<citeinfo>
  				<origin>Kruger National Park Scientific Services GIS Lab</origin>
  				<pubdate>20010323</pubdate>
  				<title Sync="TRUE">SOILS_VENTER</title>
  				<edition>May 2001</edition>
  				<geoform Sync="TRUE">vector digital data</geoform>
  				<pubinfo>
  					<pubplace>Skukuza</pubplace>
  					<publish>KNP GIS Lab</publish>
  				</pubinfo>
  				<othercit></othercit>
  				<onlink></onlink>
  				<lworkcit>
  					<citeinfo>
  						<origin></origin>
  						<pubdate></pubdate>
  						<title></title>
  						<pubinfo>
  							<pubplace></pubplace>
  							<publish></publish>
  						</pubinfo>
  						<onlink></onlink>
  					</citeinfo>
  				</lworkcit>
  				<ftname Sync="TRUE">SOILS_VENTER</ftname></citeinfo>
  		</citation>
  		<descript>
  			<abstract>General soils of the Kruger National Park (KNP) was
  created by Freek Venter using existing data of
  Bristow 1980, Harmse and van Wyk and
  Gertnebach soil descriptions.</abstract>
  			<purpose>For the KNP Scientific Services GIS database - for research
  and cartographic products. This database is intended to be
  extended or incorporated into a future KNP "Regional GIS"
  node of SANP.</purpose>
  			<langdata Sync="TRUE">en</langdata></descript>
  		<timeperd>
  			<timeinfo>
  				<rngdates>
  					<begdate>unknown</begdate>
  					<enddate>unknown</enddate>
  				</rngdates>
  			</timeinfo>
  			<current>ground condition</current>
  		</timeperd>
  		<status>
  			<progress>Complete</progress>
  			<update>Continually</update>
  		</status>
  		<spdom>
  			<bounding>
  				<westbc Sync="TRUE">30.841566</westbc>
  				<eastbc Sync="TRUE">32.053312</eastbc>
  				<northbc Sync="TRUE">-22.325422</northbc>
  				<southbc Sync="TRUE">-25.535347</southbc>
  			</bounding>
  			<lboundng><leftbc Sync="TRUE">283091.000000</leftbc><rightbc Sync="TRUE">402511.000000</rightbc><bottombc Sync="TRUE">7175416.000000</bottombc><topbc Sync="TRUE">7529638.000000</topbc></lboundng></spdom>
  		<keywords>
  			<theme>
  				<themekt>None</themekt>
  				<themekey>Boundary</themekey>
  				<themekey>Geology</themekey>
  				<themekey>Geomorphology</themekey>
  				<themekey>Kruger National Park</themekey>
  				<themekey>Lithology</themekey>
  				<themekey>Soil</themekey>
  			</theme>
  			<place>
  				<placekt>None</placekt>
  				<placekey>Kruger National Park</placekey>
  				<placekey>Mpumalanga</placekey>
  				<placekey>Northern Province</placekey>
  				<placekey>South Africa</placekey>
  			</place>
  		</keywords>
  		<accconst>None</accconst>
  		<useconst>Use at own risk. See Liability and Accuracy sections</useconst>
  		<ptcontac>
  			<cntinfo>
  				<cntorgp>
  					<cntorg>South African National Parks</cntorg>
  					<cntper>Don Ntsala</cntper>
  				</cntorgp>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time</hours>
  			</cntinfo>
  		</ptcontac>
  		<native Sync="TRUE">Microsoft Windows 2000 Version 5.0 (Build 2195) Service Pack 3; ESRI ArcCatalog 8.2.0.700</native>
  		<natvform Sync="TRUE">Shapefile</natvform></idinfo>
  	<dataqual>
  		<attracc>
  			<attraccr>Unknown</attraccr>
  		</attracc>
  		<logic>Consistent</logic>
  		<complete>Complete</complete>
  		<posacc>
  			<horizpa>
  				<horizpar>Unknown</horizpar>
  			</horizpa>
  			<vertacc>
  				<vertaccr>Not applicable</vertaccr>
  			</vertacc>
  		</posacc>
  		<lineage>
  			<srcinfo>
  				<srccite>
  					<citeinfo>
  						<origin>Dr Freek Venter</origin>
  						<pubdate>Unknown</pubdate>
  						<title>Kruger National Park Scientific Services GIS database</title>
  						<edition>March 2001</edition>
  						<geoform>map</geoform>
  						<pubinfo>
  							<pubplace>Unknown</pubplace>
  							<publish>Unknown</publish>
  						</pubinfo>
  						<othercit></othercit>
  						<onlink></onlink>
  						<lworkcit>
  							<citeinfo>
  								<origin></origin>
  								<pubdate></pubdate>
  								<title></title>
  								<pubinfo>
  									<pubplace></pubplace>
  									<publish></publish>
  								</pubinfo>
  								<onlink></onlink>
  							</citeinfo>
  						</lworkcit>
  					</citeinfo>
  				</srccite>
  				<srcscale>Unknown</srcscale>
  				<typesrc>CD-ROM</typesrc>
  				<srctime>
  					<timeinfo>
  						<rngdates>
  							<begdate>unknown</begdate>
  							<enddate>unknown</enddate>
  						</rngdates>
  					</timeinfo>
  					<srccurr>ground condition</srccurr>
  				</srctime>
  				<srccitea>KNP SS GIS Database</srccitea>
  				<srccontr>Integration with KNP SS GIS database</srccontr>
  			</srcinfo>
  			<srcinfo>
  				<srccite>
  					<citeinfo>
  						<origin>Dr Freek Venter</origin>
  						<pubdate>Unknown</pubdate>
  						<title>Kruger National Park Scientific Services GIS database</title>
  						<edition>March 2001</edition>
  						<geoform>map</geoform>
  						<pubinfo>
  							<pubplace>Unknown</pubplace>
  							<publish>Unknown</publish>
  						</pubinfo>
  						<othercit></othercit>
  						<onlink></onlink>
  						<lworkcit>
  							<citeinfo>
  								<origin></origin>
  								<pubdate></pubdate>
  								<title></title>
  								<pubinfo>
  									<pubplace></pubplace>
  									<publish></publish>
  								</pubinfo>
  								<onlink></onlink>
  							</citeinfo>
  						</lworkcit>
  					</citeinfo>
  				</srccite>
  				<srcscale>Unknown</srcscale>
  				<typesrc>CD-ROM</typesrc>
  				<srctime>
  					<timeinfo>
  						<rngdates>
  							<begdate>Unknown</begdate>
  							<enddate>Unknown</enddate>
  						</rngdates>
  					</timeinfo>
  					<srccurr>Ground condition</srccurr>
  				</srctime>
  				<srccitea>KNP SS GIS Database</srccitea>
  				<srccontr>Integration with KNP SS GIS database</srccontr>
  			</srcinfo>
  			<procstep>
  				<procdesc>None</procdesc>
  				<proccont>
  					<cntinfo>
  						<cntperp>
  							<cntper></cntper>
  							<cntorg></cntorg>
  						</cntperp>
  						<cntpos></cntpos>
  						<cntaddr>
  							<addrtype>mailing and physical address</addrtype>
  							<address></address>
  							<city></city>
  							<state></state>
  							<postal></postal>
  							<country></country>
  						</cntaddr>
  						<cntvoice></cntvoice>
  						<cntfax></cntfax>
  						<cntemail></cntemail>
  						<hours></hours>
  					</cntinfo>
  				</proccont>
  			</procstep>
  			<procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE">F:\KNP_data_UTM\Soils\soils_Venter</srcused><date Sync="TRUE">20030520</date><time Sync="TRUE">14105200</time></procstep><procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE"></srcused><date Sync="TRUE">20030522</date><time Sync="TRUE">12491000</time></procstep><procstep><procdesc Sync="TRUE">Dataset copied.</procdesc><srcused Sync="TRUE">Server=GISCentral; Service=esri_sde; Database=gislab; User=sde; Version=sde.DEFAULT</srcused><date Sync="TRUE">20030925</date><time Sync="TRUE">10233400</time></procstep></lineage>
  	</dataqual>
  	<spdoinfo>
  		<direct Sync="TRUE">Vector</direct>
  		<ptvctinf>
  			<sdtsterm Name="SOILS_VENTER">
  				<sdtstype Sync="TRUE">G-polygon</sdtstype>
  				<ptvctcnt Sync="TRUE">84</ptvctcnt>
  			</sdtsterm>
  			<esriterm Name="SOILS_VENTER"><efeatyp Sync="TRUE">Simple</efeatyp><efeageom Sync="TRUE">Polygon</efeageom><esritopo Sync="TRUE">FALSE</esritopo><efeacnt Sync="TRUE">84</efeacnt><spindex Sync="TRUE">FALSE</spindex><linrefer Sync="TRUE">FALSE</linrefer></esriterm></ptvctinf>
  	</spdoinfo>
  	<spref>
  		<horizsys>
  			<planar>
  				<planci>
  					<plance Sync="TRUE">coordinate pair</plance>
  					<coordrep>
  						<absres Sync="TRUE">0.000512</absres>
  						<ordres Sync="TRUE">0.000512</ordres>
  					</coordrep>
  					<plandu Sync="TRUE">meters</plandu>
  				</planci>
  				<gridsys><gridsysn Sync="TRUE">Universal Transverse Mercator</gridsysn><utm><utmzone Sync="TRUE">-36</utmzone><transmer><sfctrmer Sync="TRUE">0.999600</sfctrmer><longcm Sync="TRUE">33.000000</longcm><latprjo Sync="TRUE">0.000000</latprjo><feast Sync="TRUE">500000.000000</feast><fnorth Sync="TRUE">10000000.000000</fnorth></transmer></utm></gridsys></planar>
  			<geodetic>
  				<horizdn Sync="TRUE">D_WGS_1984</horizdn>
  				<ellips Sync="TRUE">WGS_1984</ellips>
  				<semiaxis Sync="TRUE">6378137.000000</semiaxis>
  				<denflat Sync="TRUE">298.257224</denflat>
  			</geodetic>
  			<cordsysn><geogcsn Sync="TRUE">GCS_WGS_1984</geogcsn><projcsn Sync="TRUE">WGS_1984_UTM_Zone_36S</projcsn></cordsysn></horizsys>
  		<vertdef><altsys><altenc Sync="TRUE">Explicit elevation coordinate included with horizontal coordinates</altenc><altres Sync="TRUE">1.000000</altres></altsys></vertdef></spref>
  	<eainfo>
  		<detailed Name="SOILS_VENTER">
  			<enttyp>
  				<enttypl Sync="TRUE">SOILS_VENTER</enttypl>
  				<enttypd>Shapefile Attribute Table</enttypd>
  				<enttypds>None</enttypds>
  				<enttypt Sync="TRUE">Feature Class</enttypt><enttypc Sync="TRUE">84</enttypc></enttyp>
  			<attr>
  				<attrlabl Sync="TRUE">FID</attrlabl>
  				<attrdef Sync="TRUE">Internal feature number.</attrdef>
  				<attrdefs Sync="TRUE">ESRI</attrdefs>
  				<attrdomv>
  					<udom Sync="TRUE">Sequential unique whole numbers that are automatically generated.</udom>
  				</attrdomv>
  				<attalias Sync="TRUE">FID</attalias><attrtype Sync="TRUE">OID</attrtype><attwidth Sync="TRUE">4</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale></attr>
  			<attr>
  				<attrlabl Sync="TRUE">Shape</attrlabl>
  				<attrdef Sync="TRUE">Feature geometry.</attrdef>
  				<attrdefs Sync="TRUE">ESRI</attrdefs>
  				<attrdomv>
  					<codesetd>
  						<codesetn>SK</codesetn>
  						<codesets>Skukuza</codesets>
  					</codesetd>
  					<udom Sync="TRUE">Coordinates defining the features.</udom></attrdomv>
  				<attalias Sync="TRUE">Shape</attalias><attrtype Sync="TRUE">Geometry</attrtype><attwidth Sync="TRUE">0</attwidth><atprecis Sync="TRUE">0</atprecis><attscale Sync="TRUE">0</attscale></attr>
  			<attr>
  				<attrlabl Sync="TRUE">OBJECTID</attrlabl>
  				<attrdef>Land System Name</attrdef>
  				<attrdefs></attrdefs>
  				<attrdomv>
  					<udom>Character Field</udom>
  				</attrdomv>
  				<attalias Sync="TRUE">OBJECTID</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">10</attwidth></attr>
  			<attr>
  				<attrlabl Sync="TRUE">CODE</attrlabl>
  				<attrdef>Software Generated</attrdef>
  				<attrdefs></attrdefs>
  				<attrdomv>
  					<rdom>
  						<rdommin>13.402</rdommin>
  						<rdommax>721.693</rdommax>
  					</rdom>
  				</attrdomv>
  				<attalias Sync="TRUE">CODE</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">16</attwidth></attr>
  			<attr><attrlabl Sync="TRUE">PRIMARY_</attrlabl><attalias Sync="TRUE">PRIMARY_</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">5</attwidth></attr><attr><attrlabl Sync="TRUE">SECONDARY</attrlabl><attalias Sync="TRUE">SECONDARY</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">5</attwidth><attrdef Sync="TRUE">Feature geometry.</attrdef><attrdefs Sync="TRUE">ESRI</attrdefs><attrdomv><udom Sync="TRUE">Coordinates defining the features.</udom></attrdomv></attr><attr><attrlabl Sync="TRUE">TERTIARY</attrlabl><attalias Sync="TRUE">TERTIARY</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="TRUE">5</attwidth></attr><attr><attrlabl Sync="TRUE">PRIMARY_DE</attrlabl><attalias Sync="TRUE">PRIMARY_DE</attalias><attrtype Sync="TRUE">String</attrtype><attwidth Sync="TRUE">30</attwidth></attr><attr><attrlabl Sync="TRUE">AREA_HA</attrlabl><attalias Sync="TRUE">AREA_HA</attalias><attrtype Sync="TRUE">Number</attrtype><attwidth Sync="
 TRUE">10</attwidth></attr><attr><attrlabl Sync="TRUE">SHAPE_area</attrlabl><attalias Sync="TRUE">SHAPE_area</attalias><attrtype Sync="TRUE">Float</attrtype><attwidth Sync="TRUE">19</attwidth><attrdef Sync="TRUE">Area of feature in internal units squared.</attrdef><attrdefs Sync="TRUE">ESRI</attrdefs><attrdomv><udom Sync="TRUE">Positive real numbers that are automatically generated.</udom></attrdomv><atnumdec Sync="TRUE">11</atnumdec></attr><attr><attrlabl Sync="TRUE">SHAPE_len</attrlabl><attalias Sync="TRUE">SHAPE_len</attalias><attrtype Sync="TRUE">Float</attrtype><attwidth Sync="TRUE">19</attwidth><atnumdec Sync="TRUE">11</atnumdec></attr></detailed>
  		<detailed Name="gislab.SDE.SOILS_Venter"><enttyp><enttypl Sync="TRUE">gislab.SDE.SOILS_Venter</enttypl><enttypt Sync="TRUE">Relationship</enttypt></enttyp><attr><atnumdec/></attr><attr><atnumdec/></attr></detailed></eainfo>
  	<distinfo>
  		<distrib>
  			<cntinfo>
  				<cntorgp>
  					<cntorg>South African National Parks</cntorg>
  					<cntper>Don Ntsala</cntper>
  				</cntorgp>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>
  Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time
  (GMT + 2)
  </hours>
  			</cntinfo>
  		</distrib>
  		<distliab>
  Users must assume responsibility to determine appropriate
  use of these data. The data were gathered for scientific
  use and do not conform to survey accuracy. The data are
  provided "as-is" to the public, especially intended for
  researchers and the KNP GIS Lab may not be held liable for
  any loss or damage incurred due to inaccuracy of the data.
  </distliab>
  		<custom>
  Send an e-mail request to gismaster at parks-sa.co.za or phone
  during office hours +27 (0)13 735-4257 to request these
  data in digital form. Nominal fees are charged for data
  conversion, storage medium, packaging and postage if the
  requested data are practically too large to send as e-mail attachments.
  </custom>
  		<stdorder><digform><digtinfo><transize Sync="TRUE">0.432</transize><dssize Sync="TRUE">0.432</dssize></digtinfo></digform></stdorder><resdesc>KNP SS GIS database: August 2001 release</resdesc></distinfo>
  	<metainfo>
  		<metd Sync="TRUE">20040520</metd>
  		<metc>
  			<cntinfo>
  				<cntorgp>
  					<cntorg>South African National Parks</cntorg>
  					<cntper>Don Ntsala</cntper>
  				</cntorgp>
  				<cntpos>KNP Scientific Services GIS Administrator</cntpos>
  				<cntaddr>
  					<addrtype>Mailing and physical address</addrtype>
  					<address>Kruger National Park, Private Bag X402</address>
  					<city>Skukuza</city>
  					<state>Mpumalanga</state>
  					<postal>1350</postal>
  					<country>South Africa</country>
  				</cntaddr>
  				<cntvoice>+27 (0)13 735-4236</cntvoice>
  				<cntfax>+27 (0)13 735-4055</cntfax>
  				<cntemail>gismaster at parks-sa.co.za</cntemail>
  				<hours>
  Monday - Friday 07:00 - 12:45, 13:45 - 16:00 local time
  (GMT + 2)
  </hours>
  			</cntinfo>
  		</metc>
  		<metstdn Sync="TRUE">FGDC Content Standards for Digital Geospatial Metadata</metstdn>
  		<metstdv Sync="TRUE">FGDC-STD-001-1998</metstdv>
  		<langmeta Sync="TRUE">en</langmeta><mettc Sync="TRUE">local time</mettc><metrd>20030425</metrd><metextns><onlink Sync="TRUE">http://www.esri.com/metadata/esriprof80.html</onlink><metprof Sync="TRUE">ESRI Metadata Profile</metprof></metextns></metainfo>
  	<Esri><CreaDate>20030925</CreaDate><CreaTime>10233400</CreaTime><SyncOnce>FALSE</SyncOnce><SyncDate>20040520</SyncDate><SyncTime>14210800</SyncTime><ModDate>20040520</ModDate><ModTime>14210800</ModTime><MetaID>{DD24578E-E4DF-4C3C-8DE3-B836618C9F58}</MetaID></Esri><Binary><Thumbnail><Data EsriPropertyType="Picture">Qk3uNwEAAAAAADYAAAAoAAAAyAAAAIUAAAABABgAAAAAALg3AQAAAAAAAAAAAAAAAAAAAAAA////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////8fHx4uLi////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////wtTUntTUudTUvcXF////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////nLe3ntTUr///r///r///ntTU
  tMXF////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////ntTUr///r///r///r///r///r///rre3////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////xcXFqvHxr///r///r///r///
  r///r///p9TU1NTU////pbe3wtTU////////////////////////////////////////vcXF4uLi
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////q8XFmcXFmcXFmcXFr///r///r///r///k7e3osXFxcXFnLe3pOLiy9TU////
  ////////////////////////////////g4uLwtTU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////4uLiqvHxr///r///pOLintTU
  r///r///r///ntTUr///r///r///r///pOLivcXFvcXF4uLi////8fHx4uLirre3////1NTUk7e3
  ntTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////q8XFr///qvHxk7e3mcXFjqiontTUntTUk7e3ntTUr///r///r///r///r///
  r///r///1NTU4uLimcXFntTUk7e38fHxvcXFg4uLpOLi8fHx////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////8fHxpOLir///pOLipOLiqvHx
  jqiopOLiqvHxr///r///r///r///qvHxpOLir///r///ntTU1NTUudTUjqiontTUntTUsNTUpOLi
  jqior///1NTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////4uLiqvHxr///r///ntTUpOLintTUr///r///mcXFntTUntTUmcXFiJqaqvHx
  r///r///qvHxosXFr///qvHxk7e3ntTUr///r///jqior///1NTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////xcXFqvHxr///r///k7e3
  k7e3r///ntTUiJqamcXFmcXFntTUmcXFmcXFntTUr///qvHxr///r///r///ntTUqvHxjqior///
  r///k7e3qvHxwtTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////vcXFr///r///r///mcXFmcXFk7e3jqior///r///r///r///r///r///
  qvHxntTUmcXFr///qvHxk7e3k7e3qvHxjqior///r///mcXFntTUudTU////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////4uLip9TUr///r///pOLi
  ntTUmcXFntTUr///r///r///r///r///r///r///r///r///ntTUr///k7e3ntTUr///mcXFjqio
  qvHxpOLik7e3r///udTU////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////k7e3r///r///r///mcXFr///ntTUr///r///r///r///r///r///r///
  r///r///r///mcXFmcXFqvHxmcXFqvHxntTUntTUntTUpOLik7e3r///udTU////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////xcXFqvHxr///r///qvHx
  jqiontTUpOLir///r///r///r///r///r///r///r///r///qvHxqvHxr///mcXFr///r///ntTU
  mcXFpOLir///ntTUr///udTU////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////udTUr///r///r///k7e3ntTUr///r///r///r///r///r///r///r///
  r///r///r///ntTUk7e3ntTUjqioqvHxr///ntTUjqior///r///ntTUr///udTU////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////xcXFr///r///r///
  k7e3qvHxr///r///r///r///r///r///r///r///r///r///mcXFpOLir///r///pOLiqvHxr///
  mcXFjqior///r///ntTUr///udTU////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////1NTUk7e3jqiok7e3jqior///pOLir///pOLik7e3mcXFk7e3pOLi
  r///pOLimcXFpOLir///r///r///r///r///r///jqiontTUr///r///ntTUr///udTU////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////osXFmcXF
  mcXFmcXFjqiojqiontTUpOLir///r///r///ntTUntTUqvHxr///r///r///r///r///r///r///
  ntTUiJqantTUr///r///ntTUr///udTU////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////4uLik7e3pOLimcXFntTUntTUr///r///r///r///r///
  qvHxntTUr///r///r///r///r///r///r///ntTUr///jqiontTUqvHxpOLintTUr///udTU////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  tMXFntTUntTUmcXFmcXFr///r///r///r///r///r///r///r///r///r///r///r///r///r///
  ntTUr///jqior///mcXFk7e3r///r///1NTU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////xcXFtMXFnLe3jqiopOLiqvHxp9TUudTUosXF
  r///qvHxr///r///r///r///r///r///r///r///ntTUr///fX19r///k7e3k7e3r///r///1NTU
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////4uLi4uLi4uLi1NTU4uLi////8fHx1NTUxcXFudTUosXFpOLir///r///r///r///
  r///ntTUr///fX19r///k7e3ntTUr///pOLi8fHx////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////jqiontTUntTUntTUntTUjqiok7e3mcXFjqior///r///ntTUr///ntTU
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////ntTUr///jqioiJqa
  k7e3pOLimcXFmcXFjqior///pOLimcXFr///ntTU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////1NTUr///k7e3r///r///ntTUntTUmcXFqvHxntTUntTUntTUk7e3r///
  ntTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////y9TUr///pOLintTU
  ntTUntTUqvHxntTUntTUntTUntTUr///r///r///ntTU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////udTUr///r///r///r///ntTUqvHxpOLik7e3pOLintTUr///r///
  r///sNTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////udTUr///r///
  r///r///r///mcXFr///k7e3mcXFntTUr///r///r///udTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////wtTUr///r///r///r///r///ntTUr///pOLijqiontTUr///
  r///r///udTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////1NTUr///
  r///r///mcXFntTUntTUr///ntTUmcXFntTUk7e3pOLir///y9TU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////wtTUr///r///r///mcXFr///mcXFpOLiiJqar///qvHx
  ntTUntTUr///1NTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////p9TU
  r///r///r///mcXFmcXFmcXFk7e3ntTUk7e3r///r///ntTUr///1NTU////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////k7e3k7e3r///r///k7e3k7e3r///iJqamcXFntTU
  r///r///ntTUr///1NTU////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ntTUmcXFntTUk7e3iJqamcXFntTUmcXFmcXFmcXFr///r///ntTUr///1NTU////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////8fHx1NTUosXFr///ntTUmcXFk7e3ntTUmcXFr///r///
  ntTUr///r///ntTUr///y9TU////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////y9TUsNTUpOLi
  r///ntTUr///qvHxntTUr///ntTUntTUr///r///ntTUr///r///pOLiqvHxudTU////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////8fHxp9TUr///r///r///r///pOLik7e3k7e3k7e3qvHxmcXFk7e3ntTU
  r///ntTUr///r///r///ntTUudTU////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////tMXFr///r///r///
  r///r///r///r///r///r///ntTUntTUntTUmcXFr///ntTUr///r///mcXFmcXFudTU////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////4uLiqvHxr///r///r///r///r///r///r///pOLiqvHxk7e3qvHx
  mcXFpOLintTUr///qvHxpOLintTUudTU////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////tMXFudTUosXFpOLi
  r///r///r///r///r///pOLik7e3r///jqior///ntTUntTUqvHxr///ntTUr///mcXFudTU////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////sNTUr///ntTUr///r///r///ntTUntTUmcXFiJqak7e3r///jqio
  r///qvHxqvHxr///r///ntTUr///ntTUudTU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////4uLivcXFmcXFr///ntTU
  r///r///k7e3qvHxqvHxjqior///ntTUr///iJqar///r///r///r///r///ntTUr///ntTUudTU
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////8fHxpbe3qvHxr///qvHxntTUmcXFntTUntTUntTUpOLimcXFk7e3ntTU
  pOLir///r///r///r///r///ntTUr///ntTUy9TU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////mcXFntTU
  r///ntTUntTUntTUntTUk7e3ntTUntTUk7e3ntTUr///r///r///r///r///r///ntTUr///ntTU
  1NTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////nLe3qvHxntTUqvHxqvHxr///r///iJqar///ntTUmcXF
  r///r///r///r///r///r///r///ntTUr///ntTU1NTU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////4uLi
  qvHxr///r///r///r///qvHxk7e3r///k7e3jqiontTUk7e3ntTUr///r///r///r///k7e3pOLi
  ntTU8fHx////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////y9TUr///r///r///r///ntTUntTUpOLijqio
  pOLik7e3r///ntTUntTUr///r///r///ntTUntTUp9TU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////1NTUr///r///r///r///qvHxqvHxpOLintTUr///ntTUr///r///pOLiqvHxmcXFjqioqvHx
  mcXF2uLi////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////y9TUr///r///r///pOLiqvHxr///pOLi
  qvHxr///ntTUr///r///r///ntTUqvHxntTUntTUtMXF////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////sNTUr///r///pOLijqiontTUr///ntTUr///r///mcXFqvHxr///r///r///r///pOLi
  ntTU8fHx////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////y9TUpOLipOLijqioqvHxr///r///
  ntTUr///r///r///pOLiqvHxr///r///r///k7e3wtTU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////4uLimcXFpOLir///r///r///ntTUr///r///r///r///mcXFntTUmcXFjqio
  ntTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////ntTUr///r///r///
  r///ntTUr///r///r///r///r///r///r///ntTUp9TU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////tMXFudTU
  udTUudTUudTUudTUudTU1NTUntTUr///r///r///ntTUr///r///r///r///r///r///r///r///
  ntTUudTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////4uLiqvHxr///r///r///r///r///r///r///r///r///r///
  r///mcXFr///r///r///r///r///r///r///pOLipOLiudTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////4uLipOLir///
  r///r///r///r///r///r///r///r///r///r///ntTUr///r///r///r///r///r///r///r///
  mcXFr///udTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////1NTUjqioqvHxr///r///r///r///r///r///r///r///r///
  r///mcXFr///r///r///r///r///r///r///qvHxntTUr///1NTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////xcXFr///
  k7e3r///qvHxqvHxr///r///r///r///qvHxqvHxpOLimcXFr///r///r///r///r///r///r///
  ntTUr///r///1NTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////2uLiqvHxr///qvHxmcXFntTUntTUk7e3ntTUmcXFmcXFntTU
  k7e3g4uLmcXFr///r///r///r///r///r///ntTUr///r///qvHx4uLi////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////p9TUr///
  r///r///r///r///r///r///r///r///r///qvHxiJqak7e3ntTUr///r///r///r///ntTUr///
  ntTUr///r///osXF////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////ntTUr///r///r///r///qvHxr///r///r///r///ntTU
  jqioqvHxiJqaqvHxr///r///qvHxk7e3mcXFntTUr///qvHxudTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////4uLiqvHx
  r///r///r///pOLijqiok7e3jqiojqiojqiomcXFr///pOLimcXFr///r///pOLik7e3pOLir///
  r///pOLi2uLi////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////1NTUr///r///r///r///qvHxntTUg4uLr///pOLir///
  r///r///mcXFpOLipOLiqvHxk7e3iJqar///r///qvHx4uLi////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////1NTU
  ntTUr///r///ntTUmcXFk7e3k7e3r///r///r///r///qvHxk7e3r///ntTUjqiopOLik7e3r///
  r///sNTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////wtTUqvHxk7e3mcXFpOLir///g4uLpOLir///qvHx
  qvHxr///ntTUmcXFqvHxk7e3ntTUntTUntTUr///qvHx4uLi////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  udTUr///r///r///r///r///k7e3mcXFqvHxntTUmcXFntTUk7e3k7e3pOLik7e3qvHxr///ntTU
  r///sNTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////udTUr///r///r///r///mcXFk7e3jqiomcXF
  r///r///r///r///jqior///mcXFr///r///ntTUqvHx4uLi////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////tMXFr///r///ntTUmcXFjqiok7e3qvHxr///r///r///r///ntTUntTUpOLimcXFr///r///
  ntTUp9TU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////tMXFntTUntTUr///mcXFjqiontTUr///
  r///r///r///r///iJqaqvHxntTUntTUr///r///ntTUudTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////p9TUr///r///r///k7e3k7e3r///r///r///r///r///jqiontTUr///mcXFntTUr///
  r///ntTUudTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////ntTUr///r///r///qvHxjqior///
  r///r///r///pOLintTUr///qvHxpOLintTUr///r///ntTU1NTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////rre3qvHxr///pOLintTUntTUqvHxr///r///r///r///iJqar///r///ntTUpOLiqvHx
  r///qvHxntTU1NTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////1NTUpOLir///qvHxiJqajqiog4uLr///
  r///r///r///pOLimcXFr///mcXFqvHxntTUr///qvHxk7e3p9TU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLiosXFr///pOLintTUr///qvHxr///r///r///r///jqior///qvHxntTUr///ntTU
  qvHxntTUqvHx2uLi////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////1NTUntTUr///r///pOLijqior///
  r///r///r///qvHxmcXFr///mcXFr///ntTUr///mcXFqvHx2uLi////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLinLe3pOLir///r///r///k7e3mcXFr///r///r///mcXFpOLir///ntTUr///ntTU
  mcXFr///udTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////nLe3r///r///r///r///r///r///
  jqior///r///r///k7e3r///qvHxntTUr///mcXFntTUudTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLiqvHxr///r///r///qvHxmcXFntTUk7e3r///r///qvHxk7e3r///mcXFr///r///
  ntTUjqio8fHx////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////wtTUr///r///r///qvHxg4uLntTU
  ntTUr///r///qvHxk7e3ntTUr///mcXFr///r///ntTUqKio////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////p9TUr///r///qvHxiJqaqvHxr///r///r///r///pOLimcXFntTUmcXFr///r///
  r///ntTUxcXF////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////1NTUr///r///qvHxiJqaqvHxr///
  r///r///r///r///ntTUiJqapOLiqvHxr///r///r///ntTU1NTU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////sNTUr///r///iJqar///r///r///r///r///r///r///mcXFmcXFmcXFr///r///
  r///r///ntTU1NTU////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////jqior///qvHxntTUr///r///
  r///r///r///qvHxr///mcXFpOLimcXFr///r///r///r///k7e31NTU////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////1NTUntTUntTUr///r///r///r///r///r///r///mcXFiJqajqior///ntTUr///
  r///r///qvHxiJqa1NTU////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////rre3ntTUpOLipOLir///r///
  r///pOLir///r///mcXFk7e3mcXFr///ntTUr///r///r///mcXFpOLi1NTU////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////8fHxmcXFpOLik7e3k7e3r///r///k7e3jqior///ntTUmcXFmcXFqvHxr///mcXF
  r///r///pOLipOLir///qKio////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////wtTUr///mcXFqvHxntTUk7e3
  ntTUpOLipOLiqvHxk7e3iJqak7e3r///r///r///mcXFmcXFntTUr///r///udTU////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////sNTUr///mcXFjqiontTUr///mcXFk7e3r///mcXFr///ntTUjqior///r///
  r///r///r///r///r///r///udTU////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////8fHxpOLir///mcXFk7e3r///
  r///ntTUpOLintTUmcXFpOLintTUk7e3r///r///r///r///r///r///r///r///udTU////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////vcXFntTUr///mcXFmcXFr///r///r///pOLiiJqajqiontTUntTUntTUr///
  r///r///r///r///r///r///r///y9TU////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////p9TUntTUmcXFntTUntTU
  ntTUmcXFk7e3ntTUmcXFfX19iJqag4uLk7e3ntTUk7e3pOLir///r///r///r///qvHx4uLi////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////1NTUr///r///qvHxmcXFmcXFmcXFntTUr///r///pOLimcXFk7e3iJqaqvHx
  r///r///k7e3r///k7e3mcXFr///ntTU////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////vcXFmcXFk7e3mcXFr///
  r///r///r///r///r///r///qvHxntTUjqior///r///r///qvHxntTUntTUjqiontTUvcXF////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////rre3iJqajqiontTUr///r///r///r///r///r///r///r///ntTUjqio
  r///r///r///r///r///r///ntTUk7e38fHx////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////4uLiqvHxr///r///
  r///r///r///r///r///qvHxntTUk7e3iJqag4uLr///r///r///r///r///r///pOLil6io////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////ntTUr///r///r///r///r///r///qvHxntTUr///ntTUqvHx
  k7e3r///r///r///r///r///r///k7e3udTU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////l6iontTU
  qvHxr///r///r///r///mcXFr///ntTUqvHxr///ntTUr///r///r///r///ntTUk7e3r///1NTU
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////wtTUmcXFqvHxr///r///r///r///mcXFpOLintTUr///
  qvHxntTUr///r///r///mcXFiJqapOLintTU////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////1NTU
  r///r///r///r///r///r///r///mcXFr///ntTUk7e3r///r///r///r///ntTUjqiopOLirre3
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////k7e3ntTUntTUntTUntTUntTUntTUntTUntTU
  qvHxmcXFr///r///r///r///mcXFk7e3jqio1NTU////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////wtTUqvHxr///r///r///r///ntTUmcXFk7e3qvHxntTUr///r///r///r///ntTUntTUiJqa
  8fHx////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////1NTUr///r///pOLintTUk7e3qvHxr///
  mcXFg4uLqvHxr///r///r///qvHxntTUmcXFpbe3////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLiqvHxr///k7e3ntTUr///r///r///jqiomcXFr///r///r///r///ntTUntTUk7e3
  y9TU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////kZqak7e3ntTUk7e3r///mcXF
  k7e3jqior///r///r///r///r///mcXFjqiontTU8fHx////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////y9TUntTUmcXFmcXFr///mcXFk7e3mcXFr///r///r///r///mcXFpOLimcXF
  q8XF////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////4uLi1NTUvcXFntTUntTUmcXFpOLi
  mcXFntTUqvHxr///r///r///k7e3ntTUk7e3jqioy9TU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////4uLiiJqapOLijqiomcXFjqiomcXFntTUjqiopOLintTUr///r///pOLik7e3qvHxntTUr///
  mcXF////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////oKiok7e3ntTUjqiok7e3r///r///
  ntTUmcXFr///r///r///qvHxntTUpOLimcXFpOLiudTU////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////k7e3qvHxntTUr///r///ntTUk7e3mcXFr///qvHxpOLik7e3pOLimcXFr///
  r///1NTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////8fHxl6iomcXFmcXFmcXF
  qvHxk7e3jqiomcXFpOLipOLimcXFntTUr///r///pOLi8fHx////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////q8XFmcXFqvHxr///mcXFk7e3r///r///ntTUk7e3ntTUmcXF
  pOLisNTU////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////pbe3mcXFmcXF
  mcXFmcXFmcXFk7e3r///r///r///ntTUntTUr///pOLi1NTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////osXFk7e3pOLir///k7e3k7e3mcXFr///r///r///ntTUntTU
  ntTUjqio////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////y9TUmcXF
  g4uLk7e3ntTUk7e3pOLir///r///r///ntTUpOLipOLisNTU////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////1NTU8fHxmpqamcXFntTUpOLir///r///r///k7e3
  pOLintTU1NTU////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////4uLipOLir///pOLintTUntTUpOLimcXFmcXFjqio8fHx////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////4uLiqvHxr///r///mcXFk7e3jqio
  k7e3mcXFq8XF////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////4uLintTUqvHxmcXFntTUmcXFr///ntTUntTUy9TU////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////kZqajqiontTUr///qvHx
  ntTUqvHxt7e3////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////qKioiJqantTUqvHxosXFy9TUrre38fHx////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////t7e3kZqal6io
  1NTU////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////</Data></Thumbnail></Binary><distInfo><distributor><distorTran><onLineSrc><linkage Sync="TRUE">file://\\Gislab\gisdata\KNP_data\Soils\SOILS_VENTER.shp</linkage><protocol Sync="TRUE">Local Area Network</protocol><orDesc Sync="TRUE">002</orDesc></onLineSrc><transSize Sync="TRUE">0.432</transSize></distorTran><distorFormat><formatName Sync="TRUE">Shapefile</formatName></distorFormat></distributor></distInfo><dataIdInfo><envirDesc Sync="TRUE">Microsoft Windows 2000 Version 5.0 (Build 2195) Service Pack 3; ESRI ArcCatalog 8.2.0.700</envirDesc><dataLang><languageCode Sync="TRUE" value="en"></languageCode></dataLang><idCitation><resTitle Sync="TRUE">SOILS_VENTER</resTitle><presForm><PresFormCd Sync="TRUE" value="005"></PresFormCd></presForm></idCitation><spatRpType><SpatRepTypCd Sync="TRUE" value="001"></SpatRepTypCd></spatRpType><geoBox esriExtentType="native"><westBL Sync="TRUE">283091</westBL><eastBL Sync="
 TRUE">402511</eastBL><northBL Sync="TRUE">7529638</northBL><southBL Sync="TRUE">7175416</southBL><exTypeCode Sync="TRUE">1</exTypeCode></geoBox><geoBox esriExtentType="decdegrees"><westBL Sync="TRUE">30.841566</westBL><eastBL Sync="TRUE">32.053312</eastBL><northBL Sync="TRUE">-22.325422</northBL><southBL Sync="TRUE">-25.535347</southBL><exTypeCode Sync="TRUE">1</exTypeCode></geoBox></dataIdInfo><mdLang><languageCode Sync="TRUE" value="en"></languageCode></mdLang><mdStanName Sync="TRUE">ISO 19115 Geographic Information - Metadata</mdStanName><mdStanVer Sync="TRUE">DIS_ESRI1.0</mdStanVer><mdChar><CharSetCd Sync="TRUE" value="004"></CharSetCd></mdChar><mdHrLv><ScopeCd Sync="TRUE" value="005"></ScopeCd></mdHrLv><mdHrLvName Sync="TRUE">dataset</mdHrLvName><refSysInfo><RefSystem><refSysID><identCode Sync="TRUE">WGS_1984_UTM_Zone_36S</identCode></refSysID></RefSystem></refSysInfo><spatRepInfo><VectSpatRep><topLvl><TopoLevCd Sync="TRUE" value="001"></TopoLevCd></topLvl><geometObjs N
 ame="SOILS_VENTER"><geoObjTyp><GeoObjTypCd Sync="TRUE" value="001"></GeoObjTypCd></geoObjTyp><geoObjCnt Sync="TRUE">84</geoObjCnt></geometObjs></VectSpatRep></spatRepInfo><mdDateSt Sync="TRUE">20040520</mdDateSt></metadata>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/SOILS_VENTER.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/kruger_bnd.ZIP
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/states.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/states.prj
  
  Index: states.prj
  ===================================================================
  GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/states.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/states.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/world_borders.dbf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/world_borders.prj
  
  Index: world_borders.prj
  ===================================================================
  GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/world_borders.shp
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/shp/world_borders.shx
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/Lakes.sld
  
  Index: Lakes.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0" 
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  	xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xlink="http://www.w3.org/1999/xlink" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer><Name>Default Styler</Name>
      <UserStyle>
          
          <Title>Default Styler</Title>
          <Abstract></Abstract>
          <FeatureTypeStyle>
              <FeatureTypeName>Feature</FeatureTypeName>
              <Rule>
                  <Name>name</Name>
  
   
                  <PolygonSymbolizer>
                      <Fill>
                          <CssParameter name="fill">
                              <ogc:Literal>#4040C0</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="fill-opacity">
                              <ogc:Literal>1.0</ogc:Literal>
                          </CssParameter>
                      </Fill>
                      <Stroke>
                          <CssParameter name="stroke">
                              <ogc:Literal>#000000</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-linecap">
                              <ogc:Literal>butt</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-linejoin">
                              <ogc:Literal>miter</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-opacity">
                              <ogc:Literal>1</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-width">
                              <ogc:Literal>1</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-dashoffset">
                              <ogc:Literal>0</ogc:Literal>
                          </CssParameter>
                      </Stroke>
                  </PolygonSymbolizer>
              </Rule>
          </FeatureTypeStyle>
      </UserStyle>
      </NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/NamedPlaces.sld
  
  Index: NamedPlaces.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0" 
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  	xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xlink="http://www.w3.org/1999/xlink" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  	<NamedLayer><Name>Default Styler</Name>
  	<UserStyle>
  		
  		<Title>Default Styler</Title>
  		<Abstract></Abstract>
  		<FeatureTypeStyle>
  			<FeatureTypeName>Feature</FeatureTypeName>
  			<Rule>
  				<Name>ashton</Name>
  				<Title>Ashton</Title>
  				<ogc:Filter>
  					<ogc:PropertyIsEqualTo>
  						<ogc:PropertyName>NAME</ogc:PropertyName>
  						<ogc:Literal>Ashton</ogc:Literal>
  					</ogc:PropertyIsEqualTo>
  				</ogc:Filter>
  				<PolygonSymbolizer>
  					<Fill>
  						<CssParameter name="fill">
  							<ogc:Literal>#AAAAAA</ogc:Literal>
  						</CssParameter>
  					</Fill>
  					<Stroke>
  						<CssParameter name="stroke">
  							<ogc:Literal>#000000</ogc:Literal>
  						</CssParameter>
  					</Stroke>
  				</PolygonSymbolizer>
  			</Rule>
  			<Rule>
  				<Name>goose_island</Name>
  				<Title>Goose Island</Title>
  				<ogc:Filter>
  					<ogc:PropertyIsEqualTo>
  						<ogc:PropertyName>NAME</ogc:PropertyName>
  						<ogc:Literal>Goose Island</ogc:Literal>
  					</ogc:PropertyIsEqualTo>
  				</ogc:Filter>
  				<PolygonSymbolizer>
  					<Fill>
  						<CssParameter name="fill">
  							<ogc:Literal>#FFFFFF</ogc:Literal>
  						</CssParameter>
  					</Fill>
  					<Stroke>
  						<CssParameter name="stroke">
  							<ogc:Literal>#000000</ogc:Literal>
  						</CssParameter>
  					</Stroke>
  				</PolygonSymbolizer>
  			</Rule>
  		</FeatureTypeStyle>
  	</UserStyle>
  	</NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/capitals.sld
  
  Index: capitals.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0"
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
  	xmlns="http://www.opengis.net/sld"
  	xmlns:ogc="http://www.opengis.net/ogc"
  	xmlns:xlink="http://www.w3.org/1999/xlink"
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  	<NamedLayer>
  		<Name>Default Styler</Name>
  		<UserStyle>
  		<FeatureTypeStyle>
  			<FeatureTypeName>Feature</FeatureTypeName>
  			<Rule>
  				<Name>name</Name>
  				<Title>title</Title>
  				<Abstract>Abstract</Abstract>
  				
  				<PointSymbolizer>
  					<Graphic>
  					<Mark>
  						<WellKnownName>circle</WellKnownName>
  						<Fill>
  							<CssParameter name="fill">
  								<ogc:Literal>#FFFFFF</ogc:Literal>
  							</CssParameter>
  						</Fill>
  						<Stroke>
  							<CssParameter name="stroke">
  								<ogc:Literal>#000000</ogc:Literal>
  							</CssParameter>
  							<CssParameter name="stroke-width">
  								<ogc:Literal>2</ogc:Literal>
  							</CssParameter>
  						</Stroke>
  						</Mark>
  						<Opacity>
  							<ogc:Literal>1.0</ogc:Literal>
  						</Opacity>
  						<Size>
  							<ogc:Literal>6</ogc:Literal>
  						</Size>
  							
  					</Graphic>
  				</PointSymbolizer>
  			</Rule>
  		</FeatureTypeStyle>
  		</UserStyle>
  	</NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/data_bounds_style.sld
  
  Index: data_bounds_style.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0" 
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  	xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xlink="http://www.w3.org/1999/xlink" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <UserStyle>
          <Name>Default Styler</Name>
          <Title>Default Styler</Title>
          <Abstract></Abstract>
          <FeatureTypeStyle>
              <FeatureTypeName>Feature</FeatureTypeName>
              <Rule>
                  <Name>name</Name>
                  <Abstract>Abstract</Abstract>
                  <Title>title</Title>
                  <PolygonSymbolizer>
                      <!--<Fill>
                          <CssParameter name="fill">
                              <ogc:Literal>#00FFFF</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="fill-opacity">
                              <ogc:Literal>0.4</ogc:Literal>
                          </CssParameter>
                      </Fill> -->
                      <Stroke>
                          <CssParameter name="stroke">
                              <ogc:Literal>#ffff00</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-linecap">
                              <ogc:Literal>butt</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-linejoin">
                              <ogc:Literal>miter</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-opacity">
                              <ogc:Literal>1</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-width">
                              <ogc:Literal>1.2</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="stroke-dashoffset">
                              <ogc:Literal>0</ogc:Literal>
                          </CssParameter>
                      </Stroke>
                  </PolygonSymbolizer>
              </Rule>
          </FeatureTypeStyle>
      </UserStyle>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/data_points_style.sld
  
  Index: data_points_style.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0"
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
  	xmlns="http://www.opengis.net/sld"
  	xmlns:ogc="http://www.opengis.net/ogc"
  	xmlns:xlink="http://www.w3.org/1999/xlink"
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  	<UserStyle>
  		<Name>Default Styler</Name>
  		<Title>Default Styler</Title>
  		<Abstract />
  		<FeatureTypeStyle>
  			<FeatureTypeName>Feature</FeatureTypeName>
  			<Rule>
  				<Name>name</Name>
  				<Abstract>Abstract</Abstract>
  				<Title>title</Title>
  				<PointSymbolizer>
  					<Graphic>
  						<Size>
  							<ogc:Literal>5</ogc:Literal>
  						</Size>
  						<Opacity>
  							<ogc:Literal>1.0</ogc:Literal>
  						</Opacity>
  						<Mark>
  							<WellKnownName>
  								<ogc:Literal>circle</ogc:Literal>
  							</WellKnownName>
  							<Fill>
  								<CssParameter name="fill">
  									<ogc:Literal>#000000</ogc:Literal>
  								</CssParameter>
  							</Fill>
  							<Stroke>
  								<CssParameter name="stroke">
  									<ogc:Literal>#FFFFFF</ogc:Literal>
  								</CssParameter>
  								<CssParameter name="stroke-width">
  									<ogc:Literal>1.2</ogc:Literal>
  								</CssParameter>
  							</Stroke>
  						</Mark>
  					</Graphic>
  				</PointSymbolizer>
  			</Rule>
  		</FeatureTypeStyle>
  	</UserStyle>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/default_line.sld
  
  Index: default_line.sld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <StyledLayerDescriptor version="1.0.0" 
  		xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  		xmlns="http://www.opengis.net/sld" 
  		xmlns:ogc="http://www.opengis.net/ogc" 
  		xmlns:xlink="http://www.w3.org/1999/xlink" 
  		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  		<!-- a named layer is the basic building block of an sld document -->
  
  	<NamedLayer>
  		<Name>Default Line</Name>
  		<UserStyle>
  		    <!-- they have names, titles and abstracts -->
  		  
  			<Title>A boring default style</Title>
  			<Abstract>A sample style that just prints out a green line</Abstract>
  			<!-- FeatureTypeStyles describe how to render different features -->
  			<!-- a feature type for lines -->
  
  			<FeatureTypeStyle>
  				<!--FeatureTypeName>Feature</FeatureTypeName-->
  				<Rule>
  					<Name>Rule 1</Name>
  					<Title>Green Line</Title>
  					<Abstract>A green line with a 2 pixel width</Abstract>
  
  					<!-- like a polygonsymbolizer -->
  					<LineSymbolizer>
  						<Stroke>
  							<CssParameter name="stroke">#319738</CssParameter>
  							<CssParameter name="stroke-width">2</CssParameter>
  						</Stroke>
  					</LineSymbolizer>
  				</Rule>
  
  		    </FeatureTypeStyle>
  		</UserStyle>
  	</NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/default_line2.sld
  
  Index: default_line2.sld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <StyledLayerDescriptor version="1.0.0" 
  		xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  		xmlns="http://www.opengis.net/sld" 
  		xmlns:ogc="http://www.opengis.net/ogc" 
  		xmlns:xlink="http://www.w3.org/1999/xlink" 
  		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  		<!-- a named layer is the basic building block of an sld document -->
  
  	<NamedLayer>
  		<Name>Default Line</Name>
  		<UserStyle>
  		    <!-- they have names, titles and abstracts -->
  		  
  			<Title>A boring default style</Title>
  			<Abstract>A sample style that just prints out a green line</Abstract>
  			<!-- FeatureTypeStyles describe how to render different features -->
  			<!-- a feature type for lines -->
  
  			<FeatureTypeStyle>
  				<!--FeatureTypeName>Feature</FeatureTypeName-->
  				<Rule>
  					<Name>Rule 1</Name>
  					<Title>Green Line</Title>
  					<Abstract>A green line with a 2 pixel width</Abstract>
  
  					<!-- like a polygonsymbolizer -->
  					<LineSymbolizer>
  						<Stroke>
  							<CssParameter name="stroke">#319738</CssParameter>
  							<CssParameter name="stroke-width">2</CssParameter>
  						</Stroke>
  					</LineSymbolizer>
  				</Rule>
  
  		    </FeatureTypeStyle>
  		</UserStyle>
  	</NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/default_point.sld
  
  Index: default_point.sld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <StyledLayerDescriptor version="1.0.0" 
  		xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  		xmlns="http://www.opengis.net/sld" 
  		xmlns:ogc="http://www.opengis.net/ogc" 
  		xmlns:xlink="http://www.w3.org/1999/xlink" 
  		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  		<!-- a named layer is the basic building block of an sld document -->
  
  	<NamedLayer>
  		<Name>Default Point</Name>
  		<UserStyle>
  		    <!-- they have names, titles and abstracts -->
  		  
  			<Title>A boring default style</Title>
  			<Abstract>A sample style that just prints out a purple circle</Abstract>
  			<!-- FeatureTypeStyles describe how to render different features -->
  			<!-- a feature type for points -->
  
  			<FeatureTypeStyle>
  				<!--FeatureTypeName>Feature</FeatureTypeName-->
  				<Rule>
  					<Name>Rule 1</Name>
  					<Title>PurpleFill</Title>
  					<Abstract>A purple fill with an 11 pixel size</Abstract>
  
  					<!-- like a linesymbolizer but with a fill too -->
  					<PointSymbolizer>
  						<Graphic>
  							<Mark>
  								<WellKnownName>circle</WellKnownName>
  								<Fill>
  									<CssParameter name="fill">#9F4DC5</CssParameter>
  									<CssParameter name="fill-opacity">1.0</CssParameter>
  								</Fill>
  							</Mark>
  							<Size>6</Size>
  						</Graphic>
  					</PointSymbolizer>
  				</Rule>
  
  		    </FeatureTypeStyle>
  		</UserStyle>
  	</NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/default_polygon.sld
  
  Index: default_polygon.sld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <StyledLayerDescriptor version="1.0.0" 
  		xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  		xmlns="http://www.opengis.net/sld" 
  		xmlns:ogc="http://www.opengis.net/ogc" 
  		xmlns:xlink="http://www.w3.org/1999/xlink" 
  		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  		<!-- a named layer is the basic building block of an sld document -->
  
  	<NamedLayer>
  		<Name>world_borders</Name>
  		<UserStyle>
  		    <!-- they have names, titles and abstracts -->
  		  
  			<Title>A boring default style</Title>
  			<Abstract>A sample style that just prints out a transparent red interior with a red outline</Abstract>
  			<!-- FeatureTypeStyles describe how to render different features -->
  			<!-- a feature type for polygons -->
  
  			<FeatureTypeStyle>
  				<FeatureTypeName>world_borders</FeatureTypeName>
  				<Rule>
  					<Name>Rule 1</Name>
  					<Title>RedFill RedOutline</Title>
  					<Abstract>50% transparent red fill with a red outline 1 pixel in width</Abstract>
  
  					<!-- like a linesymbolizer but with a fill too -->
  					<PolygonSymbolizer>
  						<Fill>
  							<CssParameter name="fill">#A4C3A3</CssParameter>
  							<CssParameter name="fill-opacity">1</CssParameter>
  						</Fill>
  						<Stroke>
  							<CssParameter name="stroke">#555555</CssParameter>
  							<CssParameter name="stroke-width">1</CssParameter>
  						</Stroke>
  					</PolygonSymbolizer>
  				</Rule>
  
  		    </FeatureTypeStyle>
  		</UserStyle>
  	</NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/giant_polygon.sld
  
  Index: giant_polygon.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0" 
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  	xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xlink="http://www.w3.org/1999/xlink" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer> <Name> area landmarks </Name>
      <UserStyle>
          
          
          <FeatureTypeStyle>
              <FeatureTypeName>giant_polygon</FeatureTypeName>
              
  <!-- underlay -->
  
              <Rule>  
  		
   
                  <PolygonSymbolizer>
                      <Fill>
                          <CssParameter name="fill">
                              <ogc:Literal>#DDDDDD</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="fill-opacity">
                              <ogc:Literal>1.0</ogc:Literal>
                          </CssParameter>
                      </Fill>
                      
                  </PolygonSymbolizer>
              </Rule>
              
  
              
          </FeatureTypeStyle>
      </UserStyle>
      </NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/grass_fill.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/grass_poly.sld
  
  Index: grass_poly.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0" 
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  	xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xlink="http://www.w3.org/1999/xlink" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  	<NamedLayer>
  
  		<Name>Grass</Name>
  
  		<UserStyle>
  			<Name>Grass Styler</Name>
  			<Title>Grass Styler</Title>
  			<Abstract></Abstract>
  			<FeatureTypeStyle>
  				<FeatureTypeName>Feature</FeatureTypeName>
  				<Rule>
  					<Name>Grass</Name>
  					<Abstract>Grass style that uses a texture</Abstract>
  
  					<PolygonSymbolizer>
  						<Fill>
  							<GraphicFill>
  								<Graphic>
  									<ExternalGraphic>
  										<OnlineResource xlink:type="simple" xlink:href="grass_fill.png"/>
  										<Format>image/png</Format>
  									</ExternalGraphic>
  									<Opacity>
  										<ogc:Literal>1.0</ogc:Literal>
  									</Opacity>
  									<Size>
  										<ogc:Literal>30</ogc:Literal>
  									</Size>
  									<Rotation>
  										<ogc:Literal>0.5</ogc:Literal>
  									</Rotation>
  								</Graphic>
  							</GraphicFill>
  						</Fill>
  
  						<Stroke>
  							<CssParameter name="stroke">#FF0000</CssParameter>
  							<CssParameter name="stroke-width">1</CssParameter>
  						</Stroke>
  					</PolygonSymbolizer>
  
  				</Rule>
  			</FeatureTypeStyle>
  		</UserStyle>
  
      </NamedLayer>
  
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/green.sld
  
  Index: green.sld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <StyledLayerDescriptor version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- a named layer is the basic building block of an sld document -->
  <NamedLayer>
  <Name>A Test Layer</Name>
  
  <!-- with in a layer you have Named Styles -->
  <UserStyle>
      <!-- again they have names, titles and abstracts -->
    <Name>polyshp</Name>
      <!-- FeatureTypeStyles describe how to render different features -->
      <!-- a feature type for polygons -->
      <FeatureTypeStyle>
        <Rule>
          <!-- like a linesymbolizer but with a fill too -->
          <PolygonSymbolizer>
           <Fill>
              <!-- CssParameters allowed are fill (the color) and fill-opacity -->
              <CssParameter name="fill">#66FF66</CssParameter>
           </Fill>   
              <Stroke/>
                  
          </PolygonSymbolizer>
        </Rule>
      </FeatureTypeStyle>
  </UserStyle>
  </NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/poi.sld
  
  Index: poi.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0" 
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  	xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xlink="http://www.w3.org/1999/xlink" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer> <Name> poi </Name>
      <UserStyle>
          
          
          <FeatureTypeStyle>
  
              
  <!-- all the same -->
  
              <Rule>  
  		
  
  		  <PointSymbolizer>
  		    <Graphic>
  			<Mark>
  			    <WellKnownName>circle</WellKnownName>
  			    <Fill>
  				<CssParameter name="fill">#FF0000</CssParameter>
  				<CssParameter name="fill-opacity">1.0</CssParameter>
  			    </Fill>
  			</Mark>
  			<Size>11</Size>
  		    </Graphic>
  
  		</PointSymbolizer>
  		
  		<PointSymbolizer>
  		    <Graphic>
  			<Mark>
  			    <WellKnownName>circle</WellKnownName>
  			    <Fill>
  				<CssParameter name="fill">#EDE513</CssParameter>
  				<CssParameter name="fill-opacity">1.0</CssParameter>
  			    </Fill>
  			</Mark>
  			<Size>7</Size>
  		    </Graphic>
  		
  		</PointSymbolizer>
           <!--
  		 <TextSymbolizer>
  			    <Label>
  				<ogc:PropertyName>laname</ogc:PropertyName>
  			    </Label>
  				
  			    <Font>
  				<CssParameter name="font-family">Arial</CssParameter>
  				<CssParameter name="font-style">Normal</CssParameter>
  				<CssParameter name="font-size">14</CssParameter>
  			    </Font>
  			    <Fill>
  				<CssParameter name="fill">#000000</CssParameter>
  			    </Fill>
                  </TextSymbolizer>
             -->
                 
              </Rule>
              
  
              
              
          </FeatureTypeStyle>
      </UserStyle>
      </NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/poly_landmarks.sld
  
  Index: poly_landmarks.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0" 
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  	xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xlink="http://www.w3.org/1999/xlink" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer> <Name> area landmarks </Name>
      <UserStyle>
          
          
          <FeatureTypeStyle>
              <FeatureTypeName>Feature</FeatureTypeName>
              
  <!-- park and green spaces -->
  
              <Rule>  
  		<ogc:Filter>
  		<ogc:Or>
  		<ogc:Or>
  		<ogc:Or>
  			<ogc:PropertyIsEqualTo>
  				<ogc:PropertyName>CFCC</ogc:PropertyName>
  				<ogc:Literal>D82</ogc:Literal>
  			</ogc:PropertyIsEqualTo>
  			<ogc:PropertyIsEqualTo>
  				<ogc:PropertyName>CFCC</ogc:PropertyName>
  				<ogc:Literal>D83</ogc:Literal>
  			</ogc:PropertyIsEqualTo>
  		</ogc:Or>
  			<ogc:PropertyIsEqualTo>
  				<ogc:PropertyName>CFCC</ogc:PropertyName>
  				<ogc:Literal>D84</ogc:Literal>
  			</ogc:PropertyIsEqualTo>
  		</ogc:Or>
  			<ogc:PropertyIsEqualTo>
  				<ogc:PropertyName>CFCC</ogc:PropertyName>
  				<ogc:Literal>D85</ogc:Literal>
  			</ogc:PropertyIsEqualTo>
  		</ogc:Or>
  		</ogc:Filter>
   
                  <PolygonSymbolizer>
                      <Fill>
                          <CssParameter name="fill">
                              <ogc:Literal>#B4DFB4</ogc:Literal>
                          </CssParameter>
                          <CssParameter name="fill-opacity">
                              <ogc:Literal>1.0</ogc:Literal>
                          </CssParameter>
                      </Fill>
                      <Stroke>
                          <CssParameter name="stroke">
                              <ogc:Literal>#88B588</ogc:Literal>
                          </CssParameter>
                      </Stroke>
                  </PolygonSymbolizer>
              </Rule>
              
  <!-- water -->            
               <Rule>
  	    		<ogc:Filter>
  	    		<ogc:Or>
  	    		<ogc:Or>
  	    		<ogc:Or>
  	    			<ogc:PropertyIsEqualTo>
  	    				<ogc:PropertyName>CFCC</ogc:PropertyName>
  	    				<ogc:Literal>H11</ogc:Literal>
  	    			</ogc:PropertyIsEqualTo>
  	    			<ogc:PropertyIsEqualTo>
  	    				<ogc:PropertyName>CFCC</ogc:PropertyName>
  	    				<ogc:Literal>H31</ogc:Literal>
  	    			</ogc:PropertyIsEqualTo>
  	    		</ogc:Or>
  	    			<ogc:PropertyIsEqualTo>
  	    				<ogc:PropertyName>CFCC</ogc:PropertyName>
  	    				<ogc:Literal>H41</ogc:Literal>
  	    			</ogc:PropertyIsEqualTo>
  	    		</ogc:Or>
  	    			<ogc:PropertyIsEqualTo>
  	    				<ogc:PropertyName>CFCC</ogc:PropertyName>
  	    				<ogc:Literal>H51</ogc:Literal>
  	    			</ogc:PropertyIsEqualTo>
  	    		</ogc:Or>
  	    		</ogc:Filter>
  	     
  	                    <PolygonSymbolizer>
  	                        <Fill>
  	                            <CssParameter name="fill">
  	                                <ogc:Literal>#8AA9D1</ogc:Literal>
  	                            </CssParameter>
  	                            <CssParameter name="fill-opacity">
  	                                <ogc:Literal>1.0</ogc:Literal>
  	                            </CssParameter>
  	                        </Fill>
  	                        <Stroke>
  	                            <CssParameter name="stroke">
  	                                <ogc:Literal>#436C91</ogc:Literal>
  	                            </CssParameter>
  	                            
  	    
  	                        </Stroke>
  	                    </PolygonSymbolizer>
              </Rule>
              
      <!-- URBAN	 -->            
  		 <Rule>
  			<ogc:Filter>
  			<ogc:Or>
  			<ogc:Or>
  			<ogc:Or>
  			<ogc:Or>
  			<ogc:Or>
  				<ogc:PropertyIsEqualTo>
  					<ogc:PropertyName>CFCC</ogc:PropertyName>
  					<ogc:Literal>D31</ogc:Literal>
  				</ogc:PropertyIsEqualTo>
  				<ogc:PropertyIsEqualTo>
  					<ogc:PropertyName>CFCC</ogc:PropertyName>
  					<ogc:Literal>D43</ogc:Literal>
  				</ogc:PropertyIsEqualTo>
  			</ogc:Or>
  				<ogc:PropertyIsEqualTo>
  					<ogc:PropertyName>CFCC</ogc:PropertyName>
  					<ogc:Literal>D64</ogc:Literal>
  				</ogc:PropertyIsEqualTo>
  			</ogc:Or>
  				<ogc:PropertyIsEqualTo>
  					<ogc:PropertyName>CFCC</ogc:PropertyName>
  					<ogc:Literal>D65</ogc:Literal>
  				</ogc:PropertyIsEqualTo>
  			</ogc:Or>
  				<ogc:PropertyIsEqualTo>
  				<ogc:PropertyName>CFCC</ogc:PropertyName>
  				<ogc:Literal>D90</ogc:Literal>
  			</ogc:PropertyIsEqualTo>
  			</ogc:Or>
  				<ogc:PropertyIsEqualTo>
  					<ogc:PropertyName>CFCC</ogc:PropertyName>
  					<ogc:Literal>E23</ogc:Literal>
  				</ogc:PropertyIsEqualTo>
  			</ogc:Or>
  			</ogc:Filter>
  
  			    <PolygonSymbolizer>
  				<Fill>
  				    <CssParameter name="fill">
  					<ogc:Literal>#A5A5A5</ogc:Literal>
  				    </CssParameter>
  				    <CssParameter name="fill-opacity">
  					<ogc:Literal>1.0</ogc:Literal>
  				    </CssParameter>
  				</Fill>
  				<Stroke>
  				    <CssParameter name="stroke">
  					<ogc:Literal>#6E6E6E</ogc:Literal>
  				    </CssParameter>
  
  
  				</Stroke>
  			    </PolygonSymbolizer>
      </Rule>
      
  <!-- label -->     
      <Rule>
      	<TextSymbolizer>
  		    <Label>
  			<ogc:PropertyName>LANAME</ogc:PropertyName>
  		    </Label>
  
  		    <Font>
  			<CssParameter name="font-family">Times New Roman</CssParameter>
  			<CssParameter name="font-style">Normal</CssParameter>
  			<CssParameter name="font-size">14</CssParameter>
  			<CssParameter name="font-weight">bold</CssParameter>
  		    </Font>
  		    
  		    <Halo>
  		    
  			    <Radius>
  			   	 <ogc:Literal>1</ogc:Literal>
  			    </Radius>
  			    <Fill>
  			    	<CssParameter name="fill">#FDE5A5</CssParameter>
  			    	<CssParameter name="fill-opacity">0.75</CssParameter>
  			    </Fill>
  			    
  		    </Halo>
  		    <Fill>
  			<CssParameter name="fill">#000000</CssParameter>
  		    </Fill>
  	</TextSymbolizer>
      </Rule>
              
              
          </FeatureTypeStyle>
      </UserStyle>
      </NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/popshade.sld
  
  Index: popshade.sld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <StyledLayerDescriptor version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- a named layer is the basic building block of an sld document -->
  <NamedLayer>
  <Name>A Test Layer</Name>
  
  <!-- with in a layer you have Named Styles -->
  <UserStyle>
      <!-- again they have names, titles and abstracts -->
    <Name>population</Name>
    <Title>Population in the United States</Title>
    <Abstract>A sample filter that filters the United States into three 
              categories of population, drawn in different colors</Abstract>
      <FeatureTypeStyle>
        <Rule>
          <!-- like a linesymbolizer but with a fill too -->
          <ogc:Filter xmlns:gml="http://www.opengis.net/gml">
            <ogc:PropertyIsBetween>
              <ogc:PropertyName>PERSONS</ogc:PropertyName>
              <ogc:LowerBoundary>
                <ogc:Literal>2000000</ogc:Literal>
              </ogc:LowerBoundary>
              <ogc:UpperBoundary>
                <ogc:Literal>4000000</ogc:Literal>
              </ogc:UpperBoundary>
            </ogc:PropertyIsBetween>
          </ogc:Filter>
          <PolygonSymbolizer>
             <Fill>
                <!-- CssParameters allowed are fill (the color) and fill-opacity -->
                <CssParameter name="fill">#FF0000</CssParameter>
             </Fill>     
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <!-- like a linesymbolizer but with a fill too -->
          <ogc:Filter xmlns:gml="http://www.opengis.net/gml">
            <ogc:PropertyIsLessThan>
             <ogc:PropertyName>PERSONS</ogc:PropertyName>
             <ogc:Literal>2000000</ogc:Literal>
            </ogc:PropertyIsLessThan>
          </ogc:Filter>
          <PolygonSymbolizer>
             <Fill>
                <!-- CssParameters allowed are fill (the color) and fill-opacity -->
                <CssParameter name="fill">#00FF00</CssParameter>
             </Fill>     
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <!-- like a linesymbolizer but with a fill too -->
          <ogc:Filter xmlns:gml="http://www.opengis.net/gml">
            <ogc:PropertyIsGreaterThan>
             <ogc:PropertyName>PERSONS</ogc:PropertyName>
             <ogc:Literal>4000000</ogc:Literal>
            </ogc:PropertyIsGreaterThan>
          </ogc:Filter>
          <PolygonSymbolizer>
             <Fill>
                <!-- CssParameters allowed are fill (the color) and fill-opacity -->
                <CssParameter name="fill">#0000FF</CssParameter>
             </Fill>     
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <LineSymbolizer>
             <Stroke/>    
          </LineSymbolizer>
        </Rule>
      </FeatureTypeStyle>
  </UserStyle>
  </NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/simpleRoads.sld
  
  Index: simpleRoads.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0"
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
  	xmlns="http://www.opengis.net/sld"
  	xmlns:ogc="http://www.opengis.net/ogc"
  	xmlns:xlink="http://www.w3.org/1999/xlink"
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  	<NamedLayer><Name>Simple Roads</Name>
  	<UserStyle>
  		
  		<Title>Default Styler for simple road segments</Title>
  		<Abstract></Abstract>
  		<FeatureTypeStyle>
  			<FeatureTypeName>Feature</FeatureTypeName>
  			<Rule>
  				<Name>simple roads</Name>
  				<Title>Simple road segments</Title>
  				<LineSymbolizer>
  					<Stroke>
  						<CssParameter name="stroke">
  							<ogc:Literal>#AA3333</ogc:Literal>
  						</CssParameter>
  						<CssParameter name="stroke-width">
  							<ogc:Literal>2</ogc:Literal>
  						</CssParameter>
  					</Stroke>
  				</LineSymbolizer>
  			</Rule>
  		</FeatureTypeStyle>
  	</UserStyle>
  	</NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/styles/tiger_roads.sld
  
  Index: tiger_roads.sld
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <StyledLayerDescriptor version="1.0.0" 
  	xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
  	xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xlink="http://www.w3.org/1999/xlink" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer> <Name> area landmarks </Name>
      <UserStyle>
          
          
           <FeatureTypeStyle>
              <FeatureTypeName>Feature</FeatureTypeName>
              <Rule>  
  	               <MaxScaleDenominator>32000</MaxScaleDenominator>
  	    		   <LineSymbolizer>
  	    		       <Stroke>
  	    				<CssParameter name="stroke">
  	    					<ogc:Literal>#666666</ogc:Literal>
  	    				</CssParameter>
  	    				<CssParameter name="stroke-width">
  	    					<ogc:Literal>7</ogc:Literal>
  	    				</CssParameter>
  	    			</Stroke>
  	    		   </LineSymbolizer>
  	    	     
              </Rule>
           </FeatureTypeStyle>   
          <FeatureTypeStyle>
              <FeatureTypeName>Feature</FeatureTypeName>
              
  
  
              <Rule>  
  	                    <MaxScaleDenominator>32000</MaxScaleDenominator>
  	                   <LineSymbolizer>
  	    		       <Stroke>
  	    				<CssParameter name="stroke">
  	    					<ogc:Literal>#FFFFFF</ogc:Literal>
  	    				</CssParameter>
  	    				<CssParameter name="stroke-width">
  	    					<ogc:Literal>4</ogc:Literal>
  	    				</CssParameter>
  	    			</Stroke>
  	                   </LineSymbolizer>
  	     
              </Rule> 
              
  	     
             
              
  
      
  <!-- label -->     
      <Rule>
          <MaxScaleDenominator>32000</MaxScaleDenominator>
      	<TextSymbolizer>
  		    <Label>
  			<ogc:PropertyName>NAME</ogc:PropertyName>
  		    </Label>
  
  		    <Font>
  			<CssParameter name="font-family">Times New Roman</CssParameter>
  			<CssParameter name="font-style">Normal</CssParameter>
  			<CssParameter name="font-size">14</CssParameter>
  			<CssParameter name="font-weight">bold</CssParameter>
  		    </Font>
  		    
  		    <Halo>
  
  			    <Radius>
  				 <ogc:Literal>2</ogc:Literal>
  			    </Radius>
  			    <Fill>
  				<CssParameter name="fill">#FFFFFF</CssParameter>
  				<CssParameter name="fill-opacity">0.85</CssParameter>				
  			    </Fill>
  		    			    
  		    </Halo>
  		    
  		    <Fill>
  			<CssParameter name="fill">#000000</CssParameter>
  		    </Fill>
  			<VendorOption name="group">yes</VendorOption>
  	</TextSymbolizer>
      </Rule>
              
              
          </FeatureTypeStyle>
      </UserStyle>
      </NamedLayer>
  </StyledLayerDescriptor>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/validation/FeatureCheck.xml
  
  Index: FeatureCheck.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <suite xmlns="testSuiteSchema" 
  	xmlns:gml="http://www.opengis.net/gml" 
  	xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  	xs:schemaLocation="testSuiteSchema /data/capabilities/validate/testSuiteSchema.xsd">
  	<name>IntegrityCheck</name>
  	<description>Integrity Check Description</description>
  	<test>
  		<name>Attr Check</name>
  		<description>Checks all id's are non null, non zero values.</description>
  		<plugin>Null Zero</plugin>
  		<argument >
  			<name>attributeName</name>
  			<string>id</string>
  		</argument>
  		<argument >
  			<name>typeRef</name>
  			<string>*</string>
  		</argument>
  	</test>
  	<test>
  		<name>BC Roads Length</name>
  		<description>Checks that road lengths are non zero.</description>
  		<plugin>Null Zero</plugin>
  		<argument >
  			<name>attributeName</name>
  			<string>LENGTH</string>
  		</argument>
  		<argument >
  			<name>typeRef</name>
  			<string>bc_shapefile:bc_roads</string>
  		</argument>
  	</test>	
  	<test>
  		<name>Attr Check</name>
  		<description>Checks all pointProperty's are non null.</description>
  		<plugin>Null Zero</plugin>
  		<argument >
  			<name>attributeName</name>
  			<string>pointProperty</string>
  		</argument>
  		<argument >
  			<name>typeRef</name>
  			<string>*</string>
  		</argument>
  	</test>
  </suite>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/data/validation/IntegrityCheck.xml
  
  Index: IntegrityCheck.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <suite xmlns="testSuiteSchema" 
  	xmlns:gml="http://www.opengis.net/gml" 
  	xmlns:ogc="http://www.opengis.net/ogc" 
  	xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
  	xs:schemaLocation="testSuiteSchema /data/capabilities/validate/testSuiteSchema.xsd">
  	<name>IntegrityCheck</name>
  	<description>Integrity Check Description</description>
  	<test>
  		<name>FID Uniqueness</name>
  		<description>Checks all Features for ID Uniqueness</description>
  		<plugin>FID Uniqueness</plugin>
  		<argument >
  			<name>attributeName</name>
  			<string>id</string>
  		</argument>
  		<argument >
  			<name>typeRef</name>
  			<string>*</string>
  		</argument>
  	</test>
  	<test>
  		<name>Is Valid Geometry</name>
  		<description>Is Valid Geometry</description>
  		<plugin>Is Valid Geometry</plugin>
  		<argument >
  			<name>typeRef</name>
  			<string>*</string>
  		</argument>
  	</test>
  </suite>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/filter/1.0.0/expr.xsd
  
  Index: expr.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema
     targetNamespace="http://www.opengis.net/ogc"
     xmlns:ogc="http://www.opengis.net/ogc"
     xmlns:gml="http://www.opengis.net/gml"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="qualified">
  
    <xsd:element name="Add"
                 type="ogc:BinaryOperatorType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Sub"
                 type="ogc:BinaryOperatorType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Mul"
                 type="ogc:BinaryOperatorType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Div"
                 type="ogc:BinaryOperatorType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="PropertyName"
                 type="ogc:PropertyNameType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Function"
                 type="ogc:FunctionType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Literal"
                 type="ogc:LiteralType"
                 substitutionGroup="ogc:expression"/>
  
    <xsd:element name="expression" type="ogc:ExpressionType" abstract="true"/>
  
    <xsd:complexType name="ExpressionType" abstract="true"/>
    <xsd:complexType name="BinaryOperatorType">
      <xsd:complexContent>
        <xsd:extension base="ogc:ExpressionType">
          <xsd:sequence>
            <xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
          </xsd:sequence>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="FunctionType">
      <xsd:complexContent>
        <xsd:extension base="ogc:ExpressionType">
          <xsd:sequence>
            <xsd:element ref="ogc:expression"
                         minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
          <xsd:attribute name="name" type="xsd:string" use="required"/>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="LiteralType">
      <xsd:complexContent mixed="true">
        <xsd:extension base="ogc:ExpressionType">
          <xsd:sequence>
            <xsd:any minOccurs="0"/>
          </xsd:sequence>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="PropertyNameType">
      <xsd:complexContent mixed="true">
        <xsd:extension base="ogc:ExpressionType"/>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/filter/1.0.0/filter.xsd
  
  Index: filter.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema targetNamespace="http://www.opengis.net/ogc" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  	<xsd:include schemaLocation="expr.xsd"/>
  	<xsd:import namespace="http://www.opengis.net/gml" schemaLocation="../../gml/2.1.2/geometry.xsd"/>
  	<!-- ============================================= -->
  	<!-- FILTER EXPRESSION                             -->
  	<!-- ============================================= -->
  	<xsd:element name="FeatureId" type="ogc:FeatureIdType"/>
  	<xsd:element name="Filter" type="ogc:FilterType"/>
  	<!-- ============================================= -->
  	<!-- COMPARISON OPERATORS                          -->
  	<!-- ============================================= -->
  	<xsd:element name="comparisonOps" type="ogc:ComparisonOpsType" abstract="true"/>
  	<xsd:element name="PropertyIsEqualTo" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsNotEqualTo" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsLessThan" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsGreaterThan" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsLessThanOrEqualTo" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsGreaterThanOrEqualTo" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsLike" type="ogc:PropertyIsLikeType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsNull" type="ogc:PropertyIsNullType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsBetween" type="ogc:PropertyIsBetweenType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:complexType name="ComparisonOpsType" abstract="true"/>
  	<!-- ============================================= -->
  	<!-- SPATIAL OPERATORS (sec 3.2.19.2 99-049)       -->
  	<!-- ============================================= -->
  	<xsd:element name="spatialOps" type="ogc:SpatialOpsType" abstract="true"/>
  	<xsd:element name="Equals" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Disjoint" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Touches" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Within" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Overlaps" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Crosses" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Intersects" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Contains" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<!-- These operatons are from sec 4.2 of OpenGIS Catalog Interface -->
  	<xsd:element name="DWithin" type="ogc:DistanceBufferType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Beyond" type="ogc:DistanceBufferType" substitutionGroup="ogc:spatialOps"/>
  	<!-- This is a convenience operator to allow simple BBOX queries -->
  	<xsd:element name="BBOX" type="ogc:BBOXType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:complexType name="SpatialOpsType" abstract="true"/>
  	<!-- ============================================= -->
  	<!-- LOGICAL OPERATORS                             -->
  	<!-- ============================================= -->
  	<xsd:element name="logicOps" type="ogc:LogicOpsType" abstract="true"/>
  	<xsd:element name="And" type="ogc:BinaryLogicOpType" substitutionGroup="ogc:logicOps"/>
  	<xsd:element name="Or" type="ogc:BinaryLogicOpType" substitutionGroup="ogc:logicOps"/>
  	<xsd:element name="Not" type="ogc:UnaryLogicOpType" substitutionGroup="ogc:logicOps"/>
  	<xsd:complexType name="LogicOpsType" abstract="true"/>
  	<!-- ============================================= -->
  	<!-- COMPLEX TYPES                                 -->
  	<!-- ============================================= -->
  	<xsd:complexType name="FilterType">
  		<xsd:choice>
  			<xsd:element ref="ogc:spatialOps"/>
  			<xsd:element ref="ogc:comparisonOps"/>
  			<xsd:element ref="ogc:logicOps"/>
  			<xsd:element ref="ogc:FeatureId" maxOccurs="unbounded"/>
  		</xsd:choice>
  	</xsd:complexType>
  	<xsd:complexType name="FeatureIdType">
  		<xsd:attribute name="fid" type="xsd:anyURI" use="required"/>
  	</xsd:complexType>
  	<xsd:complexType name="BinaryComparisonOpType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:ComparisonOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="PropertyIsLikeType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:ComparisonOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:element ref="ogc:Literal"/>
  				</xsd:sequence>
  				<xsd:attribute name="wildCard" type="xsd:string" use="required"/>
  				<xsd:attribute name="singleChar" type="xsd:string" use="required"/>
  				<xsd:attribute name="escape" type="xsd:string" use="required"/>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="PropertyIsNullType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:ComparisonOpsType">
  				<xsd:choice>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:element ref="ogc:Literal"/>
  				</xsd:choice>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="PropertyIsBetweenType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:ComparisonOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:expression"/>
  					<xsd:element name="LowerBoundary" type="ogc:LowerBoundaryType"/>
  					<xsd:element name="UpperBoundary" type="ogc:UpperBoundaryType"/>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="LowerBoundaryType">
  		<xsd:choice>
  			<xsd:element ref="ogc:expression"/>
  		</xsd:choice>
  	</xsd:complexType>
  	<xsd:complexType name="UpperBoundaryType">
  		<xsd:sequence>
  			<xsd:element ref="ogc:expression"/>
  		</xsd:sequence>
  	</xsd:complexType>
  	<xsd:complexType name="BinarySpatialOpType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:SpatialOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:choice>
  						<xsd:element ref="gml:_Geometry"/>
  						<xsd:element ref="gml:Box"/>
  					</xsd:choice>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="BBOXType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:SpatialOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:element ref="gml:Box"/>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="DistanceBufferType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:SpatialOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:element ref="gml:_Geometry"/>
  					<xsd:element name="Distance" type="ogc:DistanceType"/>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="DistanceType" mixed="true">
  		<xsd:attribute name="units" type="xsd:string" use="required"/>
  	</xsd:complexType>
  	<xsd:complexType name="BinaryLogicOpType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:LogicOpsType">
  				<xsd:choice minOccurs="2" maxOccurs="unbounded">
  					<xsd:element ref="ogc:comparisonOps"/>
  					<xsd:element ref="ogc:spatialOps"/>
  					<xsd:element ref="ogc:logicOps"/>
  				</xsd:choice>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="UnaryLogicOpType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:LogicOpsType">
  				<xsd:sequence>
  					<xsd:choice>
  						<xsd:element ref="ogc:comparisonOps"/>
  						<xsd:element ref="ogc:spatialOps"/>
  						<xsd:element ref="ogc:logicOps"/>
  					</xsd:choice>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/filter/1.0.0/filterCapabilities.xsd
  
  Index: filterCapabilities.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema
     targetNamespace="http://www.opengis.net/ogc"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:ogc="http://www.opengis.net/ogc"
     elementFormDefault="qualified">
  
     <xsd:complexType name="Arithmetic_OperatorsType">
        <xsd:choice maxOccurs="unbounded">
           <xsd:element ref="ogc:Simple_Arithmetic"/>
           <xsd:element name="Functions" type="ogc:FunctionsType"/>
        </xsd:choice>
     </xsd:complexType>
     <xsd:element name="BBOX">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Between">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Beyond">
        <xsd:complexType/>
     </xsd:element>
     <xsd:complexType name="Comparison_OperatorsType">
        <xsd:choice maxOccurs="unbounded">
           <xsd:element ref="ogc:Simple_Comparisons"/>
           <xsd:element ref="ogc:Like"/>
           <xsd:element ref="ogc:Between"/>
           <xsd:element ref="ogc:NullCheck"/>
        </xsd:choice>
     </xsd:complexType>
     <xsd:element name="Contains">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Crosses">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Disjoint">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="DWithin">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Equals">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Filter_Capabilities">
        <xsd:complexType>
           <xsd:sequence>
              <xsd:element name="Spatial_Capabilities"
                           type="ogc:Spatial_CapabilitiesType"/>
              <xsd:element name="Scalar_Capabilities"
                           type="ogc:Scalar_CapabilitiesType"/>
           </xsd:sequence>
        </xsd:complexType>
     </xsd:element>
     <xsd:complexType name="Function_NameType">
        <xsd:simpleContent>
           <xsd:extension base="xsd:string">
              <xsd:attribute name="nArgs" type="xsd:string" use="required"/>
           </xsd:extension>
        </xsd:simpleContent>
     </xsd:complexType>
     <xsd:complexType name="Function_NamesType">
        <xsd:sequence maxOccurs="unbounded">
           <xsd:element name="Function_Name" type="ogc:Function_NameType"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="FunctionsType">
        <xsd:sequence>
           <xsd:element name="Function_Names" type="ogc:Function_NamesType"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:element name="Intersect">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Like">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Logical_Operators">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="NullCheck">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Overlaps">
        <xsd:complexType/>
     </xsd:element>
     <xsd:complexType name="Scalar_CapabilitiesType">
        <xsd:choice maxOccurs="unbounded">
           <xsd:element ref="ogc:Logical_Operators"/>
           <xsd:element name="Comparison_Operators"
                        type="ogc:Comparison_OperatorsType"/>
           <xsd:element name="Arithmetic_Operators"
                        type="ogc:Arithmetic_OperatorsType"/>
        </xsd:choice>
     </xsd:complexType>
     <xsd:element name="Simple_Arithmetic">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Simple_Comparisons">
        <xsd:complexType/>
     </xsd:element>
     <xsd:complexType name="Spatial_CapabilitiesType">
        <xsd:sequence>
           <xsd:element name="Spatial_Operators"
                        type="ogc:Spatial_OperatorsType"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="Spatial_OperatorsType">
        <xsd:choice maxOccurs="unbounded">
           <xsd:element ref="ogc:BBOX"/>
           <xsd:element ref="ogc:Equals"/>
           <xsd:element ref="ogc:Disjoint"/>
           <xsd:element ref="ogc:Intersect"/>
           <xsd:element ref="ogc:Touches"/>
           <xsd:element ref="ogc:Crosses"/>
           <xsd:element ref="ogc:Within"/>
           <xsd:element ref="ogc:Contains"/>
           <xsd:element ref="ogc:Overlaps"/>
           <xsd:element ref="ogc:Beyond"/>
           <xsd:element ref="ogc:DWithin"/>
        </xsd:choice>
     </xsd:complexType>
     <xsd:element name="Touches">
        <xsd:complexType/>
     </xsd:element>
     <xsd:element name="Within">
        <xsd:complexType/>
     </xsd:element>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/gml/2.1.2/feature.xsd
  
  Index: feature.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="2.1.2">
    <annotation>
      <appinfo>feature.xsd v2.1.2 2002-07</appinfo>
      <documentation xml:lang="en">
        GML Feature schema. Copyright (c) 2002 OGC, All Rights Reserved.
      </documentation>
    </annotation>
    <!-- include constructs from the GML Geometry schema -->
    <include schemaLocation="geometry.xsd"/>
    <!-- bring in the XLink namespace -->
   <import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlinks.xsd"/>
  
    
    <!-- ==============================================================
         global declarations
    =================================================================== -->
    <element name="_Feature" type="gml:AbstractFeatureType" abstract="true"/>
    <element name="_FeatureCollection" type="gml:AbstractFeatureCollectionType" abstract="true" substitutionGroup="gml:_Feature"/>
    <element name="featureMember" type="gml:FeatureAssociationType"/>
    <!-- some basic geometric properties of features -->
    <element name="_geometryProperty" type="gml:GeometryAssociationType" abstract="true"/>
    <element name="geometryProperty" type="gml:GeometryAssociationType"/>
    <element name="boundedBy" type="gml:BoundingShapeType"/>
    <element name="pointProperty" type="gml:PointPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="polygonProperty" type="gml:PolygonPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="lineStringProperty" type="gml:LineStringPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="multiPointProperty" type="gml:MultiPointPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="multiLineStringProperty" type="gml:MultiLineStringPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="multiPolygonProperty" type="gml:MultiPolygonPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="multiGeometryProperty" type="gml:MultiGeometryPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <!-- common aliases for geometry properties -->
    <element name="location" type="gml:PointPropertyType" substitutionGroup="gml:pointProperty"/>
    <element name="centerOf" type="gml:PointPropertyType" substitutionGroup="gml:pointProperty"/>
    <element name="position" type="gml:PointPropertyType" substitutionGroup="gml:pointProperty"/>
    <element name="extentOf" type="gml:PolygonPropertyType" substitutionGroup="gml:polygonProperty"/>
    <element name="coverage" type="gml:PolygonPropertyType" substitutionGroup="gml:polygonProperty"/>
    <element name="edgeOf" type="gml:LineStringPropertyType" substitutionGroup="gml:lineStringProperty"/>
    <element name="centerLineOf" type="gml:LineStringPropertyType" substitutionGroup="gml:lineStringProperty"/>
    <element name="multiLocation" type="gml:MultiPointPropertyType" substitutionGroup="gml:multiPointProperty"/>
    <element name="multiCenterOf" type="gml:MultiPointPropertyType" substitutionGroup="gml:multiPointProperty"/>
    <element name="multiPosition" type="gml:MultiPointPropertyType" substitutionGroup="gml:multiPointProperty"/>
    <element name="multiCenterLineOf" type="gml:MultiLineStringPropertyType" substitutionGroup="gml:multiLineStringProperty"/>
    <element name="multiEdgeOf" type="gml:MultiLineStringPropertyType" substitutionGroup="gml:multiLineStringProperty"/>
    <element name="multiCoverage" type="gml:MultiPolygonPropertyType" substitutionGroup="gml:multiPolygonProperty"/>
    <element name="multiExtentOf" type="gml:MultiPolygonPropertyType" substitutionGroup="gml:multiPolygonProperty"/>
    <!-- common feature descriptors -->
    <element name="description" type="string"/>
    <element name="name" type="string"/>
    <!-- ==============================================================
         abstract supertypes
    =================================================================== -->
    <complexType name="AbstractFeatureType" abstract="true">
      <annotation>
        <documentation>
          An abstract feature provides a set of common properties. A concrete 
          feature type must derive from this type and specify additional 
          properties in an application schema. A feature may optionally 
          possess an identifying attribute ('fid').
        </documentation>
      </annotation>
      <sequence>
        <element ref="gml:description" minOccurs="0"/>
        <element ref="gml:name" minOccurs="0"/>
        <element ref="gml:boundedBy" minOccurs="0"/>
        <!-- additional properties must be specified in an application schema -->
      </sequence>
      <attribute name="fid" type="ID" use="optional"/>
    </complexType>
    <complexType name="AbstractFeatureCollectionBaseType" abstract="true">
      <annotation>
        <documentation>
          This abstract base type just makes the boundedBy element mandatory 
          for a feature collection.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:AbstractFeatureType">
          <sequence>
            <element ref="gml:description" minOccurs="0"/>
            <element ref="gml:name" minOccurs="0"/>
            <element ref="gml:boundedBy"/>
          </sequence>
          <attribute name="fid" type="ID" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="AbstractFeatureCollectionType" abstract="true">
      <annotation>
        <documentation>
          A feature collection contains zero or more featureMember elements.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractFeatureCollectionBaseType">
          <sequence>
            <element ref="gml:featureMember" minOccurs="0" maxOccurs="unbounded"/>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="GeometryPropertyType">
  		<annotation>
  			<documentation>
          A simple geometry property encapsulates a geometry element.
          Alternatively, it can function as a pointer (simple-type link) 
          that refers to a remote geometry element.
        </documentation>
  		</annotation>
  		<sequence minOccurs="0">
  			<element ref="gml:_Geometry"/>
  		</sequence>
  		<attributeGroup ref="xlink:simpleLink"/>
               <attribute ref="gml:remoteSchema" use="optional"/>
    </complexType>
    <complexType name="FeatureAssociationType">
      <annotation>
        <documentation>
          An instance of this type (e.g. a featureMember) can either 
          enclose or point to a feature (or feature collection); this 
          type can be restricted in an application schema to allow only 
          specified features as valid participants in the association. 
          When serving as a simple link that references a remote feature 
          instance, the value of the gml:remoteSchema attribute can be 
          used to locate a schema fragment that constrains the target 
          instance.
        </documentation>
      </annotation>
      <sequence minOccurs="0">
        <element ref="gml:_Feature"/>
      </sequence>
      <attributeGroup ref="xlink:simpleLink"/>
      <attribute ref="gml:remoteSchema" use="optional"/>
    </complexType>
    <complexType name="BoundingShapeType">
      <annotation>
        <documentation>
          Bounding shapes--a Box or a null element are currently allowed.
        </documentation>
      </annotation>
      <sequence>
        <choice>
          <element ref="gml:Box"/>
          <element name="null" type="gml:NullType"/>
        </choice>
      </sequence>
    </complexType>
    <!-- ==============================================================
         geometry properties
    =================================================================== -->
    <complexType name="PointPropertyType">
      <annotation>
        <documentation>
          Encapsulates a single point to represent position, location, or 
          centerOf properties.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:Point"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="PolygonPropertyType">
      <annotation>
        <documentation>
          Encapsulates a single polygon to represent coverage or extentOf 
          properties.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:Polygon"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="LineStringPropertyType">
      <annotation>
        <documentation>
          Encapsulates a single LineString to represent centerLineOf or 
          edgeOf properties.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:LineString"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiPointPropertyType">
      <annotation>
        <documentation>
          Encapsulates a MultiPoint element to represent the following 
          discontiguous geometric properties: multiLocation, multiPosition, 
          multiCenterOf.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:MultiPoint"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiLineStringPropertyType">
      <annotation>
        <documentation>
          Encapsulates a MultiLineString element to represent the following 
          discontiguous geometric properties: multiEdgeOf, multiCenterLineOf.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:MultiLineString"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiPolygonPropertyType">
      <annotation>
        <documentation>
          Encapsulates a MultiPolygon to represent the following discontiguous 
          geometric properties: multiCoverage, multiExtentOf.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:MultiPolygon"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiGeometryPropertyType">
      <annotation>
        <documentation>Encapsulates a MultiGeometry element.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:MultiGeometry"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <simpleType name="NullType">
      <annotation>
        <documentation>
          If a bounding shape is not provided for a feature collection, 
          explain why. Allowable values are:
          innapplicable - the features do not have geometry
          unknown - the boundingBox cannot be computed
          unavailable - there may be a boundingBox but it is not divulged
          missing - there are no features
        </documentation>
      </annotation>
      <restriction base="string">
        <enumeration value="inapplicable"/>
        <enumeration value="unknown"/>
        <enumeration value="unavailable"/>
        <enumeration value="missing"/>
      </restriction>
    </simpleType>
  </schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/gml/2.1.2/geometry.xsd
  
  Index: geometry.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="2.1.2">
    <annotation>
      <appinfo>geometry.xsd v2.1.2 2002-07</appinfo>
      <documentation xml:lang="en">
        GML Geometry schema. Copyright (c) 2001,2002 OGC, All Rights Reserved.
      </documentation>
    </annotation>
    <!-- bring in the XLink attributes -->
    <import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlinks.xsd"/>
    <!-- ==============================================================
         global declarations
    =================================================================== -->
    <element name="_Geometry" type="gml:AbstractGeometryType" abstract="true"/>
    <element name="_GeometryCollection" type="gml:GeometryCollectionType" abstract="true" substitutionGroup="gml:_Geometry"/>
    <element name="geometryMember" type="gml:GeometryAssociationType"/>
    <element name="pointMember" type="gml:PointMemberType" substitutionGroup="gml:geometryMember"/>
    <element name="lineStringMember" type="gml:LineStringMemberType" substitutionGroup="gml:geometryMember"/>
    <element name="polygonMember" type="gml:PolygonMemberType" substitutionGroup="gml:geometryMember"/>
    <element name="outerBoundaryIs" type="gml:LinearRingMemberType"/>
    <element name="innerBoundaryIs" type="gml:LinearRingMemberType"/>
    <!-- primitive geometry elements -->
    <element name="Point" type="gml:PointType" substitutionGroup="gml:_Geometry"/>
    <element name="LineString" type="gml:LineStringType" substitutionGroup="gml:_Geometry"/>
    <element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:_Geometry"/>
    <element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:_Geometry"/>
    <element name="Box" type="gml:BoxType"/>
    <!-- aggregate geometry elements -->
    <element name="MultiGeometry" type="gml:GeometryCollectionType" substitutionGroup="gml:_Geometry"/>
    <element name="MultiPoint" type="gml:MultiPointType" substitutionGroup="gml:_Geometry"/>
    <element name="MultiLineString" type="gml:MultiLineStringType" substitutionGroup="gml:_Geometry"/>
    <element name="MultiPolygon" type="gml:MultiPolygonType" substitutionGroup="gml:_Geometry"/>
    <!-- coordinate elements -->
    <element name="coord" type="gml:CoordType"/>
    <element name="coordinates" type="gml:CoordinatesType"/>
    <!-- this attribute gives the location where an element is defined -->
    <attribute name="remoteSchema" type="anyURI"/>
    <!-- ==============================================================
         abstract supertypes
    =================================================================== -->
    <complexType name="AbstractGeometryType" abstract="true">
      <annotation>
        <documentation>
          All geometry elements are derived from this abstract supertype; 
          a geometry element may have an identifying attribute (gid). 
          It may be associated with a spatial reference system.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="anyType">
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="AbstractGeometryCollectionBaseType" abstract="true">
      <annotation>
        <documentation>
          This abstract base type for geometry collections just makes the 
          srsName attribute mandatory.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:AbstractGeometryType">
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="required"/>
        </restriction>
      </complexContent>
    </complexType>
    <attributeGroup name="AssociationAttributeGroup">
      <annotation>
        <documentation>
          These attributes can be attached to any element, thus allowing it 
          to act as a pointer. The 'remoteSchema' attribute allows an element 
          that carries link attributes to indicate that the element is declared 
          in a remote schema rather than by the schema that constrains the 
          current document instance.  
        </documentation>
      </annotation>
      <attributeGroup ref="xlink:simpleLink"/>
      <attribute ref="gml:remoteSchema" use="optional"/>
    </attributeGroup>
    <complexType name="GeometryAssociationType">
      <annotation>
        <documentation>
          An instance of this type (e.g. a geometryMember) can either 
          enclose or point to a primitive geometry element. When serving 
          as a simple link that references a remote geometry instance, 
          the value of the gml:remoteSchema attribute can be used to 
          locate a schema fragment that constrains the target instance.
        </documentation>
      </annotation>
      <sequence minOccurs="0">
        <element ref="gml:_Geometry"/>
      </sequence>
      <!-- <attributeGroup ref="gml:AssociationAttributeGroup"/> -->
      <attributeGroup ref="xlink:simpleLink"/>
      <attribute ref="gml:remoteSchema" use="optional"/>
    </complexType>
    <complexType name="PointMemberType">
      <annotation>
        <documentation>Restricts the geometry member to being a Point instance.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:Point"/>
          </sequence>
          <attributeGroup ref="gml:AssociationAttributeGroup"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="LineStringMemberType">
      <annotation>
        <documentation>Restricts the geometry member to being a LineString instance.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:LineString"/>
          </sequence>
          <attributeGroup ref="gml:AssociationAttributeGroup"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="PolygonMemberType">
      <annotation>
        <documentation>Restricts the geometry member to being a Polygon instance.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:Polygon"/>
          </sequence>
          <attributeGroup ref="gml:AssociationAttributeGroup"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="LinearRingMemberType">
      <annotation>
        <documentation>Restricts the outer or inner boundary of a polygon instance 
  			to being a LinearRing.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:LinearRing"/>
          </sequence>
          <attributeGroup ref="gml:AssociationAttributeGroup"/>
        </restriction>
      </complexContent>
    </complexType>
    <!-- ==============================================================
         primitive geometry types
    =================================================================== -->
    <complexType name="PointType">
      <annotation>
        <documentation>
          A Point is defined by a single coordinate tuple.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <choice>
              <element ref="gml:coord"/>
              <element ref="gml:coordinates"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="LineStringType">
      <annotation>
        <documentation>
          A LineString is defined by two or more coordinate tuples, with 
          linear interpolation between them. 
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <choice>
              <element ref="gml:coord" minOccurs="2" maxOccurs="unbounded"/>
              <element ref="gml:coordinates"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="LinearRingType">
      <annotation>
        <documentation>
          A LinearRing is defined by four or more coordinate tuples, with 
          linear interpolation between them; the first and last coordinates 
          must be coincident.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <choice>
              <element ref="gml:coord" minOccurs="4" maxOccurs="unbounded"/>
              <element ref="gml:coordinates"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="BoxType">
      <annotation>
        <documentation>
          The Box structure defines an extent using a pair of coordinate tuples.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <choice>
              <element ref="gml:coord" minOccurs="2" maxOccurs="2"/>
              <element ref="gml:coordinates"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="PolygonType">
      <annotation>
        <documentation>
          A Polygon is defined by an outer boundary and zero or more inner 
          boundaries which are in turn defined by LinearRings.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <element ref="gml:outerBoundaryIs"/>
            <element ref="gml:innerBoundaryIs" minOccurs="0" maxOccurs="unbounded"/>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <!-- ==============================================================
         aggregate geometry types
    =================================================================== -->
    <complexType name="GeometryCollectionType">
      <annotation>
        <documentation>
          A geometry collection must include one or more geometries, referenced 
          through geometryMember elements. User-defined geometry collections 
          that accept GML geometry classes as members must instantiate--or 
          derive from--this type.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryCollectionBaseType">
          <sequence>
            <element ref="gml:geometryMember" maxOccurs="unbounded"/>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="MultiPointType">
      <annotation>
        <documentation>
          A MultiPoint is defined by one or more Points, referenced through 
          pointMember elements.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryCollectionType">
          <sequence>
            <element ref="gml:pointMember" maxOccurs="unbounded"/>
          </sequence>
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="required"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiLineStringType">
      <annotation>
        <documentation>
          A MultiLineString is defined by one or more LineStrings, referenced 
          through lineStringMember elements.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryCollectionType">
          <sequence>
            <element ref="gml:lineStringMember" maxOccurs="unbounded"/>
          </sequence>
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="required"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiPolygonType">
      <annotation>
        <documentation>
          A MultiPolygon is defined by one or more Polygons, referenced through 
          polygonMember elements. 
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryCollectionType">
          <sequence>
            <element ref="gml:polygonMember" maxOccurs="unbounded"/>
          </sequence>
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="required"/>
        </restriction>
      </complexContent>
    </complexType>
    <!-- ==============================================================
         There are two ways to represent coordinates: (1) as a sequence 
         of <coord> elements that encapsulate tuples, or (2) using a 
         single <coordinates> string.
    =================================================================== -->
    <complexType name="CoordType">
      <annotation>
        <documentation>
          Represents a coordinate tuple in one, two, or three dimensions.
        </documentation>
      </annotation>
      <sequence>
        <element name="X" type="decimal"/>
        <element name="Y" type="decimal" minOccurs="0"/>
        <element name="Z" type="decimal" minOccurs="0"/>
      </sequence>
    </complexType>
    <complexType name="CoordinatesType">
      <annotation>
        <documentation>
          Coordinates can be included in a single string, but there is no 
          facility for validating string content. The value of the 'cs' attribute 
          is the separator for coordinate values, and the value of the 'ts' 
          attribute gives the tuple separator (a single space by default); the 
          default values may be changed to reflect local usage.
        </documentation>
      </annotation>
      <simpleContent>
        <extension base="string">
          <attribute name="decimal" type="string" use="optional" default="."/>
          <attribute name="cs" type="string" use="optional" default=","/>
          <attribute name="ts" type="string" use="optional" default="&#x20;"/>
        </extension>
      </simpleContent>
    </complexType>
  </schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/gml/2.1.2/xlinks.xsd
  
  Index: xlinks.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" version="2.1.2">
    <annotation>
      <appinfo>xlinks.xsd v2.1.2 2002-07</appinfo>
      <documentation xml:lang="en">
        This schema provides the XLink attributes for general use.
      </documentation>
    </annotation>
    <!-- ==============================================================
         global declarations
    =============================================================== -->
    <!-- locator attribute -->
    <attribute name="href" type="anyURI"/>
    <!-- semantic attributes -->
    <attribute name="role" type="anyURI"/>
    <attribute name="arcrole" type="anyURI"/>
    <attribute name="title" type="string"/>
    <!-- behavior attributes -->
    <attribute name="show">
      <annotation>
        <documentation>
          The 'show' attribute is used to communicate the desired presentation 
          of the ending resource on traversal from the starting resource; it's 
          value should be treated as follows: 
          new - load ending resource in a new window, frame, pane, or other 
                presentation context
          replace - load the resource in the same window, frame, pane, or 
                    other presentation context
          embed - load ending resource in place of the presentation of the 
                  starting resource
          other - behavior is unconstrained; examine other markup in the 
                  link for hints 
          none - behavior is unconstrained 
        </documentation>
      </annotation>
      <simpleType>
        <restriction base="string">
          <enumeration value="new"/>
          <enumeration value="replace"/>
          <enumeration value="embed"/>
          <enumeration value="other"/>
          <enumeration value="none"/>
        </restriction>
      </simpleType>
    </attribute>
    <attribute name="actuate">
      <annotation>
        <documentation>
          The 'actuate' attribute is used to communicate the desired timing 
          of traversal from the starting resource to the ending resource; 
          it's value should be treated as follows:
          onLoad - traverse to the ending resource immediately on loading 
                   the starting resource 
          onRequest - traverse from the starting resource to the ending 
                      resource only on a post-loading event triggered for 
                      this purpose 
          other - behavior is unconstrained; examine other markup in link 
                  for hints 
          none - behavior is unconstrained
        </documentation>
      </annotation>
      <simpleType>
        <restriction base="string">
          <enumeration value="onLoad"/>
          <enumeration value="onRequest"/>
          <enumeration value="other"/>
          <enumeration value="none"/>
        </restriction>
      </simpleType>
    </attribute>
    <!-- traversal attributes -->
    <attribute name="label" type="string"/>
    <attribute name="from" type="string"/>
    <attribute name="to" type="string"/>
    <!-- ==============================================================
         Attributes grouped by XLink type, as specified by the allowed usage patterns 
         in sec. 4.1 of the W3C Recommendation (dated 2001-06-27)
    =================================================================== -->
    <attributeGroup name="simpleLink">
      <attribute name="type" type="string" use="optional" fixed="simple" form="qualified"/>
      <attribute ref="xlink:href" use="optional"/>
      <attribute ref="xlink:role" use="optional"/>
      <attribute ref="xlink:arcrole" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
      <attribute ref="xlink:show" use="optional"/>
      <attribute ref="xlink:actuate" use="optional"/>
    </attributeGroup>
    <attributeGroup name="extendedLink">
      <attribute name="type" type="string" use="required" fixed="extended" form="qualified"/>
      <attribute ref="xlink:role" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
    </attributeGroup>
    <attributeGroup name="locatorLink">
      <attribute name="type" type="string" use="required" fixed="locator" form="qualified"/>
      <attribute ref="xlink:href" use="required"/>
      <attribute ref="xlink:role" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
      <attribute ref="xlink:label" use="optional"/>
    </attributeGroup>
    <attributeGroup name="arcLink">
      <attribute name="type" type="string" use="required" fixed="arc" form="qualified"/>
      <attribute ref="xlink:arcrole" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
      <attribute ref="xlink:show" use="optional"/>
      <attribute ref="xlink:actuate" use="optional"/>
      <attribute ref="xlink:from" use="optional"/>
      <attribute ref="xlink:to" use="optional"/>
    </attributeGroup>
    <attributeGroup name="resourceLink">
      <attribute name="type" type="string" use="required" fixed="resource" form="qualified"/>
      <attribute ref="xlink:role" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
      <attribute ref="xlink:label" use="optional"/>
    </attributeGroup>
    <attributeGroup name="titleLink">
      <attribute name="type" type="string" use="required" fixed="title" form="qualified"/>
    </attributeGroup>
    <attributeGroup name="emptyLink">
      <attribute name="type" type="string" use="required" fixed="empty" form="qualified"/>
    </attributeGroup>
  </schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/sld/GetMap.xsd
  
  Index: GetMap.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xs:schema targetNamespace="http://www.opengis.net/ows"
  	xmlns:ogc="http://www.opengis.net/ows"
  	xmlns:sld="http://www.opengis.net/sld"
  	xmlns:gml="http://www.opengis.net/gml"
  	xmlns:xs="http://www.w3.org/2001/XMLSchema"
  	elementFormDefault="qualified">
  	
  
  
  <xs:import namespace="http://www.opengis.net/gml"
  	schemaLocation="geometry.xsd"/>
  
  <xs:import namespace="http://www.opengis.net/sld"
  	schemaLocation="StyledLayerDescriptor.xsd"/>
  
  <xs:annotation>
  	<xs:documentation xml:lang="en">
  		XML Schema for OGC Web Map Service GetMap request.
  	</xs:documentation>
  </xs:annotation>
  
  
  <xs:element name="GetMap">
  	<xs:complexType>
  		<xs:sequence>
  			<xs:element ref="sld:StyledLayerDescriptor" />
  			<xs:element name="BoundingBox" type="gml:BoxType"/>
  				<xs:element name="Output">
  				<xs:complexType>
  					<xs:sequence>
  						<xs:element name="Format" type="ogc:FormatType"/>
  						<xs:element name="Transparent" type="xs:boolean" minOccurs="0"/>
  						<xs:element name="BGcolor" type="xs:string" minOccurs="0"/>
  						<xs:element name="Size">
  							<xs:complexType>
  								<xs:sequence>
  									<xs:element name="Width" type="xs:positiveInteger"/>
  									<xs:element name="Height" type="xs:positiveInteger"/>
  								</xs:sequence>
  							</xs:complexType>
  						</xs:element><!--Size-->
  					</xs:sequence>
  				</xs:complexType>
  				</xs:element><!--Output-->
  			<xs:element name="Exceptions" type="ogc:ExceptionsType" minOccurs="0"/>
  			<xs:element name="Vendor" type="ogc:VendorType" minOccurs="0"/>
  		</xs:sequence>
  		<xs:attribute name="version" type="xs:string" use="required"/>
  		<xs:attribute name="service" type="ogc:OWSType" use="required"/>
  	</xs:complexType>
  </xs:element><!--GetMap-->
  <!--Type definitions-->
  <xs:simpleType name="ExceptionsType">
  	<xs:restriction base="xs:string">
  		<xs:enumeration value="application/vnd.ogc.se+inimage"/>
  		<xs:enumeration value="application/vnd.ogc.se+xml"/>
  	</xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="FormatType">
  	<xs:restriction base="xs:string">
  		<xs:enumeration value="image/gif"/>
  		<xs:enumeration value="image/jpg"/>
  		<xs:enumeration value="image/jpeg"/>
  		<xs:enumeration value="image/png"/>
  	</xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="OWSType">
  	<xs:restriction base="xs:string">
  		<xs:enumeration value="WMS"/>
  	</xs:restriction>
  </xs:simpleType>
  <xs:complexType name="VendorType"/>
  <!--not sure how to define vendor-specific area in open manner-->
  </xs:schema>
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/sld/StyledLayerDescriptor.xsd
  
  Index: StyledLayerDescriptor.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema targetNamespace="http://www.opengis.net/sld"
              xmlns:sld="http://www.opengis.net/sld"
              xmlns:ogc="http://www.opengis.net/ogc"
              xmlns:xlink="http://www.w3.org/1999/xlink"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              elementFormDefault="qualified">
    <xsd:import namespace="http://www.w3.org/1999/xlink"
                schemaLocation="xlinks.xsd"/>
    <xsd:import namespace="http://www.opengis.net/ogc"
                schemaLocation="filter.xsd"/>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        STYLED LAYER DESCRIPTOR version 1.0.0 (2002-09-21)
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="StyledLayerDescriptor">
      <xsd:annotation>
        <xsd:documentation>
          A StyledLayerDescriptor is a sequence of styled layers, represented
          at the first level by NamedLayer and UserLayer elements.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Name" minOccurs="0"/>
          <xsd:element ref="sld:Title" minOccurs="0"/>
          <xsd:element ref="sld:Abstract" minOccurs="0"/>
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element ref="sld:NamedLayer"/>
            <xsd:element ref="sld:UserLayer"/>
          </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="version" type="xsd:string" use="required"
                       fixed="1.0.0"/>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="Name" type="xsd:string"/>
    <xsd:element name="Title" type="xsd:string"/>
    <xsd:element name="Abstract" type="xsd:string"/>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        LAYERS AND STYLES
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="NamedLayer">
      <xsd:annotation>
        <xsd:documentation>
          A NamedLayer is a layer of data that has a name advertised by a WMS.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Name"/>
          <xsd:element ref="sld:LayerFeatureConstraints" minOccurs="0"/>
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element ref="sld:NamedStyle"/>
            <xsd:element ref="sld:UserStyle"/>
          </xsd:choice>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="NamedStyle">
      <xsd:annotation>
        <xsd:documentation>
          A NamedStyle is used to refer to a style that has a name in a WMS.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Name"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="UserLayer">
      <xsd:annotation>
        <xsd:documentation>
          A UserLayer allows a user-defined layer to be built from WFS and
          WCS data.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Name" minOccurs="0"/>
          
          <xsd:choice minOccurs="0">
  	        <xsd:element ref="sld:InlineFeature"/>
  	        <xsd:element ref="sld:RemoteOWS" minOccurs="0"/>
  	</xsd:choice>
  	
          <xsd:element ref="sld:LayerFeatureConstraints"/>
          <xsd:element ref="sld:UserStyle" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    
    <xsd:element name="InlineFeature">
      <xsd:complexType>
        <xsd:sequence> 
          <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>     
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
  
    <xsd:element name="RemoteOWS">
      <xsd:annotation>
        <xsd:documentation>
          A RemoteOWS gives a reference to a remote WFS/WCS/other-OWS server. 
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Service"/>
          <xsd:element ref="sld:OnlineResource"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="Service">
      <xsd:annotation>
        <xsd:documentation>
          A Service refers to the type of a remote OWS server.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="WFS"/>
          <xsd:enumeration value="WCS"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:element>
  
    <xsd:element name="OnlineResource">
      <xsd:annotation>
        <xsd:documentation>
          An OnlineResource is typically used to refer to an HTTP URL.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:attributeGroup ref="xlink:simpleLink"/>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="LayerFeatureConstraints">
      <xsd:annotation>
        <xsd:documentation>
          LayerFeatureConstraints define what features &amp; feature types are
          referenced in a layer.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:FeatureTypeConstraint" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="FeatureTypeConstraint">
      <xsd:annotation>
        <xsd:documentation>
          A FeatureTypeConstraint identifies a specific feature type and
          supplies fitlering.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:FeatureTypeName" minOccurs="0"/>
          <xsd:element ref="ogc:Filter" minOccurs="0"/>
          <xsd:element ref="sld:Extent" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="FeatureTypeName" type="xsd:string"/>
  
    <xsd:element name="Extent">
      <xsd:annotation>
        <xsd:documentation>
          An Extent gives feature/coverage/raster/matrix dimension extent. 
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Name"/>
          <xsd:element ref="sld:Value"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="Value" type="xsd:string"/>
  
    <xsd:element name="UserStyle">
      <xsd:annotation>
        <xsd:documentation>
          A UserStyle allows user-defined styling and is semantically
          equivalent to a WMS named style.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Name" minOccurs="0"/>
          <xsd:element ref="sld:Title" minOccurs="0"/>
          <xsd:element ref="sld:Abstract" minOccurs="0"/>
          <xsd:element ref="sld:IsDefault" minOccurs="0"/>
          <xsd:element ref="sld:FeatureTypeStyle" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="IsDefault" type="xsd:string"/>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        FEATURE-TYPE STYLING
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="FeatureTypeStyle">
    <xsd:annotation>
      <xsd:documentation>
        A FeatureTypeStyle contains styling information specific to one
        feature type.  This is the SLD level that separates the 'layer'
        handling from the 'feature' handling.
      </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Name" minOccurs="0"/>
          <xsd:element ref="sld:Title" minOccurs="0"/>
          <xsd:element ref="sld:Abstract" minOccurs="0"/>
          <xsd:element ref="sld:FeatureTypeName" minOccurs="0"/>
          <xsd:element ref="sld:SemanticTypeIdentifier" minOccurs="0"
                      maxOccurs="unbounded"/>
          <xsd:element ref="sld:Rule" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="SemanticTypeIdentifier" type="xsd:string"/>
  
    <xsd:element name="Rule">
      <xsd:annotation>
        <xsd:documentation>
          A Rule is used to attach property/scale conditions to and group
          the individual symbolizers used for rendering.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Name" minOccurs="0"/>
          <xsd:element ref="sld:Title" minOccurs="0"/>
          <xsd:element ref="sld:Abstract" minOccurs="0"/>
          <xsd:element ref="sld:LegendGraphic" minOccurs="0"/>
          <xsd:choice minOccurs="0">
            <xsd:element ref="ogc:Filter"/>
            <xsd:element ref="sld:ElseFilter"/>
          </xsd:choice>
          <xsd:element ref="sld:MinScaleDenominator" minOccurs="0"/>
          <xsd:element ref="sld:MaxScaleDenominator" minOccurs="0"/>
          <xsd:element ref="sld:Symbolizer" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="LegendGraphic">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Graphic"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="ElseFilter">
      <xsd:complexType/>
    </xsd:element>
    <xsd:element name="MinScaleDenominator" type="xsd:double"/>
    <xsd:element name="MaxScaleDenominator" type="xsd:double"/>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        SYMBOLIZERS
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="Symbolizer" type="sld:SymbolizerType" abstract="true"/>
  
    <xsd:complexType name="SymbolizerType" abstract="true">
      <xsd:annotation>
        <xsd:documentation>
          A "SymbolizerType" is an abstract type for encoding the graphical
          properties used to portray geographic information.  Concrete symbol
          types are derived from this base type.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:complexType>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        LINE SYMBOLIZER
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="LineSymbolizer" substitutionGroup="sld:Symbolizer">
      <xsd:annotation>
        <xsd:documentation>
          A LineSymbolizer is used to render a "stroke" along a linear geometry.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:complexContent>
          <xsd:extension base="sld:SymbolizerType">
            <xsd:sequence>
              <xsd:element ref="sld:Geometry" minOccurs="0"/>
              <xsd:element ref="sld:Stroke" minOccurs="0"/>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="Geometry">
      <xsd:annotation>
        <xsd:documentation>
          A Geometry gives reference to a (the) geometry property of a
          feature to be used for rendering.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="ogc:PropertyName"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="Stroke">
      <xsd:annotation>
        <xsd:documentation>
          A "Stroke" specifies the appearance of a linear geometry.  It is
          defined in parallel with SVG strokes.  The following CssParameters
          may be used: "stroke" (color), "stroke-opacity", "stroke-width",
          "stroke-linejoin", "stroke-linecap", "stroke-dasharray", and
          "stroke-dashoffset".
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:choice minOccurs="0">
            <xsd:element ref="sld:GraphicFill"/>
            <xsd:element ref="sld:GraphicStroke"/>
          </xsd:choice>
          <xsd:element ref="sld:CssParameter" minOccurs="0"
                       maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="CssParameter">
      <xsd:annotation>
        <xsd:documentation>
          A "CssParameter" refers to an SVG/CSS graphical-formatting
          parameter.  The parameter is identified using the "name" attribute
          and the content of the element gives the SVG/CSS-coded value.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType mixed="true">
        <xsd:complexContent>
          <xsd:extension base="sld:ParameterValueType">
            <xsd:attribute name="name" type="xsd:string" use="required"/>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:complexType name="ParameterValueType" mixed="true">
      <xsd:annotation>
        <xsd:documentation>
          The "ParameterValueType" uses WFS-Filter expressions to give
          values for SLD graphic parameters.  A "mixed" element-content
          model is used with textual substitution for values.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:sequence minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="ogc:expression"/>
      </xsd:sequence>
    </xsd:complexType>
  
    <xsd:element name="GraphicFill">
      <xsd:annotation>
        <xsd:documentation>
          A "GraphicFill" defines repeated-graphic filling (stippling)
          pattern for an area geometry.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Graphic"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="GraphicStroke">
      <xsd:annotation>
        <xsd:documentation>
          A "GraphicStroke" defines a repated-linear graphic pattern to be used
          for stroking a line.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Graphic"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        POLYGON SYMBOLIZER
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="PolygonSymbolizer" substitutionGroup="sld:Symbolizer">
      <xsd:annotation>
        <xsd:documentation>
          A "PolygonSymbolizer" specifies the rendering of a polygon or
          area geometry, including its interior fill and border stroke.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:complexContent>
          <xsd:extension base="sld:SymbolizerType">
            <xsd:sequence>
              <xsd:element ref="sld:Geometry" minOccurs="0"/>
              <xsd:element ref="sld:Fill" minOccurs="0"/>
              <xsd:element ref="sld:Stroke" minOccurs="0"/>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="Fill">
      <xsd:annotation>
        <xsd:documentation>
          A "Fill" specifies the pattern for filling an area geometry.
          The allowed CssParameters are: "fill" (color) and "fill-opacity".
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:GraphicFill" minOccurs="0"/>
          <xsd:element ref="sld:CssParameter" minOccurs="0"
                       maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        POINT SYMBOLIZER
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="PointSymbolizer" substitutionGroup="sld:Symbolizer">
      <xsd:annotation>
        <xsd:documentation>
          A "PointSymbolizer" specifies the rendering of a "graphic symbol"
          at a point.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:complexContent>
          <xsd:extension base="sld:SymbolizerType">
            <xsd:sequence>
              <xsd:element ref="sld:Geometry" minOccurs="0"/>
              <xsd:element ref="sld:Graphic" minOccurs="0"/>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="Graphic">
      <xsd:annotation>
        <xsd:documentation>
          A "Graphic" specifies or refers to a "graphic symbol" with inherent
          shape, size, and coloring.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element ref="sld:ExternalGraphic"/>
            <xsd:element ref="sld:Mark"/>
          </xsd:choice>
          <xsd:sequence>
            <xsd:element ref="sld:Opacity" minOccurs="0"/>
            <xsd:element ref="sld:Size" minOccurs="0"/>
            <xsd:element ref="sld:Rotation" minOccurs="0"/>
          </xsd:sequence>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="Opacity" type="sld:ParameterValueType"/>
    <xsd:element name="Size" type="sld:ParameterValueType"/>
    <xsd:element name="Rotation" type="sld:ParameterValueType"/>
  
    <xsd:element name="ExternalGraphic">
      <xsd:annotation>
        <xsd:documentation>
          An "ExternalGraphic" gives a reference to an external raster or
          vector graphical object.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:OnlineResource"/>
          <xsd:element ref="sld:Format"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="Format" type="xsd:string"/>
  
    <xsd:element name="Mark">
      <xsd:annotation>
        <xsd:documentation>
          A "Mark" specifies a geometric shape and applies coloring to it.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:WellKnownName" minOccurs="0"/>
          <xsd:element ref="sld:Fill" minOccurs="0"/>
          <xsd:element ref="sld:Stroke" minOccurs="0"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="WellKnownName" type="xsd:string"/>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        TEXT SYMBOLIZER
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="TextSymbolizer" substitutionGroup="sld:Symbolizer">
      <xsd:annotation>
        <xsd:documentation>
          A "TextSymbolizer" is used to render text labels according to
          various graphical parameters.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:complexContent>
          <xsd:extension base="sld:SymbolizerType">
            <xsd:sequence>
              <xsd:element ref="sld:Geometry" minOccurs="0"/>
              <xsd:element ref="sld:Label" minOccurs="0"/>
              <xsd:element ref="sld:Font" minOccurs="0"/>
              <xsd:element ref="sld:LabelPlacement" minOccurs="0"/>
              <xsd:element ref="sld:Halo" minOccurs="0"/>
              <xsd:element ref="sld:Fill" minOccurs="0"/>
              <xsd:element ref="sld:Priority" minOccurs="0"/>
          
              <xsd:element ref="sld:VendorOption" minOccurs="0" maxOccurs="unbounded" />                 
  
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
    </xsd:element>
  
  
  <xsd:element name="VendorOption">
    <xsd:complexType mixed="true">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
               <xsd:attribute name="name" type="xsd:string" />
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
  
    
    
     <xsd:element name="Priority" type="sld:ParameterValueType">
     </xsd:element>
    
  
    <xsd:element name="Label" type="sld:ParameterValueType">
      <xsd:annotation>
        <xsd:documentation>
          A "Label" specifies the textual content to be rendered.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:element>
  
    <xsd:element name="Font">
      <xsd:annotation>
        <xsd:documentation>
          A "Font" element specifies the text font to use.  The allowed
          CssParameters are: "font-family", "font-style", "font-weight",
          and "font-size".
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:CssParameter" minOccurs="0"
                       maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="LabelPlacement">
      <xsd:annotation>
        <xsd:documentation>
          The "LabelPlacement" specifies where and how a text label should
          be rendered relative to a geometry.  The present mechanism is
          poorly aligned with CSS/SVG.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:choice>
          <xsd:element ref="sld:PointPlacement"/>
          <xsd:element ref="sld:LinePlacement"/>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="PointPlacement">
      <xsd:annotation>
        <xsd:documentation>
          A "PointPlacement" specifies how a text label should be rendered
          relative to a geometric point.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:AnchorPoint" minOccurs="0"/>
          <xsd:element ref="sld:Displacement" minOccurs="0"/>
          <xsd:element ref="sld:Rotation" minOccurs="0"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="AnchorPoint">
      <xsd:annotation>
        <xsd:documentation>
          An "AnchorPoint" identifies the location inside of a text label to
          use an an 'anchor' for positioning it relative to a point geometry.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:AnchorPointX"/>
          <xsd:element ref="sld:AnchorPointY"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="AnchorPointX" type="sld:ParameterValueType"/>
    <xsd:element name="AnchorPointY" type="sld:ParameterValueType"/>
  
    <xsd:element name="Displacement">
      <xsd:annotation>
        <xsd:documentation>
          A "Displacement" gives X and Y offset displacements to use for
          rendering a text label near a point.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:DisplacementX"/>
          <xsd:element ref="sld:DisplacementY"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="DisplacementX" type="sld:ParameterValueType"/>
    <xsd:element name="DisplacementY" type="sld:ParameterValueType"/>
  
    <xsd:element name="LinePlacement">
      <xsd:annotation>
        <xsd:documentation>
          A "LinePlacement" specifies how a text label should be rendered
          relative to a linear geometry.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:PerpendicularOffset" minOccurs="0"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="PerpendicularOffset" type="sld:ParameterValueType">
      <xsd:annotation>
        <xsd:documentation>
          A "PerpendicularOffset" gives the perpendicular distance away
          from a line to draw a label.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:element>
  
    <xsd:element name="Halo">
      <xsd:annotation>
        <xsd:documentation>
          A "Halo" fills an extended area outside the glyphs of a rendered
          text label to make the label easier to read over a background.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:Radius" minOccurs="0"/>
          <xsd:element ref="sld:Fill" minOccurs="0"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="Radius" type="sld:ParameterValueType"/>
  
  <!-- *********************************************************************** -->
    <xsd:annotation>
      <xsd:documentation>
        RASTER SYMBOLIZER
      </xsd:documentation>
    </xsd:annotation>
  
    <xsd:element name="RasterSymbolizer" substitutionGroup="sld:Symbolizer">
      <xsd:annotation>
        <xsd:documentation>
          A "RasterSymbolizer" is used to specify the rendering of raster/
          matrix-coverage data (e.g., satellite images, DEMs).
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:complexContent>
          <xsd:extension base="sld:SymbolizerType">
            <xsd:sequence>
              <xsd:element ref="sld:Geometry" minOccurs="0"/>
              <xsd:element ref="sld:Opacity" minOccurs="0"/>
              <xsd:element ref="sld:ChannelSelection" minOccurs="0"/>
              <xsd:element ref="sld:OverlapBehavior" minOccurs="0"/>
              <xsd:element ref="sld:ColorMap" minOccurs="0"/>
              <xsd:element ref="sld:ContrastEnhancement" minOccurs="0"/>
              <xsd:element ref="sld:ShadedRelief" minOccurs="0"/>
              <xsd:element ref="sld:ImageOutline" minOccurs="0"/>
            </xsd:sequence>
          </xsd:extension>
        </xsd:complexContent>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="ChannelSelection">
      <xsd:annotation>
        <xsd:documentation>
          "ChannelSelection" specifies the false-color channel selection
          for a multi-spectral raster source.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:choice>
          <xsd:sequence>
            <xsd:element ref="sld:RedChannel"/>
            <xsd:element ref="sld:GreenChannel"/>
            <xsd:element ref="sld:BlueChannel"/>
          </xsd:sequence>
          <xsd:element ref="sld:GrayChannel"/>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="RedChannel" type="sld:SelectedChannelType"/>
    <xsd:element name="GreenChannel" type="sld:SelectedChannelType"/>
    <xsd:element name="BlueChannel" type="sld:SelectedChannelType"/>
    <xsd:element name="GrayChannel" type="sld:SelectedChannelType"/>
    <xsd:complexType name="SelectedChannelType">
      <xsd:sequence>
        <xsd:element ref="sld:SourceChannelName"/>
        <xsd:element ref="sld:ContrastEnhancement" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="SourceChannelName" type="xsd:string"/>
  
    <xsd:element name="OverlapBehavior">
      <xsd:annotation>
        <xsd:documentation>
          "OverlapBehavior" tells a system how to behave when multiple
          raster images in a layer overlap each other, for example with
          satellite-image scenes.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:choice>
          <xsd:element ref="sld:LATEST_ON_TOP"/>
          <xsd:element ref="sld:EARLIEST_ON_TOP"/>
          <xsd:element ref="sld:AVERAGE"/>
          <xsd:element ref="sld:RANDOM"/>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="LATEST_ON_TOP">
      <xsd:complexType/>
    </xsd:element>
    <xsd:element name="EARLIEST_ON_TOP">
      <xsd:complexType/>
    </xsd:element>
    <xsd:element name="AVERAGE">
      <xsd:complexType/>
    </xsd:element>
    <xsd:element name="RANDOM">
      <xsd:complexType/>
    </xsd:element>
  
    <xsd:element name="ColorMap">
      <xsd:annotation>
        <xsd:documentation>
          A "ColorMap" defines either the colors of a pallet-type raster
          source or the mapping of numeric pixel values to colors.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
          <xsd:element ref="sld:ColorMapEntry"/>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="ColorMapEntry">
      <xsd:complexType>
        <xsd:attribute name="color" type="xsd:string" use="required"/>
        <xsd:attribute name="opacity" type="xsd:double"/>
        <xsd:attribute name="quantity" type="xsd:double"/>
        <xsd:attribute name="label" type="xsd:string"/>
      </xsd:complexType>
    </xsd:element>
  
    <xsd:element name="ContrastEnhancement">
      <xsd:annotation>
        <xsd:documentation>
          "ContrastEnhancement" defines the 'stretching' of contrast for a
          channel of a false-color image or for a whole grey/color image.
          Contrast enhancement is used to make ground features in images
          more visible.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:choice minOccurs="0">
            <xsd:element ref="sld:Normalize"/>
            <xsd:element ref="sld:Histogram"/>
          </xsd:choice>
          <xsd:element ref="sld:GammaValue" minOccurs="0"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="Normalize">
      <xsd:complexType/>
    </xsd:element>
    <xsd:element name="Histogram">
      <xsd:complexType/>
    </xsd:element>
    <xsd:element name="GammaValue" type="xsd:double"/>
  
    <xsd:element name="ShadedRelief">
      <xsd:annotation>
        <xsd:documentation>
          "ShadedRelief" specifies the application of relief shading
          (or "hill shading") to a DEM raster to give it somewhat of a
          three-dimensional effect and to make elevation changes more
          visible.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element ref="sld:BrightnessOnly" minOccurs="0"/>
          <xsd:element ref="sld:ReliefFactor" minOccurs="0"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
    <xsd:element name="BrightnessOnly" type="xsd:boolean"/>
    <xsd:element name="ReliefFactor" type="xsd:double"/>
  
    <xsd:element name="ImageOutline">
      <xsd:annotation>
        <xsd:documentation>
          "ImageOutline" specifies how individual source rasters in
          a multi-raster set (such as a set of satellite-image scenes)
          should be outlined to make the individual-image locations visible.
        </xsd:documentation>
      </xsd:annotation>
      <xsd:complexType>
        <xsd:choice>
          <xsd:element ref="sld:LineSymbolizer"/>
          <xsd:element ref="sld:PolygonSymbolizer"/>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/sld/expr.xsd
  
  Index: expr.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema
     targetNamespace="http://www.opengis.net/ogc"
     xmlns:ogc="http://www.opengis.net/ogc"
     xmlns:gml="http://www.opengis.net/gml"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="qualified">
  
    <xsd:element name="Add"
                 type="ogc:BinaryOperatorType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Sub"
                 type="ogc:BinaryOperatorType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Mul"
                 type="ogc:BinaryOperatorType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Div"
                 type="ogc:BinaryOperatorType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="PropertyName"
                 type="ogc:PropertyNameType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Function"
                 type="ogc:FunctionType"
                 substitutionGroup="ogc:expression"/>
    <xsd:element name="Literal"
                 type="ogc:LiteralType"
                 substitutionGroup="ogc:expression"/>
  
    <xsd:element name="expression" type="ogc:ExpressionType" abstract="true"/>
  
    <xsd:complexType name="ExpressionType" abstract="true"/>
    <xsd:complexType name="BinaryOperatorType">
      <xsd:complexContent>
        <xsd:extension base="ogc:ExpressionType">
          <xsd:sequence>
            <xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
          </xsd:sequence>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="FunctionType">
      <xsd:complexContent>
        <xsd:extension base="ogc:ExpressionType">
          <xsd:sequence>
            <xsd:element ref="ogc:expression"
                         minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
          <xsd:attribute name="name" type="xsd:string" use="required"/>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="LiteralType">
      <xsd:complexContent mixed="true">
        <xsd:extension base="ogc:ExpressionType">
          <xsd:sequence>
            <xsd:any minOccurs="0"/>
          </xsd:sequence>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="PropertyNameType">
      <xsd:complexContent mixed="true">
        <xsd:extension base="ogc:ExpressionType"/>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/sld/feature.xsd
  
  Index: feature.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="2.1.2">
    <annotation>
      <appinfo>feature.xsd v2.1.2 2002-07</appinfo>
      <documentation xml:lang="en">
        GML Feature schema. Copyright (c) 2002 OGC, All Rights Reserved.
      </documentation>
    </annotation>
    <!-- include constructs from the GML Geometry schema -->
    <include schemaLocation="geometry.xsd"/>
    <!-- bring in the XLink namespace -->
   <import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlinks.xsd"/>
  
    
    <!-- ==============================================================
         global declarations
    =================================================================== -->
    <element name="_Feature" type="gml:AbstractFeatureType" abstract="true"/>
    <element name="_FeatureCollection" type="gml:AbstractFeatureCollectionType" abstract="true" substitutionGroup="gml:_Feature"/>
    <element name="featureMember" type="gml:FeatureAssociationType"/>
    <!-- some basic geometric properties of features -->
    <element name="_geometryProperty" type="gml:GeometryAssociationType" abstract="true"/>
    <element name="geometryProperty" type="gml:GeometryAssociationType"/>
    <element name="boundedBy" type="gml:BoundingShapeType"/>
    <element name="pointProperty" type="gml:PointPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="polygonProperty" type="gml:PolygonPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="lineStringProperty" type="gml:LineStringPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="multiPointProperty" type="gml:MultiPointPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="multiLineStringProperty" type="gml:MultiLineStringPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="multiPolygonProperty" type="gml:MultiPolygonPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <element name="multiGeometryProperty" type="gml:MultiGeometryPropertyType" substitutionGroup="gml:_geometryProperty"/>
    <!-- common aliases for geometry properties -->
    <element name="location" type="gml:PointPropertyType" substitutionGroup="gml:pointProperty"/>
    <element name="centerOf" type="gml:PointPropertyType" substitutionGroup="gml:pointProperty"/>
    <element name="position" type="gml:PointPropertyType" substitutionGroup="gml:pointProperty"/>
    <element name="extentOf" type="gml:PolygonPropertyType" substitutionGroup="gml:polygonProperty"/>
    <element name="coverage" type="gml:PolygonPropertyType" substitutionGroup="gml:polygonProperty"/>
    <element name="edgeOf" type="gml:LineStringPropertyType" substitutionGroup="gml:lineStringProperty"/>
    <element name="centerLineOf" type="gml:LineStringPropertyType" substitutionGroup="gml:lineStringProperty"/>
    <element name="multiLocation" type="gml:MultiPointPropertyType" substitutionGroup="gml:multiPointProperty"/>
    <element name="multiCenterOf" type="gml:MultiPointPropertyType" substitutionGroup="gml:multiPointProperty"/>
    <element name="multiPosition" type="gml:MultiPointPropertyType" substitutionGroup="gml:multiPointProperty"/>
    <element name="multiCenterLineOf" type="gml:MultiLineStringPropertyType" substitutionGroup="gml:multiLineStringProperty"/>
    <element name="multiEdgeOf" type="gml:MultiLineStringPropertyType" substitutionGroup="gml:multiLineStringProperty"/>
    <element name="multiCoverage" type="gml:MultiPolygonPropertyType" substitutionGroup="gml:multiPolygonProperty"/>
    <element name="multiExtentOf" type="gml:MultiPolygonPropertyType" substitutionGroup="gml:multiPolygonProperty"/>
    <!-- common feature descriptors -->
    <element name="description" type="string"/>
    <element name="name" type="string"/>
    <!-- ==============================================================
         abstract supertypes
    =================================================================== -->
    <complexType name="AbstractFeatureType" abstract="true">
      <annotation>
        <documentation>
          An abstract feature provides a set of common properties. A concrete 
          feature type must derive from this type and specify additional 
          properties in an application schema. A feature may optionally 
          possess an identifying attribute ('fid').
        </documentation>
      </annotation>
      <sequence>
        <element ref="gml:description" minOccurs="0"/>
        <element ref="gml:name" minOccurs="0"/>
        <element ref="gml:boundedBy" minOccurs="0"/>
        <!-- additional properties must be specified in an application schema -->
      </sequence>
      <attribute name="fid" type="ID" use="optional"/>
    </complexType>
    <complexType name="AbstractFeatureCollectionBaseType" abstract="true">
      <annotation>
        <documentation>
          This abstract base type just makes the boundedBy element mandatory 
          for a feature collection.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:AbstractFeatureType">
          <sequence>
            <element ref="gml:description" minOccurs="0"/>
            <element ref="gml:name" minOccurs="0"/>
            <element ref="gml:boundedBy"/>
          </sequence>
          <attribute name="fid" type="ID" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="AbstractFeatureCollectionType" abstract="true">
      <annotation>
        <documentation>
          A feature collection contains zero or more featureMember elements.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractFeatureCollectionBaseType">
          <sequence>
            <element ref="gml:featureMember" minOccurs="0" maxOccurs="unbounded"/>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="GeometryPropertyType">
  		<annotation>
  			<documentation>
          A simple geometry property encapsulates a geometry element.
          Alternatively, it can function as a pointer (simple-type link) 
          that refers to a remote geometry element.
        </documentation>
  		</annotation>
  		<sequence minOccurs="0">
  			<element ref="gml:_Geometry"/>
  		</sequence>
  		<attributeGroup ref="xlink:simpleLink"/>
               <attribute ref="gml:remoteSchema" use="optional"/>
    </complexType>
    <complexType name="FeatureAssociationType">
      <annotation>
        <documentation>
          An instance of this type (e.g. a featureMember) can either 
          enclose or point to a feature (or feature collection); this 
          type can be restricted in an application schema to allow only 
          specified features as valid participants in the association. 
          When serving as a simple link that references a remote feature 
          instance, the value of the gml:remoteSchema attribute can be 
          used to locate a schema fragment that constrains the target 
          instance.
        </documentation>
      </annotation>
      <sequence minOccurs="0">
        <element ref="gml:_Feature"/>
      </sequence>
      <attributeGroup ref="xlink:simpleLink"/>
      <attribute ref="gml:remoteSchema" use="optional"/>
    </complexType>
    <complexType name="BoundingShapeType">
      <annotation>
        <documentation>
          Bounding shapes--a Box or a null element are currently allowed.
        </documentation>
      </annotation>
      <sequence>
        <choice>
          <element ref="gml:Box"/>
          <element name="null" type="gml:NullType"/>
        </choice>
      </sequence>
    </complexType>
    <!-- ==============================================================
         geometry properties
    =================================================================== -->
    <complexType name="PointPropertyType">
      <annotation>
        <documentation>
          Encapsulates a single point to represent position, location, or 
          centerOf properties.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:Point"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="PolygonPropertyType">
      <annotation>
        <documentation>
          Encapsulates a single polygon to represent coverage or extentOf 
          properties.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:Polygon"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="LineStringPropertyType">
      <annotation>
        <documentation>
          Encapsulates a single LineString to represent centerLineOf or 
          edgeOf properties.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:LineString"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiPointPropertyType">
      <annotation>
        <documentation>
          Encapsulates a MultiPoint element to represent the following 
          discontiguous geometric properties: multiLocation, multiPosition, 
          multiCenterOf.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:MultiPoint"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiLineStringPropertyType">
      <annotation>
        <documentation>
          Encapsulates a MultiLineString element to represent the following 
          discontiguous geometric properties: multiEdgeOf, multiCenterLineOf.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:MultiLineString"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiPolygonPropertyType">
      <annotation>
        <documentation>
          Encapsulates a MultiPolygon to represent the following discontiguous 
          geometric properties: multiCoverage, multiExtentOf.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:MultiPolygon"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiGeometryPropertyType">
      <annotation>
        <documentation>Encapsulates a MultiGeometry element.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:MultiGeometry"/>
          </sequence>
          <attributeGroup ref="xlink:simpleLink"/>
          <attribute ref="gml:remoteSchema" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <simpleType name="NullType">
      <annotation>
        <documentation>
          If a bounding shape is not provided for a feature collection, 
          explain why. Allowable values are:
          innapplicable - the features do not have geometry
          unknown - the boundingBox cannot be computed
          unavailable - there may be a boundingBox but it is not divulged
          missing - there are no features
        </documentation>
      </annotation>
      <restriction base="string">
        <enumeration value="inapplicable"/>
        <enumeration value="unknown"/>
        <enumeration value="unavailable"/>
        <enumeration value="missing"/>
      </restriction>
    </simpleType>
  </schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/sld/filter.xsd
  
  Index: filter.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema targetNamespace="http://www.opengis.net/ogc" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  	<xsd:include schemaLocation="expr.xsd"/>
  	<xsd:import namespace="http://www.opengis.net/gml" schemaLocation="geometry.xsd"/>
  	<!-- ============================================= -->
  	<!-- FILTER EXPRESSION                             -->
  	<!-- ============================================= -->
  	<xsd:element name="FeatureId" type="ogc:FeatureIdType"/>
  	<xsd:element name="Filter" type="ogc:FilterType"/>
  	<!-- ============================================= -->
  	<!-- COMPARISON OPERATORS                          -->
  	<!-- ============================================= -->
  	<xsd:element name="comparisonOps" type="ogc:ComparisonOpsType" abstract="true"/>
  	<xsd:element name="PropertyIsEqualTo" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsNotEqualTo" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsLessThan" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsGreaterThan" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsLessThanOrEqualTo" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsGreaterThanOrEqualTo" type="ogc:BinaryComparisonOpType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsLike" type="ogc:PropertyIsLikeType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsNull" type="ogc:PropertyIsNullType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:element name="PropertyIsBetween" type="ogc:PropertyIsBetweenType" substitutionGroup="ogc:comparisonOps"/>
  	<xsd:complexType name="ComparisonOpsType" abstract="true"/>
  	<!-- ============================================= -->
  	<!-- SPATIAL OPERATORS (sec 3.2.19.2 99-049)       -->
  	<!-- ============================================= -->
  	<xsd:element name="spatialOps" type="ogc:SpatialOpsType" abstract="true"/>
  	<xsd:element name="Equals" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Disjoint" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Touches" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Within" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Overlaps" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Crosses" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Intersects" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Contains" type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>
  	<!-- These operatons are from sec 4.2 of OpenGIS Catalog Interface -->
  	<xsd:element name="DWithin" type="ogc:DistanceBufferType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:element name="Beyond" type="ogc:DistanceBufferType" substitutionGroup="ogc:spatialOps"/>
  	<!-- This is a convenience operator to allow simple BBOX queries -->
  	<xsd:element name="BBOX" type="ogc:BBOXType" substitutionGroup="ogc:spatialOps"/>
  	<xsd:complexType name="SpatialOpsType" abstract="true"/>
  	<!-- ============================================= -->
  	<!-- LOGICAL OPERATORS                             -->
  	<!-- ============================================= -->
  	<xsd:element name="logicOps" type="ogc:LogicOpsType" abstract="true"/>
  	<xsd:element name="And" type="ogc:BinaryLogicOpType" substitutionGroup="ogc:logicOps"/>
  	<xsd:element name="Or" type="ogc:BinaryLogicOpType" substitutionGroup="ogc:logicOps"/>
  	<xsd:element name="Not" type="ogc:UnaryLogicOpType" substitutionGroup="ogc:logicOps"/>
  	<xsd:complexType name="LogicOpsType" abstract="true"/>
  	<!-- ============================================= -->
  	<!-- COMPLEX TYPES                                 -->
  	<!-- ============================================= -->
  	<xsd:complexType name="FilterType">
  		<xsd:choice>
  			<xsd:element ref="ogc:spatialOps"/>
  			<xsd:element ref="ogc:comparisonOps"/>
  			<xsd:element ref="ogc:logicOps"/>
  			<xsd:element ref="ogc:FeatureId" maxOccurs="unbounded"/>
  		</xsd:choice>
  	</xsd:complexType>
  	<xsd:complexType name="FeatureIdType">
  		<xsd:attribute name="fid" type="xsd:anyURI" use="required"/>
  	</xsd:complexType>
  	<xsd:complexType name="BinaryComparisonOpType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:ComparisonOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="PropertyIsLikeType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:ComparisonOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:element ref="ogc:Literal"/>
  				</xsd:sequence>
  				<xsd:attribute name="wildCard" type="xsd:string" use="required"/>
  				<xsd:attribute name="singleChar" type="xsd:string" use="required"/>
  				<xsd:attribute name="escape" type="xsd:string" use="required"/>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="PropertyIsNullType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:ComparisonOpsType">
  				<xsd:choice>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:element ref="ogc:Literal"/>
  				</xsd:choice>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="PropertyIsBetweenType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:ComparisonOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:expression"/>
  					<xsd:element name="LowerBoundary" type="ogc:LowerBoundaryType"/>
  					<xsd:element name="UpperBoundary" type="ogc:UpperBoundaryType"/>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="LowerBoundaryType">
  		<xsd:choice>
  			<xsd:element ref="ogc:expression"/>
  		</xsd:choice>
  	</xsd:complexType>
  	<xsd:complexType name="UpperBoundaryType">
  		<xsd:sequence>
  			<xsd:element ref="ogc:expression"/>
  		</xsd:sequence>
  	</xsd:complexType>
  	<xsd:complexType name="BinarySpatialOpType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:SpatialOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:choice>
  						<xsd:element ref="gml:_Geometry"/>
  						<xsd:element ref="gml:Box"/>
  					</xsd:choice>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="BBOXType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:SpatialOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:element ref="gml:Box"/>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="DistanceBufferType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:SpatialOpsType">
  				<xsd:sequence>
  					<xsd:element ref="ogc:PropertyName"/>
  					<xsd:element ref="gml:_Geometry"/>
  					<xsd:element name="Distance" type="ogc:DistanceType"/>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="DistanceType" mixed="true">
  		<xsd:attribute name="units" type="xsd:string" use="required"/>
  	</xsd:complexType>
  	<xsd:complexType name="BinaryLogicOpType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:LogicOpsType">
  				<xsd:choice minOccurs="2" maxOccurs="unbounded">
  					<xsd:element ref="ogc:comparisonOps"/>
  					<xsd:element ref="ogc:spatialOps"/>
  					<xsd:element ref="ogc:logicOps"/>
  				</xsd:choice>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  	<xsd:complexType name="UnaryLogicOpType">
  		<xsd:complexContent>
  			<xsd:extension base="ogc:LogicOpsType">
  				<xsd:sequence>
  					<xsd:choice>
  						<xsd:element ref="ogc:comparisonOps"/>
  						<xsd:element ref="ogc:spatialOps"/>
  						<xsd:element ref="ogc:logicOps"/>
  					</xsd:choice>
  				</xsd:sequence>
  			</xsd:extension>
  		</xsd:complexContent>
  	</xsd:complexType>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/sld/geometry.xsd
  
  Index: geometry.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="2.1.2">
    <annotation>
      <appinfo>geometry.xsd v2.1.2 2002-07</appinfo>
      <documentation xml:lang="en">
        GML Geometry schema. Copyright (c) 2001,2002 OGC, All Rights Reserved.
      </documentation>
    </annotation>
    <!-- bring in the XLink attributes -->
    <import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlinks.xsd"/>
    <!-- ==============================================================
         global declarations
    =================================================================== -->
    <element name="_Geometry" type="gml:AbstractGeometryType" abstract="true"/>
    <element name="_GeometryCollection" type="gml:GeometryCollectionType" abstract="true" substitutionGroup="gml:_Geometry"/>
    <element name="geometryMember" type="gml:GeometryAssociationType"/>
    <element name="pointMember" type="gml:PointMemberType" substitutionGroup="gml:geometryMember"/>
    <element name="lineStringMember" type="gml:LineStringMemberType" substitutionGroup="gml:geometryMember"/>
    <element name="polygonMember" type="gml:PolygonMemberType" substitutionGroup="gml:geometryMember"/>
    <element name="outerBoundaryIs" type="gml:LinearRingMemberType"/>
    <element name="innerBoundaryIs" type="gml:LinearRingMemberType"/>
    <!-- primitive geometry elements -->
    <element name="Point" type="gml:PointType" substitutionGroup="gml:_Geometry"/>
    <element name="LineString" type="gml:LineStringType" substitutionGroup="gml:_Geometry"/>
    <element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:_Geometry"/>
    <element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:_Geometry"/>
    <element name="Box" type="gml:BoxType"/>
    <!-- aggregate geometry elements -->
    <element name="MultiGeometry" type="gml:GeometryCollectionType" substitutionGroup="gml:_Geometry"/>
    <element name="MultiPoint" type="gml:MultiPointType" substitutionGroup="gml:_Geometry"/>
    <element name="MultiLineString" type="gml:MultiLineStringType" substitutionGroup="gml:_Geometry"/>
    <element name="MultiPolygon" type="gml:MultiPolygonType" substitutionGroup="gml:_Geometry"/>
    <!-- coordinate elements -->
    <element name="coord" type="gml:CoordType"/>
    <element name="coordinates" type="gml:CoordinatesType"/>
    <!-- this attribute gives the location where an element is defined -->
    <attribute name="remoteSchema" type="anyURI"/>
    <!-- ==============================================================
         abstract supertypes
    =================================================================== -->
    <complexType name="AbstractGeometryType" abstract="true">
      <annotation>
        <documentation>
          All geometry elements are derived from this abstract supertype; 
          a geometry element may have an identifying attribute (gid). 
          It may be associated with a spatial reference system.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="anyType">
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="optional"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="AbstractGeometryCollectionBaseType" abstract="true">
      <annotation>
        <documentation>
          This abstract base type for geometry collections just makes the 
          srsName attribute mandatory.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:AbstractGeometryType">
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="required"/>
        </restriction>
      </complexContent>
    </complexType>
    <attributeGroup name="AssociationAttributeGroup">
      <annotation>
        <documentation>
          These attributes can be attached to any element, thus allowing it 
          to act as a pointer. The 'remoteSchema' attribute allows an element 
          that carries link attributes to indicate that the element is declared 
          in a remote schema rather than by the schema that constrains the 
          current document instance.  
        </documentation>
      </annotation>
      <attributeGroup ref="xlink:simpleLink"/>
      <attribute ref="gml:remoteSchema" use="optional"/>
    </attributeGroup>
    <complexType name="GeometryAssociationType">
      <annotation>
        <documentation>
          An instance of this type (e.g. a geometryMember) can either 
          enclose or point to a primitive geometry element. When serving 
          as a simple link that references a remote geometry instance, 
          the value of the gml:remoteSchema attribute can be used to 
          locate a schema fragment that constrains the target instance.
        </documentation>
      </annotation>
      <sequence minOccurs="0">
        <element ref="gml:_Geometry"/>
      </sequence>
      <!-- <attributeGroup ref="gml:AssociationAttributeGroup"/> -->
      <attributeGroup ref="xlink:simpleLink"/>
      <attribute ref="gml:remoteSchema" use="optional"/>
    </complexType>
    <complexType name="PointMemberType">
      <annotation>
        <documentation>Restricts the geometry member to being a Point instance.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:Point"/>
          </sequence>
          <attributeGroup ref="gml:AssociationAttributeGroup"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="LineStringMemberType">
      <annotation>
        <documentation>Restricts the geometry member to being a LineString instance.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:LineString"/>
          </sequence>
          <attributeGroup ref="gml:AssociationAttributeGroup"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="PolygonMemberType">
      <annotation>
        <documentation>Restricts the geometry member to being a Polygon instance.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:Polygon"/>
          </sequence>
          <attributeGroup ref="gml:AssociationAttributeGroup"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="LinearRingMemberType">
      <annotation>
        <documentation>Restricts the outer or inner boundary of a polygon instance 
  			to being a LinearRing.</documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryAssociationType">
          <sequence minOccurs="0">
            <element ref="gml:LinearRing"/>
          </sequence>
          <attributeGroup ref="gml:AssociationAttributeGroup"/>
        </restriction>
      </complexContent>
    </complexType>
    <!-- ==============================================================
         primitive geometry types
    =================================================================== -->
    <complexType name="PointType">
      <annotation>
        <documentation>
          A Point is defined by a single coordinate tuple.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <choice>
              <element ref="gml:coord"/>
              <element ref="gml:coordinates"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="LineStringType">
      <annotation>
        <documentation>
          A LineString is defined by two or more coordinate tuples, with 
          linear interpolation between them. 
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <choice>
              <element ref="gml:coord" minOccurs="2" maxOccurs="unbounded"/>
              <element ref="gml:coordinates"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="LinearRingType">
      <annotation>
        <documentation>
          A LinearRing is defined by four or more coordinate tuples, with 
          linear interpolation between them; the first and last coordinates 
          must be coincident.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <choice>
              <element ref="gml:coord" minOccurs="4" maxOccurs="unbounded"/>
              <element ref="gml:coordinates"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="BoxType">
      <annotation>
        <documentation>
          The Box structure defines an extent using a pair of coordinate tuples.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <choice>
              <element ref="gml:coord" minOccurs="2" maxOccurs="2"/>
              <element ref="gml:coordinates"/>
            </choice>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="PolygonType">
      <annotation>
        <documentation>
          A Polygon is defined by an outer boundary and zero or more inner 
          boundaries which are in turn defined by LinearRings.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryType">
          <sequence>
            <element ref="gml:outerBoundaryIs"/>
            <element ref="gml:innerBoundaryIs" minOccurs="0" maxOccurs="unbounded"/>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <!-- ==============================================================
         aggregate geometry types
    =================================================================== -->
    <complexType name="GeometryCollectionType">
      <annotation>
        <documentation>
          A geometry collection must include one or more geometries, referenced 
          through geometryMember elements. User-defined geometry collections 
          that accept GML geometry classes as members must instantiate--or 
          derive from--this type.
        </documentation>
      </annotation>
      <complexContent>
        <extension base="gml:AbstractGeometryCollectionBaseType">
          <sequence>
            <element ref="gml:geometryMember" maxOccurs="unbounded"/>
          </sequence>
        </extension>
      </complexContent>
    </complexType>
    <complexType name="MultiPointType">
      <annotation>
        <documentation>
          A MultiPoint is defined by one or more Points, referenced through 
          pointMember elements.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryCollectionType">
          <sequence>
            <element ref="gml:pointMember" maxOccurs="unbounded"/>
          </sequence>
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="required"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiLineStringType">
      <annotation>
        <documentation>
          A MultiLineString is defined by one or more LineStrings, referenced 
          through lineStringMember elements.
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryCollectionType">
          <sequence>
            <element ref="gml:lineStringMember" maxOccurs="unbounded"/>
          </sequence>
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="required"/>
        </restriction>
      </complexContent>
    </complexType>
    <complexType name="MultiPolygonType">
      <annotation>
        <documentation>
          A MultiPolygon is defined by one or more Polygons, referenced through 
          polygonMember elements. 
        </documentation>
      </annotation>
      <complexContent>
        <restriction base="gml:GeometryCollectionType">
          <sequence>
            <element ref="gml:polygonMember" maxOccurs="unbounded"/>
          </sequence>
          <attribute name="gid" type="ID" use="optional"/>
          <attribute name="srsName" type="anyURI" use="required"/>
        </restriction>
      </complexContent>
    </complexType>
    <!-- ==============================================================
         There are two ways to represent coordinates: (1) as a sequence 
         of <coord> elements that encapsulate tuples, or (2) using a 
         single <coordinates> string.
    =================================================================== -->
    <complexType name="CoordType">
      <annotation>
        <documentation>
          Represents a coordinate tuple in one, two, or three dimensions.
        </documentation>
      </annotation>
      <sequence>
        <element name="X" type="decimal"/>
        <element name="Y" type="decimal" minOccurs="0"/>
        <element name="Z" type="decimal" minOccurs="0"/>
      </sequence>
    </complexType>
    <complexType name="CoordinatesType">
      <annotation>
        <documentation>
          Coordinates can be included in a single string, but there is no 
          facility for validating string content. The value of the 'cs' attribute 
          is the separator for coordinate values, and the value of the 'ts' 
          attribute gives the tuple separator (a single space by default); the 
          default values may be changed to reflect local usage.
        </documentation>
      </annotation>
      <simpleContent>
        <extension base="string">
          <attribute name="decimal" type="string" use="optional" default="."/>
          <attribute name="cs" type="string" use="optional" default=","/>
          <attribute name="ts" type="string" use="optional" default="&#x20;"/>
        </extension>
      </simpleContent>
    </complexType>
  </schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/sld/xlinks.xsd
  
  Index: xlinks.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" version="2.1.2">
    <annotation>
      <appinfo>xlinks.xsd v2.1.2 2002-07</appinfo>
      <documentation xml:lang="en">
        This schema provides the XLink attributes for general use.
      </documentation>
    </annotation>
    <!-- ==============================================================
         global declarations
    =============================================================== -->
    <!-- locator attribute -->
    <attribute name="href" type="anyURI"/>
    <!-- semantic attributes -->
    <attribute name="role" type="anyURI"/>
    <attribute name="arcrole" type="anyURI"/>
    <attribute name="title" type="string"/>
    <!-- behavior attributes -->
    <attribute name="show">
      <annotation>
        <documentation>
          The 'show' attribute is used to communicate the desired presentation 
          of the ending resource on traversal from the starting resource; it's 
          value should be treated as follows: 
          new - load ending resource in a new window, frame, pane, or other 
                presentation context
          replace - load the resource in the same window, frame, pane, or 
                    other presentation context
          embed - load ending resource in place of the presentation of the 
                  starting resource
          other - behavior is unconstrained; examine other markup in the 
                  link for hints 
          none - behavior is unconstrained 
        </documentation>
      </annotation>
      <simpleType>
        <restriction base="string">
          <enumeration value="new"/>
          <enumeration value="replace"/>
          <enumeration value="embed"/>
          <enumeration value="other"/>
          <enumeration value="none"/>
        </restriction>
      </simpleType>
    </attribute>
    <attribute name="actuate">
      <annotation>
        <documentation>
          The 'actuate' attribute is used to communicate the desired timing 
          of traversal from the starting resource to the ending resource; 
          it's value should be treated as follows:
          onLoad - traverse to the ending resource immediately on loading 
                   the starting resource 
          onRequest - traverse from the starting resource to the ending 
                      resource only on a post-loading event triggered for 
                      this purpose 
          other - behavior is unconstrained; examine other markup in link 
                  for hints 
          none - behavior is unconstrained
        </documentation>
      </annotation>
      <simpleType>
        <restriction base="string">
          <enumeration value="onLoad"/>
          <enumeration value="onRequest"/>
          <enumeration value="other"/>
          <enumeration value="none"/>
        </restriction>
      </simpleType>
    </attribute>
    <!-- traversal attributes -->
    <attribute name="label" type="string"/>
    <attribute name="from" type="string"/>
    <attribute name="to" type="string"/>
    <!-- ==============================================================
         Attributes grouped by XLink type, as specified by the allowed usage patterns 
         in sec. 4.1 of the W3C Recommendation (dated 2001-06-27)
    =================================================================== -->
    <attributeGroup name="simpleLink">
      <attribute name="type" type="string" use="optional" fixed="simple" form="qualified"/>
      <attribute ref="xlink:href" use="optional"/>
      <attribute ref="xlink:role" use="optional"/>
      <attribute ref="xlink:arcrole" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
      <attribute ref="xlink:show" use="optional"/>
      <attribute ref="xlink:actuate" use="optional"/>
    </attributeGroup>
    <attributeGroup name="extendedLink">
      <attribute name="type" type="string" use="required" fixed="extended" form="qualified"/>
      <attribute ref="xlink:role" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
    </attributeGroup>
    <attributeGroup name="locatorLink">
      <attribute name="type" type="string" use="required" fixed="locator" form="qualified"/>
      <attribute ref="xlink:href" use="required"/>
      <attribute ref="xlink:role" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
      <attribute ref="xlink:label" use="optional"/>
    </attributeGroup>
    <attributeGroup name="arcLink">
      <attribute name="type" type="string" use="required" fixed="arc" form="qualified"/>
      <attribute ref="xlink:arcrole" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
      <attribute ref="xlink:show" use="optional"/>
      <attribute ref="xlink:actuate" use="optional"/>
      <attribute ref="xlink:from" use="optional"/>
      <attribute ref="xlink:to" use="optional"/>
    </attributeGroup>
    <attributeGroup name="resourceLink">
      <attribute name="type" type="string" use="required" fixed="resource" form="qualified"/>
      <attribute ref="xlink:role" use="optional"/>
      <attribute ref="xlink:title" use="optional"/>
      <attribute ref="xlink:label" use="optional"/>
    </attributeGroup>
    <attributeGroup name="titleLink">
      <attribute name="type" type="string" use="required" fixed="title" form="qualified"/>
    </attributeGroup>
    <attributeGroup name="emptyLink">
      <attribute name="type" type="string" use="required" fixed="empty" form="qualified"/>
    </attributeGroup>
  </schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/validate/pluginSchema.xsd
  
  Index: pluginSchema.xsd
  ===================================================================
   <xs:schema targetNamespace="pluginSchema" 
   xmlns:ogc="http://www.opengis.net/ogc" 
   xmlns:gml="http://www.opengis.net/gml" 
   xmlns="pluginSchema" 
   xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
     <xs:import namespace=”http://www.opengis.net/gml” 
        schemaLocation="http://schemas.opengis.net/gml/2.0.0/geometry.xsd"/>
     <xs:import namespace=”http://www.opengis.net/ogc”
        schemaLocation="http://schemas.opengis.net/filter/1.0.0/filter.xsd"/>
     <xs:element name="plugin">
       <xs:complexType>
         <xs:sequence>
           <xs:element name="name" type="xs:string"/>
           <xs:element name="description" type="xs:string" minOccurs="0"/>
           <xs:element name="class" type="xs:string"/>
           <xs:element name="argument" minOccurs="0" maxOccurs="unbounded">
             <xs:complexType>
               <xs:attribute name="final" type="xs:boolean" use="optional" default="false"/>
               <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:choice>
                   <xs:element name="filter" type="ogc:FilterType"/>
                   <xs:element name="geometry"
                        type="gml:AbstractGeometryType"/>
                   <xs:element name="bbox" type="ogc:BBOXType"/>
                   <xs:element name="short" type="xs:short"/>
                   <xs:element name="integer" type="xs:integer"/>
                   <xs:element name="long" type="xs:long"/>
                   <xs:element name="float" type="xs:float"/>
                   <xs:element name="double" type="xs:double"/>
                   <xs:element name="datetime" type="xs:dateTime"/>
                   <xs:element name="anyURI" type="xs:anyURI"/>
                   <xs:element name="boolean" type="xs:boolean"/>
                   <xs:element name="string" type="xs:string"/>
                 </xs:choice>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
         </xs:sequence>
       </xs:complexType>
     </xs:element>
   </xs:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/validate/testSuiteSchema.xsd
  
  Index: testSuiteSchema.xsd
  ===================================================================
   <?xml version="1.0" encoding="UTF-8"?>
   <xs:schema targetNamespace="suiteSchema" 
      xmlns="testSuiteSchema" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:ogc="http://www.opengis.net/ogc" 
      xmlns:gml="http://www.opengis.net/gml" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified">
     <xs:import namespace=”http://www.opengis.net/gml”
        schemaLocation="http://schemas.opengis.net/gml/2.0.0/geometry.xsd"/>
     <xs:import namespace=”http://www.opengis.net/ogc”
        schemaLocation="http://schemas.opengis.net/filter/1.0.0/filter.xsd"/>
     <xs:element name="suite">
       <xs:complexType>
         <xs:sequence>
           <xs:element name="name" type="xs:string"/>
           <xs:element name="description" type="xs:string" minOccurs="0"/>
           <xs:element name="test" maxOccurs="unbounded">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:element name="description" type="xs:string" 
                     minOccurs="0"/>
                 <xs:element name="plugin" type="xs:string"/>
                 <xs:element name="argument" minOccurs="0"
                     maxOccurs="unbounded">
                   <xs:complexType>
                     <xs:sequence>
                       <xs:element name="name" type="xs:string"/>
                       <xs:choice>
                         <xs:element name="filter" type="ogc:FilterType"/>
                         <xs:element name="geometry"
                             type="gml:AbstractGeometryType"/>
                         <xs:element name="bbox" type="ogc:BBOXType"/>
                         <xs:element name="short" type="xs:short"/>
                         <xs:element name="integer" type="xs:integer"/>
                         <xs:element name="long" type="xs:long"/>
                         <xs:element name="float" type="xs:float"/>
                         <xs:element name="double" type="xs:double"/>
                         <xs:element name="datetime" type="xs:dateTime"/>
                         <xs:element name="anyURI" type="xs:anyURI"/>
                         <xs:element name="boolean" type="xs:boolean"/>
                         <xs:element name="string" type="xs:string"/>
                       </xs:choice>
                     </xs:sequence>
                   </xs:complexType>
                 </xs:element>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
         </xs:sequence>
       </xs:complexType>
     </xs:element>
   </xs:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/wfs/1.0.0/OGC-exception.xsd
  
  Index: OGC-exception.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema
     targetNamespace="http://www.opengis.net/ogc"
     xmlns:ogc="http://www.opengis.net/ogc"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="qualified">
  
     <xsd:element name="ServiceExceptionReport">
        <xsd:annotation>
           <xsd:documentation>
              The ServiceExceptionReport element contains one
              or more ServiceException elements that describe
              a service exception.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
           <xsd:sequence>
              <xsd:element name="ServiceException"
                           type="ogc:ServiceExceptionType"
                           minOccurs="0" maxOccurs="unbounded">
                 <xsd:annotation>
                    <xsd:documentation>
                       The Service exception element is used to describe 
                       a service exception.
                    </xsd:documentation>
                 </xsd:annotation>
              </xsd:element>
           </xsd:sequence>
           <xsd:attribute name="version" type="xsd:string" fixed="1.2.0"/>
        </xsd:complexType>
     </xsd:element>
  
     <xsd:complexType name="ServiceExceptionType">
        <xsd:annotation>
           <xsd:documentation>
              The ServiceExceptionType type defines the ServiceException
              element.  The content of the element is an exception message
              that the service wished to convey to the client application.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:simpleContent>
           <xsd:extension base="xsd:string">
              <xsd:attribute name="code" type="xsd:string">
                 <xsd:annotation>
                    <xsd:documentation>
                       A service may associate a code with an exception
                       by using the code attribute.
                    </xsd:documentation>
                 </xsd:annotation>
              </xsd:attribute>
              <xsd:attribute name="locator" type="xsd:string">
                 <xsd:annotation>
                    <xsd:documentation>
                       The locator attribute may be used by a service to
                       indicate to a client where in the client's request
                       an exception was encountered.  If the request included
                       a 'handle' attribute, this may be used to identify the
                       offending component of the request.  Otherwise the 
                       service may try to use other means to locate the 
                       exception such as line numbers or byte offset from the
                       begining of the request, etc ...
                    </xsd:documentation>
                 </xsd:annotation>
              </xsd:attribute>
           </xsd:extension>
        </xsd:simpleContent>
     </xsd:complexType>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd
  
  Index: WFS-basic.xsd
  ===================================================================
  <?xml version="1.0"?>
  <xsd:schema 
     targetNamespace="http://www.opengis.net/wfs"
     xmlns:wfs="http://www.opengis.net/wfs"
     xmlns:ogc="http://www.opengis.net/ogc"
     xmlns:gml="http://www.opengis.net/gml"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="qualified">
  
     <!-- ==============================================================
          Includes and Imports
          ============================================================== -->
     <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="../../gml/2.1.2/feature.xsd"/>
     <xsd:import namespace="http://www.opengis.net/ogc" schemaLocation="../../filter/1.0.0/filter.xsd"/>
  
     <!-- ==============================================================
          REQUEST MESSAGES 
          ============================================================== -->
     <xsd:element name="GetCapabilities" type="wfs:GetCapabilitiesType">
        <xsd:annotation>
           <xsd:documentation>
              The GetCapapbilities element is used to request that a Web Feature
              Service generate an XML document describing the organization
              providing the service, the WFS operations that the service
              supports, a list of feature types that the service can operate
              on and list of filtering capabilities that the service support.
              Such an XML document is called a capabilities document.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:element name="DescribeFeatureType" type="wfs:DescribeFeatureTypeType">
        <xsd:annotation>
           <xsd:documentation>
              The DescribeFeatureType element is used to request that a Web
              Feature Service generate a document describing one or more 
              feature types.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:element name="GetFeature" type="wfs:GetFeatureType">
        <xsd:annotation>
           <xsd:documentation>
              The GetFeature element is used to request that a Web Feature
              Service return feature instances of one or more feature types.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
  
     <!-- ==============================================================
          RESPONSE MESSAGES 
          ============================================================== -->
     <xsd:element name="FeatureCollection"
                  type="wfs:FeatureCollectionType"
                  substitutionGroup="gml:_FeatureCollection">
        <xsd:annotation>
           <xsd:documentation>
              This element is a container for the response to a GetFeature
              or GetFeatureWithLock (WFS-transaction.xsd) request.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
  
     <!-- ==============================================================
          COMMON ATTRIBUTES DOCUMENTATION
          ==============================================================
          VERSION:
             The version attribute is used to indicate to which version
             of the Web Feature Service Implementation Specification a
             request conforms.
  
          SERVICE:
             The service attribute is used to indicate which service
             should process an operation.  This attribute is particularly
             useful in the case where a single server implements multiple
             services (e.g. WMS, WFS, WCS, etc ...).
  
          HANDLE:
             The purpose of the handle attribute is to allow a client app
             to associate a mnemonic name with a request for error handling
             purposes.  If a "handle" is specified, and an exception occurs,
             a Web Feature Service may use the handle to identify the
             offending element.
  
          TYPENAME:
             The typeName attribute is used to specify the name of the
             feature type to be queried.  The term "feature type" is a
             term used by convention to refer to the container storing 
             feature instances.  It does not mean type in the programmatic 
             sense.  The typeName attribute should, instead, be thought
             of as the feature name. -->
  
     <!-- ==============================================================
          TYPES
          ============================================================== -->
     <!-- GETCAPABILITIES -->
     <xsd:complexType name="GetCapabilitiesType">
        <xsd:annotation>
           <xsd:documentation>
              This type defines the GetCapabilities operation.  In response
              to a GetCapabilities request, a Web Feature Service must 
              generate a capabilities XML document that validates against
              the schemas defined in WFS-capabilities.xsd.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:attribute name="version"
                       type="xsd:string" use="optional" fixed="1.0.0"/>
        <xsd:attribute name="service"
                       type="xsd:string" use="required" fixed="WFS"/>
     </xsd:complexType>
     <!-- DESCRIBEFEATURETYPE -->
     <xsd:complexType name="DescribeFeatureTypeType">
        <xsd:annotation>
           <xsd:documentation>
              The DescribeFeatureType operation allows a client application
              to request that a Web Feature Service describe one or more
              feature types.   A Web Feature Service must be able to generate
              feature descriptions as valid GML2 application schemas.
  
              The schemas generated by the DescribeFeatureType operation can
              be used by a client application to validate the output.
  
              Feature instances within the WFS interface must be specified
              using GML2.  The schema of feature instances specified within
              the WFS interface must validate against the feature schemas 
              generated by the DescribeFeatureType request.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
           <xsd:element name="TypeName" type="xsd:QName"
                        minOccurs="0" maxOccurs="unbounded">
              <xsd:annotation>
                 <xsd:documentation>
                    The TypeName element is used to enumerate the feature types
                    to be described.  If no TypeName elements are specified
                    then all features should be described.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="version"
                       type="xsd:string" use="required" fixed="1.0.0"/>
        <xsd:attribute name="service"
                       type="xsd:string" use="required" fixed="WFS"/>
        <xsd:attribute name="outputFormat"
                       type="xsd:string" use="optional" default="XMLSCHEMA">
           <xsd:annotation>
              <xsd:documentation>
                 The outputFormat attribute is used to specify what schema
                 description language should be used to describe features.
                 The default value of XMLSCHEMA means that the Web Feature
                 Service must generate a GML2 application schema that can
                 be used to validate the GML2 output of a GetFeature request
                 or feature instances specified in Transaction operations.
              </xsd:documentation>
           </xsd:annotation>
        </xsd:attribute>
     </xsd:complexType>
     <!-- GETFEATURE -->
     <xsd:complexType name="GetFeatureType">
        <xsd:annotation>
           <xsd:documentation>
              A GetFeature element contains one or more Query elements
              that describe a query operation on one feature type.  In
              response to a GetFeature request, a Web Feature Service
              must be able to generate a GML2 response that validates
              using a schema generated by the DescribeFeatureType request.
              A Web Feature Service may support other possibly non-XML
              (and even binary) output formats as long as those formats
              are advertised in the capabilities document.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
           <xsd:element ref="wfs:Query" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="version"
                       type="xsd:string" use="required" fixed="1.0.0"/>
        <xsd:attribute name="service"
                       type="xsd:string" use="required" fixed="WFS"/>
        <xsd:attribute name="handle"
                       type="xsd:string" use="optional"/>
        <xsd:attribute name="outputFormat"
                       type="xsd:string" use="optional" default="GML2">
           <xsd:annotation>
              <xsd:documentation>
                 The outputFormat attribute is used to specify the output
                 format that the Web Feature Service should generate in
                 response to a GetFeature or GetFeatureWithLock element.
                 The default value of GML2 indicates that the output is an
                 XML document that conforms to the Geography Markup Language
                 (GML) Implementation Specification V2.0.
  
                 Other values may be used to specify other formats as long
                 as those values are advertised in the capabilities document.
                 For example, the value WKB may be used to indicate that a 
                 Well Known Binary format be used to encode the output.
              </xsd:documentation>
           </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="maxFeatures" type="xsd:positiveInteger"
                       use="optional">
           <xsd:annotation>
              <xsd:documentation>
                 The maxFeatures attribute is used to specify the maximum
                 number of features that a GetFeature operation should
                 generate (regardless of the actual number of query hits).
              </xsd:documentation>
           </xsd:annotation>
        </xsd:attribute>
     </xsd:complexType>
     <xsd:element name="Query" type="wfs:QueryType">
        <xsd:annotation>
           <xsd:documentation>
              The Query element is used to describe a single query.
              One or more Query elements can be specified inside a
              GetFeature element so that multiple queries can be 
              executed in one request.  The output from the various
              queries are combined in a wfs:FeatureCollection element
              to form the response to the request.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:complexType name="QueryType">
        <xsd:annotation>
           <xsd:documentation>
              The Query element is of type QueryType.
           </xsd:documentation>
        </xsd:annotation>
       <xsd:sequence>
         <xsd:element ref="ogc:PropertyName" minOccurs="0" maxOccurs="unbounded">
            <xsd:annotation>
               <xsd:documentation>
                  The PropertyName element is used to specify one or more
                  properties of a feature whose values are to be retrieved
                  by a Web Feature Service.  
                  
                  While a Web Feature Service should endeavour to satisfy
                  the exact request specified, in some instance this may
                  not be possible.  Specifically, a Web Feature Service
                  must generate a valid GML2 response to a Query operation.
                  The schema used to generate the output may include 
                  properties that are mandatory.  In order that the output
                  validates, these mandatory properties must be specified
                  in the request.  If they are not, a Web Feature Service
                  may add them automatically to the Query before processing
                  it.  Thus a client application should, in general, be
                  prepared to receive more properties than it requested.
  
                  Of course, using the DescribeFeatureType request, a client
                  application can determine which properties are mandatory
                  and request them in the first place.
               </xsd:documentation>
            </xsd:annotation>
         </xsd:element>
         <xsd:element ref="ogc:Filter" minOccurs="0" maxOccurs="1">
            <xsd:annotation>
               <xsd:documentation>
                  The Filter element is used to define spatial and/or non-spatial
                  constraints on query.  Spatial constrains use GML2 to specify
                  the constraining geometry.  A full description of the Filter
                  element can be found in the Filter Encoding Implementation
                  Specification.
               </xsd:documentation>
            </xsd:annotation>
         </xsd:element>
       </xsd:sequence>
       <xsd:attribute name="handle"
                      type="xsd:string" use="optional"/>
       <xsd:attribute name="typeName"
                      type="xsd:QName" use="required"/>
       <xsd:attribute name="featureVersion"
                      type="xsd:string" use="optional">
          <xsd:annotation>
             <xsd:documentation>
                For systems that implement versioning, the featureVersion
                attribute is used to specify which version of a particular
                feature instance is to be retrieved.  A value of ALL means
                that all versions should be retrieved.  An integer value
                'i', means that the ith version should be retrieve if it
                exists or the most recent version otherwise.
             </xsd:documentation>
          </xsd:annotation>
       </xsd:attribute>
     </xsd:complexType>
     <!-- RESPONSE TYPE -->
     <xsd:complexType name="FeatureCollectionType">
        <xsd:annotation>
           <xsd:documentation>
              This type defines a container for the response to a 
              GetFeature or GetFeatureWithLock request.  If the
              request is GetFeatureWithLock, the lockId attribute
              must be populated.  The lockId attribute can otherwise
              be safely ignored.
           </xsd:documentation>
        </xsd:annotation>
       <xsd:complexContent>
         <xsd:extension base="gml:AbstractFeatureCollectionType">
           <xsd:attribute name="lockId" type="xsd:string" use="optional">
              <xsd:annotation>
                 <xsd:documentation>
                    The value of the lockId attribute is an identifier
                    that a Web Feature Service generates and which a
                    client application can use in subsequent operations
                    (such as a Transaction request) to reference the set
                    of locked features.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:attribute>
         </xsd:extension>
       </xsd:complexContent>
     </xsd:complexType>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/wfs/1.0.0/WFS-capabilities.xsd
  
  Index: WFS-capabilities.xsd
  ===================================================================
  <?xml version="1.0" ?>
  <xsd:schema
     targetNamespace="http://www.opengis.net/wfs"
     xmlns:wfs="http://www.opengis.net/wfs"
     xmlns:gml="http://www.opengis.net/gml"
     xmlns:ogc="http://www.opengis.net/ogc"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="qualified">
  
     <!-- Comments in this document may impose additional constraints
          beyond those codified in the schema syntax.  A conformant
          Web Feature Server must provide Capabilities XML that
             (1) validates against this schema
             (2) does not violate the constraints stated in
                 comments herein. -->
  
     <!-- ==============================================================
          Imports ...
          ============================================================== -->
     <xsd:import namespace="http://www.opengis.net/ogc"
                 schemaLocation="../../filter/1.0.0/filterCapabilities.xsd" />
  
     <!-- ==============================================================
          Global elements and attributes
          ============================================================== -->
     <!-- A descriptive narrative for more
          information about this server. -->
     <xsd:element name="Abstract" type="xsd:string"/>
     <!-- Elements containing text blocks indicating what 
          fees or access constraints are imposed by the 
          service provider on the service or data retrieved
          from the server. The reserved keyword "NONE" 
          indicates no constraint exists. -->
     <xsd:element name="AccessConstraints" type="xsd:string"/>
     <xsd:element name="Fees" type="xsd:string"/>
     <!-- Short words to help catalog searching.
          Currently, no controlled vocabulary has
          been defined. -->
     <xsd:element name="Keywords" type="xsd:string"/>
     <!-- The top-level HTTP URL of this service. 
          Typically the URL of a "home page" for
          the service.  See also the onlineResource
          attributes of <DCPType> children, below.
          Currently, no non-HTTP platforms have been
          specified. -->
     <xsd:element name="OnlineResource"/>
     <xsd:element name="SRS" type="xsd:string"/>
     <!-- A human-readable title to briefly identify
          this server in menus. -->
     <xsd:element name="Title" type="xsd:string"/>
  
     <xsd:element name="Query"  type="wfs:EmptyType"/>
     <xsd:element name="Insert" type="wfs:EmptyType"/>
     <xsd:element name="Update" type="wfs:EmptyType"/>
     <xsd:element name="Delete" type="wfs:EmptyType"/>
     <xsd:element name="Lock"   type="wfs:EmptyType"/>
  
     <!-- REDEFINE THIS ELEMENT AS NEEDED IN YOUR XML  -->
     <xsd:element name="VendorSpecificCapabilities" type="xsd:string"/>
  
     <!-- ==============================================================
          Root element
          ============================================================== -->
     <!-- The parent element of the Capabilities document includes as
          children a Service element with general information about the
          server, a Capability element with specific information about
          the kinds of functionality offered by the server, a FeatureTypeList
          element defining the list of all feature types available from
          this server and a FeatureCapabilities element describing the
          filter capabilities of the server. -->
     <xsd:element name="WFS_Capabilities" type="wfs:WFS_CapabilitiesType"/>
  
     <!-- ==============================================================
          Types
          ============================================================== -->
     <xsd:complexType name="WFS_CapabilitiesType">
        <xsd:sequence>
           <!-- The Service element provides metadata for
                the service as a whole. -->
           <xsd:element name="Service" type="wfs:ServiceType"/>
  
           <!-- A Capability lists available request
                types, how exceptions may be reported, and
                whether any vendor-specific capabilities
                are defined.  It also lists all the
                feature types available from this feature 
                server. -->
           <xsd:element name="Capability" type="wfs:CapabilityType"/>
           <xsd:element name="FeatureTypeList" type="wfs:FeatureTypeListType"/>
           <xsd:element ref="ogc:Filter_Capabilities" />
        </xsd:sequence>
  
        <!-- The version attribute specifies the specification revision
             to which this schema applies.  Its format is one,t two or three
             integers separated by periods: "x", or "x.y", or "x.y.z",
             with the most significant number appearing first.  Future
             revisions are guaranteed to be numbered in monotonically
             increasing fashion, though gaps may appear in the sequence. -->
        <xsd:attribute name="version"
                       type="xsd:string" fixed="1.0.0"/>
  
        <!-- The updateSequence attribute is a sequence number for
             managing propagation of the contents of this document.
             For example, if a Feature Server adds some data feature
             types it can increment the update sequence to inform
             catalog servers that their previously cached versions
             are now stale. The format is a positive integer. -->
        <xsd:attribute name="updateSequence"
                       type="xsd:nonNegativeInteger" default="0"/>
     </xsd:complexType>
  
     <xsd:complexType name="ServiceType">
        <xsd:sequence>
           <xsd:element name="Name" type="xsd:string"/>
           <xsd:element ref="wfs:Title"/>
           <xsd:element ref="wfs:Abstract" minOccurs="0"/>
           <xsd:element ref="wfs:Keywords" minOccurs="0"/>
           <xsd:element ref="wfs:OnlineResource"/>
           <xsd:element ref="wfs:Fees" minOccurs="0"/>
           <xsd:element ref="wfs:AccessConstraints" minOccurs="0"/>
        </xsd:sequence>
     </xsd:complexType>
  
     <xsd:complexType name="CapabilityType">
        <xsd:sequence>
           <xsd:element name="Request" type="wfs:RequestType"/>
           <!-- The optional VendorSpecificCapabilities element lists any
                capabilities unique to a particular server.  Because the
                information is not known a priori, it cannot be constrained
                by this particular schema document.  A vendor-specific schema
                fragment must be supplied at the start of the XML capabilities
                document, after the reference to the general WFS_Capabilities
                schema. -->
           <xsd:element ref="wfs:VendorSpecificCapabilities" minOccurs="0"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="FeatureTypeListType">
        <xsd:sequence>
           <xsd:element name="Operations"
                        type="wfs:OperationsType" minOccurs="0"/>
           <xsd:element name="FeatureType"
                        type="wfs:FeatureTypeType" maxOccurs="unbounded"/>
        </xsd:sequence>
     </xsd:complexType>
  
     <!-- Available WFS-defined request types are listed here. At
          least one of the values is required, but more than one
          may be given. -->
     <xsd:complexType name="RequestType">
        <xsd:choice maxOccurs="unbounded">
           <xsd:element name="GetCapabilities"
                        type="wfs:GetCapabilitiesType"/>
           <xsd:element name="DescribeFeatureType"
                        type="wfs:DescribeFeatureTypeType"/>
           <xsd:element name="Transaction"
                        type="wfs:TransactionType"/>
           <xsd:element name="GetFeature"
                        type="wfs:GetFeatureTypeType"/>
           <xsd:element name="GetFeatureWithLock"
                        type="wfs:GetFeatureTypeType"/>
           <xsd:element name="LockFeature"
                        type="wfs:LockFeatureTypeType"/>
        </xsd:choice>
     </xsd:complexType>
     <xsd:complexType name="GetCapabilitiesType">
        <xsd:sequence>
           <xsd:element name="DCPType"
                        type="wfs:DCPTypeType" maxOccurs="unbounded"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="DescribeFeatureTypeType">
        <xsd:sequence>
           <xsd:element name="SchemaDescriptionLanguage"
                        type="wfs:SchemaDescriptionLanguageType"/>
           <xsd:element name="DCPType"
                        type="wfs:DCPTypeType" maxOccurs="unbounded"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="TransactionType">
        <xsd:sequence>
           <xsd:element name="DCPType"
                        type="wfs:DCPTypeType" maxOccurs="unbounded"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="GetFeatureTypeType">
        <xsd:sequence>
           <xsd:element name="ResultFormat"
                        type="wfs:ResultFormatType"/>
           <xsd:element name="DCPType"
                        type="wfs:DCPTypeType" maxOccurs="unbounded"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="LockFeatureTypeType">
        <xsd:sequence>
           <xsd:element name="DCPType"
                        type="wfs:DCPTypeType" maxOccurs="unbounded"/>
        </xsd:sequence>
     </xsd:complexType>
  
     <!-- Available Distributed Computing Platforms (DCPs) are
          listed here.  At present, only HTTP is defined. -->
     <xsd:complexType name="DCPTypeType">
        <xsd:sequence>
           <xsd:element name="HTTP" type="wfs:HTTPType"/>
        </xsd:sequence>
     </xsd:complexType>
  
     <!-- A list of feature types available from
          this server.  The following table
          specifies the number and source of the
          various elements that are available for
          describing a feature type.
     
          element             number    comments
          =================   =======   ======================================
          Name                    1     this is the Name of the feature type
     
          Title                 0/1     an optional Meaningful title for the
                                        feature type  (e.g. "Ontario Roads"
                                        for ROADL_1M")
  
          Abstract              0/1     optional; no Default
     
          Keywords              0/1     optional; no Default
     
          SRS                     1     the SRS that should be used
                                        when specifying the state of
                                        the feature
  
          Operations            0/1     a list of available operations for
                                        the feature type
        
          LatLongBoundingBox      1+    bounding box(s) of data
        
          MetadataURL           0/1+    optional; no default
     -->
     <xsd:complexType name="FeatureTypeType">
        <xsd:sequence>
           <xsd:element name="Name" type="xsd:QName"/>
           <xsd:element ref="wfs:Title" minOccurs="0"/>
           <xsd:element ref="wfs:Abstract" minOccurs="0"/>
           <xsd:element ref="wfs:Keywords" minOccurs="0"/>
           <xsd:element ref="wfs:SRS"/>
           <xsd:element name="Operations"
                        type="wfs:OperationsType" minOccurs="0"/>
           <xsd:element name="LatLongBoundingBox"
                        type="wfs:LatLongBoundingBoxType"
                        minOccurs="0" maxOccurs="unbounded"/>
           <xsd:element name="MetadataURL"
                        type="wfs:MetadataURLType"
                        minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="GetType">
        <xsd:attribute name="onlineResource" type="xsd:string" use="required"/>
     </xsd:complexType>
  
     <!-- Available HTTP request methods. -->
     <xsd:complexType name="HTTPType">
        <xsd:choice maxOccurs="unbounded">
           <!-- HTTP request methods.  The onlineResourc attribute
                indicates the URL prefix for HTTP GET requests
                (everything before the question mark and query string:
                http://hostname[:port]/path/scriptname); for HTTP POST
                requests, onlineResource is the complete URL. -->
           <xsd:element name="Get" type="wfs:GetType"/>
           <xsd:element name="Post" type="wfs:PostType"/>
        </xsd:choice>
     </xsd:complexType>
  
     <!-- The LatLongBoundingBox element is used to indicate the edges of 
          an enclosing rectangle in the SRS of the associated feature type.
          Its purpose is to facilitate geographic searches  by indicating
          where instances of the particular feature type exist.  Since multiple
          LatLongBoundingBoxes can be specified, a WFS can indicate where 
          various clusters of data may exist.  This knowledge aids client 
          applications by letting them know where they should query in order 
          to have a high probability of finding data. -->
     <xsd:complexType name="LatLongBoundingBoxType">
        <xsd:attribute name="minx" type="xsd:string" use="required"/>
        <xsd:attribute name="miny" type="xsd:string" use="required"/>
        <xsd:attribute name="maxx" type="xsd:string" use="required"/>
        <xsd:attribute name="maxy" type="xsd:string" use="required"/>
     </xsd:complexType>
  
     <!-- A Web Feature Server MAY use zero or more MetadataURL
          elements to offer detailed, standardized metadata about
          the data underneath a particular feature type.  The type
          attribute indicates the standard to which the metadata
          complies; the format attribute indicates how the metadata is
          structured.  Two types are defined at present:
          'TC211' = ISO TC211 19115; 
          'FGDC'  = FGDC CSDGM. -->
     <xsd:complexType name="MetadataURLType">
        <xsd:simpleContent>
           <xsd:extension base="xsd:string">
              <xsd:attribute name="type" use="required">
                 <xsd:simpleType>
                    <xsd:restriction base="xsd:NMTOKEN">
                       <xsd:enumeration value="TC211"/>
                       <xsd:enumeration value="FGDC"/>
                    </xsd:restriction>
                 </xsd:simpleType>
              </xsd:attribute>
              <xsd:attribute name="format" use="required">
                 <xsd:simpleType>
                    <xsd:restriction base="xsd:NMTOKEN">
                       <xsd:enumeration value="XML"/>
                       <xsd:enumeration value="SGML"/>
                       <xsd:enumeration value="TXT"/>
                    </xsd:restriction>
                 </xsd:simpleType>
              </xsd:attribute>
           </xsd:extension>
        </xsd:simpleContent>
     </xsd:complexType>
     <xsd:complexType name="OperationsType">
        <xsd:choice maxOccurs="unbounded">
           <xsd:element ref="wfs:Insert"/>
           <xsd:element ref="wfs:Update"/>
           <xsd:element ref="wfs:Delete"/>
           <xsd:element ref="wfs:Query"/>
           <xsd:element ref="wfs:Lock"/>
        </xsd:choice>
     </xsd:complexType>
     <xsd:complexType name="PostType">
        <xsd:attribute name="onlineResource" type="xsd:string" use="required"/>
     </xsd:complexType>
  
     <!-- The ResultFormatType type defines the output formats that the
          web feature server can generate.  The mandatory format "GML2"
          must always be available.  Individual servers can define
          additional elements representing other output formats. -->
     <xsd:element name="GML2" type="wfs:EmptyType"/>
     <!-- WFS schema isn't enough, so we're adding these in for GeoServer as
          output types, so that our clients can validate their caps docs. -->
     <xsd:element name="GML2-GZIP" type="wfs:EmptyType"/>
     <xsd:element name="SHAPE-ZIP" type="wfs:EmptyType"/>
     <xsd:complexType name="ResultFormatType">
        <xsd:sequence maxOccurs="unbounded">
           <xsd:element ref="wfs:GML2"/>
           <xsd:element ref="wfs:GML2-GZIP" minOccurs="0"/>
           <xsd:element ref="wfs:SHAPE-ZIP" minOccurs="0"/>
        </xsd:sequence>
     </xsd:complexType>
  
     <!-- The SchemaDescriptionLanguageType type defines the schema languages
          that a feature server is capable of using to describe the schema
          of a feature.  Individual servers can define additional elements
          representing other schema languages but XMLSCHEMA must always
          be defined. -->
     <xsd:element name="XMLSCHEMA" type="wfs:EmptyType"/>
     <xsd:complexType name="SchemaDescriptionLanguageType">
        <xsd:sequence maxOccurs="unbounded">
           <xsd:element ref="wfs:XMLSCHEMA"/>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="EmptyType" />
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/wfs/1.0.0/WFS-transaction.xsd
  
  Index: WFS-transaction.xsd
  ===================================================================
  <?xml version="1.0"?>
  <xsd:schema
     targetNamespace="http://www.opengis.net/wfs"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:gml="http://www.opengis.net/gml"
     xmlns:ogc="http://www.opengis.net/ogc"
     xmlns:wfs="http://www.opengis.net/wfs"
     elementFormDefault="qualified">
  
     <!-- ==============================================================
          Includes and Imports
          ============================================================== -->
     <xsd:include schemaLocation="WFS-basic.xsd"/>
     <xsd:import namespace="http://www.opengis.net/gml"
                 schemaLocation="../../gml/2.1.2/feature.xsd"/>
     <xsd:import namespace="http://www.opengis.net/ogc"
                 schemaLocation="../../filter/1.0.0/filter.xsd"/>
  
     <!-- ==============================================================
           REQUEST MESSAGES
           ============================================================== -->
     <xsd:element name="GetFeatureWithLock" type="wfs:GetFeatureWithLockType">
        <xsd:annotation>
           <xsd:documentation>
              This is the root element for the GetFeatureWithLock request.
              The GetFeatureWithLock operation performs identically to a
              GetFeature request except that the GetFeatureWithLock request
              locks all the feature instances in the result set and returns
              a lock identifier to a client application in the response.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:element name="LockFeature" type="wfs:LockFeatureType">
        <xsd:annotation>
           <xsd:documentation>
              This is the root element for a LockFeature request.
              The LockFeature request can be used to lock one or
              more feature instances.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:element name="Transaction" type="wfs:TransactionType">
        <xsd:annotation>
           <xsd:documentation>
              This is the root element for a Transaction request.
              A transaction request allows insert, update and 
              delete operations to be performed to create, change
              or remove feature instances.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
  
     <!-- ==============================================================
           RESPONSE MESSAGES
           ============================================================== -->
     <xsd:element name="WFS_LockFeatureResponse"
                  type="wfs:WFS_LockFeatureResponseType">
        <xsd:annotation>
           <xsd:documentation>
              The WFS_LockFeatureResponse element contains a report
              about the completion status of a LockFeature request.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:element name="WFS_TransactionResponse"
                  type="wfs:WFS_TransactionResponseType">
        <xsd:annotation>
           <xsd:documentation>
              The WFS_TransactionResponse element contains a report
              about the completion status of a Transaction operation.  
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
  
     <!-- ==============================================================
           COMMON ATTRIBUTE DOCUMENTATION
           ============================================================== 
           EXPIRY:
              The expiry attribute value is specified in minutes. It
              indicates how long a Web Feature Service should wait to
              receive a request from the client application that locked
              the feature instances.  If the specified time elapses and
              no request has been received by a Web Feature Service that
              references the lockId given to the client application, then
              the locks maintained by the Web Feature Service shall be
              released and the lockId that references the locked features
              shall now be invalid.  If the expiry attribute is not specified,
              then the feature instances shall be locked indefinitely and the
              intervention of an administrator may be required to release
              the locks. -->
  
     <!-- ==============================================================
           TYPES
           ============================================================== -->
     <!-- GETFEATUREWITHLOCK -->
     <xsd:complexType name="GetFeatureWithLockType">
        <xsd:annotation>
           <xsd:documentation>
              A GetFeatureWithLock request operates identically to a
              GetFeature request expect that it attempts to lock the
              feature instances in the result set and includes a lock
              identifier in its response to a client.  A lock identifier
              is an identifier generated by a Web Feature Service that 
              a client application can use, in subsequent operations,
              to reference the locked set of feature instances.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
           <xsd:element ref="wfs:Query" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="version"
                       type="xsd:string" use="required" fixed="1.0.0"/>
        <xsd:attribute name="service"
                       type="xsd:string" use="required" fixed="WFS"/>
        <xsd:attribute name="handle"
                       type="xsd:string" use="optional"/>
        <xsd:attribute name="expiry"
                       type="xsd:positiveInteger" use="optional"/>
        <xsd:attribute name="outputFormat"
                       type="xsd:string" use="optional" default="GML2"/>
        <xsd:attribute name="maxFeatures"
                       type="xsd:positiveInteger" use="optional"/>
     </xsd:complexType>
     <!-- LOCKFEATURE -->
     <xsd:complexType name="LockFeatureType">
        <xsd:annotation>
           <xsd:documentation>
              This type defines the LockFeature operation.  The LockFeature
              element contains one or more Lock elements that define
              which features of a particular type should be locked.  A lock
              identifier (lockId) is returned to the client application which
              can be used by subsequent operations to reference the locked
              features.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
           <xsd:element name="Lock" type="wfs:LockType" maxOccurs="unbounded">
              <xsd:annotation>
                 <xsd:documentation>
                    The lock element is used to indicate which feature 
                    instances of particular type are to be locked.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="version"
                       type="xsd:string" use="required" fixed="1.0.0"/>
        <xsd:attribute name="service"
                       type="xsd:string" use="required" fixed="WFS"/>
        <xsd:attribute name="expiry"
                       type="xsd:positiveInteger" use="optional"/>
        <xsd:attribute name="lockAction"
                       type="wfs:AllSomeType" use="optional">
           <xsd:annotation>
              <xsd:documentation>
                 The lockAction attribute is used to indicate what
                 a Web Feature Service should do when it encounters
                 a feature instance that has already been locked by
                 another client application.
  
                 Valid values are ALL or SOME.
  
                 ALL means that the Web Feature Service must acquire
                 locks on all the requested feature instances.  If it
                 cannot acquire those locks then the request should
                 fail.  In this instance, all locks acquired by the
                 operation should be released.
   
                 SOME means that the Web Feature Service should lock
                 as many of the requested features as it can.
              </xsd:documentation>
           </xsd:annotation>
        </xsd:attribute>
     </xsd:complexType>
     <xsd:complexType name="LockType">
        <xsd:annotation>
           <xsd:documentation>
              This type defines the Lock element.  The Lock element
              defines a locking operation on feature instances of 
              a single type. An OGC Filter is used to constrain the
              scope of the operation.  Features to be locked can be
              identified individually by using their feature identifier
              or they can be locked by satisfying the spatial and 
              non-spatial constraints defined in the filter.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
           <xsd:element ref="ogc:Filter" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="handle" 
                       type="xsd:string" use="optional"/>
        <xsd:attribute name="typeName" 
                       type="xsd:QName" use="required"/>
     </xsd:complexType>
     <!-- TRANSACTION -->
     <xsd:complexType name="TransactionType">
        <xsd:annotation>
           <xsd:documentation>
              The TranactionType defines the Transaction operation.  A
              Transaction element contains one or more Insert, Update
              Delete and Native elements that allow a client application
              to create, modify or remove feature instances from the 
              feature repository that a Web Feature Service controls.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
           <xsd:element ref="wfs:LockId" minOccurs="0">
              <xsd:annotation>
                 <xsd:documentation>
                    In order for a client application to operate upon locked
                    feature instances, the Transaction request must include
                    the LockId element.  The content of this element must be
                    the lock identifier the client application obtained from
                    a previous GetFeatureWithLock or LockFeature operation.
  
                    If the correct lock identifier is specified the Web
                    Feature Service knows that the client application may
                    operate upon the locked feature instances.
  
                    No LockId element needs to be specified to operate upon
                    unlocked features.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
           <xsd:choice minOccurs="0" maxOccurs="unbounded">
              <xsd:element ref="wfs:Insert"/>
              <xsd:element ref="wfs:Update"/>
              <xsd:element ref="wfs:Delete"/>
              <xsd:element ref="wfs:Native"/>
           </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="version"
                       type="xsd:string" use="required" fixed="1.0.0"/>
        <xsd:attribute name="service"
                       type="xsd:string" use="required" fixed="WFS"/>
        <xsd:attribute name="handle"
                       type="xsd:string" use="optional"/>
        <xsd:attribute name="releaseAction"
                       type="wfs:AllSomeType" use="optional">
           <xsd:annotation>
              <xsd:documentation>
                 The releaseAction attribute is used to control how a Web
                 Feature service releases locks on feature instances after
                 a Transaction request has been processed.
  
                 Valid values are ALL or SOME.
  
                 A value of ALL means that the Web Feature Service should
                 release the locks of all feature instances locked with the
                 specified lockId, regardless or whether or not the features
                 were actually modified.
  
                 A value of SOME means that the Web Feature Service will 
                 only release the locks held on feature instances that 
                 were actually operated upon by the transaction.  The lockId
                 that the client application obtained shall remain valid and
                 the other, unmodified, feature instances shall remain locked.
                 If the expiry attribute was specified in the original operation 
                 that locked the feature instances, then the expiry counter
                 will be reset to give the client application that same amount
                 of time to post subsequent transactions against the locked
                 features.
              </xsd:documentation>
           </xsd:annotation>
        </xsd:attribute>
     </xsd:complexType>
     <xsd:element name="LockId" type="xsd:string">
        <xsd:annotation>
           <xsd:documentation>
              The LockId element contains the value of the lock identifier
              obtained by a client application from a previous GetFeatureWithLock
              or LockFeature request.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:element name="Insert" type="wfs:InsertElementType">
        <xsd:annotation>
           <xsd:documentation>
              The Insert element is used to indicate that the Web Feature
              Service should create a new instance of a feature type.  The
              feature instance is specified using GML2 and one or more 
              feature instances to be created can be contained inside the
              Insert element.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:complexType name="InsertElementType">
        <xsd:sequence>
           <xsd:element ref="gml:_Feature" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="handle" type="xsd:string" use="optional"/>
     </xsd:complexType>
     <xsd:element name="Update" type="wfs:UpdateElementType">
        <xsd:annotation>
           <xsd:documentation>
              One or more existing feature instances can be changed by
              using the Update element.  Changing a feature instance
              means that the current value of one or more properties of
              the feature are replaced with new values.  The Update
              element contains  one or more Property elements.  A
              Property element contains the name or a feature property
              who's value is to be changed and the replacement value
              for that property.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:complexType name="UpdateElementType">
        <xsd:sequence>
           <xsd:element ref="wfs:Property" maxOccurs="unbounded" />
           <xsd:element ref="ogc:Filter" minOccurs="0" maxOccurs="1">
              <xsd:annotation>
                 <xsd:documentation>
                    The Filter element is used to constrain the scope
                    of the update operation to those features identified
                    by the filter.  Feature instances can be specified
                    explicitly and individually using the identifier of
                    each feature instance OR a set of features to be
                    operated on can be identified by specifying spatial
                    and non-spatial constraints in the filter.
                    If no filter is specified, then the update operation 
                    applies to all feature instances.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="handle" type="xsd:string" use="optional"/>
        <xsd:attribute name="typeName" type="xsd:QName" use="required"/>
     </xsd:complexType>
     <xsd:element name="Delete" type="wfs:DeleteElementType">
        <xsd:annotation>
           <xsd:documentation>
              The Delete element is used to indicate that one or more
              feature instances should be removed from the feature
              repository.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:complexType name="DeleteElementType">
        <xsd:sequence>
           <xsd:element ref="ogc:Filter" minOccurs="1" maxOccurs="1">
              <xsd:annotation>
                 <xsd:documentation>
                    The Filter element is used to constrain the scope
                    of the delete operation to those features identified
                    by the filter.  Feature instances can be specified
                    explicitly and individually using the identifier of
                    each feature instance OR a set of features to be
                    operated on can be identified by specifying spatial
                    and non-spatial constraints in the filter.
                    If no filter is specified then an exception should
                    be raised since it is unlikely that a client application
                    intends to delete all feature instances.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="handle" type="xsd:string" use="optional"/>
        <xsd:attribute name="typeName" type="xsd:QName" use="required"/>
     </xsd:complexType>
     <xsd:element name="Native" type="wfs:NativeType">
        <xsd:annotation>
           <xsd:documentation>
              Many times, a Web Feature Service interacts with a repository
              that may have special vendor specific capabilities.  The native
              element allows vendor specific command to be passed to the
              repository via the Web Feature Service.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:complexType name="NativeType">
        <xsd:attribute name="vendorId" type="xsd:string" use="required">
           <xsd:annotation>
              <xsd:documentation>
                 The vendorId attribute is used to specify the name of
                 vendor who's vendor specific command the client
                 application wishes to execute.
              </xsd:documentation>
           </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="safeToIgnore" type="xsd:boolean" use="required">
           <xsd:annotation>
              <xsd:documentation>
                 In the event that a Web Feature Service does not recognize
                 the vendorId or does not recognize the vendor specific command,
                 the safeToIgnore attribute is used to indicate whether the 
                 exception can be safely ignored.  A value of TRUE means that
                 the Web Feature Service may ignore the command.  A value of
                 FALSE means that a Web Feature Service cannot ignore the
                 command and an exception should be raised if a problem is 
                 encountered.
              </xsd:documentation>
           </xsd:annotation>
        </xsd:attribute>
     </xsd:complexType>
  
     <!-- define structure to specify a property value -->
     <xsd:element name="Property" type="wfs:PropertyType">
        <xsd:annotation>
           <xsd:documentation>
              The Property element is used to specify the new
              value of a feature property inside an Update element.
           </xsd:documentation>
        </xsd:annotation>
     </xsd:element>
     <xsd:complexType name="PropertyType">
        <xsd:sequence>
           <xsd:element name="Name" type="xsd:string">
              <xsd:annotation>
                 <xsd:documentation>
                    The Name element contains the name of a feature property
                    to be updated.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
           <xsd:element name="Value" minOccurs="0">
              <xsd:annotation>
                 <xsd:documentation>
                    The Value element contains the replacement value for the
                    named property.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
        </xsd:sequence>
     </xsd:complexType>
     <!-- RESPONSE TYPES -->
     <xsd:complexType name="WFS_LockFeatureResponseType">
        <xsd:annotation>
           <xsd:documentation>
              The WFS_LockFeatureResponseType is used to define an
              element to contains the response to a LockFeature
              operation.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
           <xsd:element ref="wfs:LockId">
              <xsd:annotation>
                 <xsd:documentation>
                    The WFS_LockFeatureResponse includes a LockId element
                    that contains a lock identifier.  The lock identifier
                    can be used by a client, in subsequent operations, to
                    operate upon the locked feature instances.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
           <xsd:element name="FeaturesLocked"
                        type="wfs:FeaturesLockedType" minOccurs="0">
              <xsd:annotation>
                 <xsd:documentation>
                    The LockFeature or GetFeatureWithLock operations
                    identify and attempt to lock a set of feature 
                    instances that satisfy the constraints specified 
                    in the request.  In the event that the lockAction
                    attribute (on the LockFeature or GetFeatureWithLock
                    elements) is set to SOME, a Web Feature Service will
                    attempt to lock as many of the feature instances from
                    the result set as possible.
  
                    The FeaturesLocked element contains list of ogc:FeatureId
                    elements enumerating the feature instances that a WFS
                    actually managed to lock.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
           <xsd:element name="FeaturesNotLocked"
                        type="wfs:FeaturesNotLockedType" minOccurs="0">
              <xsd:annotation>
                 <xsd:documentation>
                    In contrast to the FeaturesLocked element, the
                    FeaturesNotLocked element contains a list of 
                    ogc:Filter elements identifying feature instances
                    that a WFS did not manage to lock because they were
                    already locked by another process.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="FeaturesLockedType">
       <xsd:sequence maxOccurs="unbounded">
         <xsd:element ref="ogc:FeatureId"/>
       </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="FeaturesNotLockedType">
       <xsd:sequence maxOccurs="unbounded">
         <xsd:element ref="ogc:FeatureId"/>
       </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="WFS_TransactionResponseType">
        <xsd:annotation>
           <xsd:documentation>
              The WFS_TransactionResponseType defines the format of
              the XML document that a Web Feature Service generates 
              in response to a Transaction request.  The response 
              includes the completion status of the transaction 
              and the feature identifiers of any newly created
              feature instances.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
           <xsd:element name="InsertResult"
                        type="wfs:InsertResultType"
                        minOccurs="0" maxOccurs="unbounded">
              <xsd:annotation>
                 <xsd:documentation>
                    The InsertResult element contains a list of ogc:FeatureId
                    elements that identify any newly created feature instances.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
           <xsd:element name="TransactionResult"
                        type="wfs:TransactionResultType">
              <xsd:annotation>
                 <xsd:documentation>
                    The TransactionResult element contains a Status element
                    indicating the completion status of a transaction.  In
                    the event that the transaction fails, additional element
                    may be included to help locate which part of the transaction
                    failed and why.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="version"
                       type="xsd:string" use="required" fixed="1.0.0"/>
     </xsd:complexType>
     <xsd:complexType name="TransactionResultType">
        <xsd:sequence>
           <xsd:element name="Status" type="wfs:StatusType">
              <xsd:annotation>
                 <xsd:documentation>
                    The Status element contains an element indicating the
                    completion status of a transaction.  The SUCCESS element
                    is used to indicate successful completion.  The FAILED
                    element is used to indicate that an exception was 
                    encountered.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
           <xsd:element name="Locator" type="xsd:string" minOccurs="0">
              <xsd:annotation>
                 <xsd:documentation>
                    In the event that an exception was encountered while 
                    processing a transaction, a Web Feature Service may
                    use the Locator element to try and identify the part
                    of the transaction that failed.  If the element(s)
                    contained in a Transaction element included a handle
                    attribute, then a Web Feature Service may report the
                    handle to identify the offending element.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
           <xsd:element name="Message" type="xsd:string" minOccurs="0">
              <xsd:annotation>
                 <xsd:documentation>
                    The Message element may contain an exception report
                    generated by a Web Feature Service when an exception
                    is encountered.
                 </xsd:documentation>
              </xsd:annotation>
           </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="handle" type="xsd:string" use="optional"/>
     </xsd:complexType>
     <xsd:complexType name="InsertResultType">
        <xsd:sequence>
           <xsd:element ref="ogc:FeatureId" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="handle" type="xsd:string" use="optional"/>
     </xsd:complexType>
     <xsd:complexType name="StatusType">
        <xsd:choice>
           <xsd:element ref="wfs:SUCCESS"/>
           <xsd:element ref="wfs:FAILED"/>
           <xsd:element ref="wfs:PARTIAL"/>
        </xsd:choice>
     </xsd:complexType>
     <xsd:element name="SUCCESS" type="wfs:EmptyType"/>
     <xsd:element name="FAILED" type="wfs:EmptyType"/>
     <xsd:element name="PARTIAL" type="wfs:EmptyType"/>
     <!-- MISC TYPES -->
     <xsd:complexType name="EmptyType"/>
     <xsd:simpleType name="AllSomeType">
        <xsd:restriction base="xsd:string">
           <xsd:enumeration value="ALL"/>
           <xsd:enumeration value="SOME"/>
        </xsd:restriction>
     </xsd:simpleType>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/wms/1.1.1/OGC-exception.xsd
  
  Index: OGC-exception.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema
     targetNamespace="http://www.opengis.net/ogc"
     xmlns:ogc="http://www.opengis.net/ogc"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="qualified">
  
     <xsd:element name="ServiceExceptionReport">
        <xsd:annotation>
           <xsd:documentation>
              The ServiceExceptionReport element contains one
              or more ServiceException elements that describe
              a service exception.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
           <xsd:sequence>
              <xsd:element name="ServiceException"
                           type="ogc:ServiceExceptionType"
                           minOccurs="0" maxOccurs="unbounded">
                 <xsd:annotation>
                    <xsd:documentation>
                       The Service exception element is used to describe 
                       a service exception.
                    </xsd:documentation>
                 </xsd:annotation>
              </xsd:element>
           </xsd:sequence>
           <xsd:attribute name="version" type="xsd:string" fixed="1.2.0"/>
        </xsd:complexType>
     </xsd:element>
  
     <xsd:complexType name="ServiceExceptionType">
        <xsd:annotation>
           <xsd:documentation>
              The ServiceExceptionType type defines the ServiceException
              element.  The content of the element is an exception message
              that the service wished to convey to the client application.
           </xsd:documentation>
        </xsd:annotation>
        <xsd:simpleContent>
           <xsd:extension base="xsd:string">
              <xsd:attribute name="code" type="xsd:string">
                 <xsd:annotation>
                    <xsd:documentation>
                       A service may associate a code with an exception
                       by using the code attribute.
                    </xsd:documentation>
                 </xsd:annotation>
              </xsd:attribute>
              <xsd:attribute name="locator" type="xsd:string">
                 <xsd:annotation>
                    <xsd:documentation>
                       The locator attribute may be used by a service to
                       indicate to a client where in the client's request
                       an exception was encountered.  If the request included
                       a 'handle' attribute, this may be used to identify the
                       offending component of the request.  Otherwise the 
                       service may try to use other means to locate the 
                       exception such as line numbers or byte offset from the
                       begining of the request, etc ...
                    </xsd:documentation>
                 </xsd:annotation>
              </xsd:attribute>
           </xsd:extension>
        </xsd:simpleContent>
     </xsd:complexType>
  </xsd:schema>
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd
  
  Index: WMS_DescribeLayerResponse.dtd
  ===================================================================
  <!-- WMS_DescribeLayerResponse: the document is returned in response to a DescribeLayer request made on a WMS. -->
  
  <!ELEMENT WMS_DescribeLayerResponse (LayerDescription*) >
  <!ATTLIST WMS_DescribeLayerResponse
              version CDATA #REQUIRED >
  
  <!-- LayerDescription: describes the contents of a NamedLayer, the name of which is specified in the ‘name’ attribute.  If the NamedLayer is not feature based, then the LayerDescription has no further contents.  If the NamedLayer is feature based then the ‘wfs’ attribute gives the URL prefix for the WFS containing the feature data.  Equivalently, the ‘owsType’ and ‘owsURL’ attributes can be used to indicate the OWS type & base URL of a service.  The ‘wfs’ attribute is retained for greater compatibility with the WFS specification.  The presently recognized valid values for ‘owsType’ are “WFS” and “WCS”, though more may be allowed in the future.
  
  The LayerDescription contains one or more Query elements that specify the feature-types present in the NamedLayer. -->
  
  <!ELEMENT LayerDescription (Query*) >
  <!ATTLIST LayerDescription
              name CDATA #REQUIRED
              wfs CDATA #IMPLIED
              owsType CDATA #IMPLIED
              owsURL CDATA #IMPLIED >
  
  <!-- Query: a Query uses the ‘typeName’ attribute to identify a feature/coverage-type.  This is a stripped down version of the Query element used in the WFS. -->
  
  <!ELEMENT Query EMPTY >
  <!ATTLIST Query
              typeName CDATA #REQUIRED >
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd
  
  Index: WMS_MS_Capabilities.dtd
  ===================================================================
  <!ELEMENT WMT_MS_Capabilities (Service, Capability) >
  
  <!ATTLIST WMT_MS_Capabilities
  	  version CDATA #FIXED "1.1.1"
  	  updateSequence CDATA #IMPLIED>
  
  <!-- Elements used in multiple places. -->
  
  <!-- The Name is typically for machine-to-machine communication. -->
  <!ELEMENT Name (#PCDATA) >
  
  <!-- The Title is for informative display to a human. -->
  <!ELEMENT Title (#PCDATA) >
  
  <!-- The abstract is a longer narrative description of an object. -->
  <!ELEMENT Abstract (#PCDATA) > 
  
  <!-- An OnlineResource is typically an HTTP URL.  The URL is placed in the
  xlink:href attribute.  The xmlns:xlink attribute is a required XML namespace
  declaration. -->
  <!ELEMENT OnlineResource EMPTY>
  <!ATTLIST OnlineResource
            xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"
            xlink:type CDATA #FIXED "simple"
            xlink:href CDATA #REQUIRED >
  
  <!-- A container for listing an available format's MIME type. -->
  <!ELEMENT Format (#PCDATA) >
  
  
  <!-- General service metadata. -->
  
  <!ELEMENT Service (Name, Title, Abstract?, KeywordList?, OnlineResource,
                     ContactInformation?, Fees?, AccessConstraints?) >
  
  <!-- List of keywords or keyword phrases to help catalog searching. -->
  <!ELEMENT KeywordList (Keyword*) >
  
  <!-- A single keyword or phrase. -->
  <!ELEMENT Keyword (#PCDATA) >
  
  <!-- Information about a contact person for the service. -->
  <!ELEMENT ContactInformation  (ContactPersonPrimary?, ContactPosition?,
                                 ContactAddress?, ContactVoiceTelephone?,
                                 ContactFacsimileTelephone?,
                                 ContactElectronicMailAddress?) >
  
  <!--The primary contact person.-->
  <!ELEMENT ContactPersonPrimary  (ContactPerson, ContactOrganization) >
  
  <!--The person to contact.-->
  <!ELEMENT ContactPerson  (#PCDATA) >
  
  <!--The organization supplying the service.-->
  <!ELEMENT ContactOrganization  (#PCDATA) >
  
  <!--The position title for the contact person.-->
  <!ELEMENT ContactPosition  (#PCDATA) >
  
  <!--The address for the contact supplying the service.-->
  <!ELEMENT ContactAddress  (AddressType,Address,City,StateOrProvince,PostCode,
                 Country) >
  
  <!--The type of address.-->
  <!ELEMENT AddressType  (#PCDATA) >
  
  <!--The street address.-->
  <!ELEMENT Address  (#PCDATA) >
  
  <!--The address city.-->
  <!ELEMENT City  (#PCDATA) >
  
  <!--The state or province.-->
  <!ELEMENT StateOrProvince  (#PCDATA) >
  
  <!--The zip or postal code.-->
  <!ELEMENT PostCode  (#PCDATA) >
  
  <!--The address country.-->
  <!ELEMENT Country  (#PCDATA) >
  
  <!--Contact telephone number.-->
  <!ELEMENT ContactVoiceTelephone  (#PCDATA) >
  
  <!--The contact fax number.-->
  <!ELEMENT ContactFacsimileTelephone  (#PCDATA) >
  
  <!--The e-mail address for the contact.-->
  <!ELEMENT ContactElectronicMailAddress  (#PCDATA) >
  
  
  <!-- Elements indicating what fees or access constraints are imposed. -->
  <!ELEMENT Fees (#PCDATA)>
  <!ELEMENT AccessConstraints (#PCDATA)>
  
  
  <!-- A Capability lists available request types, how exceptions
  may be reported, and whether any vendor-specific capabilities are defined.  It
  also includes an optional list of map layers available from this server. -->
  <!ELEMENT Capability 
            (Request, Exception, VendorSpecificCapabilities?,
  	   UserDefinedSymbolization?, Layer?) >
  
  <!-- Available WMS Operations are listed in a Request element. -->
  <!ELEMENT Request (GetCapabilities, GetMap, GetFeatureInfo?,
                     DescribeLayer?, GetLegendGraphic?, GetStyles?, PutStyles?) >
  
  <!-- For each operation offered by the server, list the available output
  formats and the online resource. -->
  <!ELEMENT GetCapabilities (Format+, DCPType+)>
  <!ELEMENT GetMap (Format+, DCPType+)>
  <!ELEMENT GetFeatureInfo (Format+, DCPType+)>
  <!-- The following optional operations only apply to SLD-enabled WMS -->
  <!ELEMENT DescribeLayer (Format+, DCPType+)>
  <!ELEMENT GetLegendGraphic (Format+, DCPType+)>
  <!ELEMENT GetStyles (Format+, DCPType+)>
  <!ELEMENT PutStyles (Format+, DCPType+)>
  
  <!-- Available Distributed Computing Platforms (DCPs) are
  listed here.  At present, only HTTP is defined. -->
  <!ELEMENT DCPType (HTTP) >
  
  <!-- Available HTTP request methods.  One or both may be supported. -->
  <!ELEMENT HTTP (Get | Post)+ >
  
  <!-- URL prefix for each HTTP request method. -->
  <!ELEMENT Get (OnlineResource) >
  <!ELEMENT Post (OnlineResource) >
  
  <!-- An Exception element indicates which error-reporting formats are supported. -->
  <!ELEMENT Exception (Format+)>
  
  <!-- Optional user-defined symbolization (used only by SLD-enabled WMSes). -->
  <!ELEMENT UserDefinedSymbolization EMPTY >
  <!ATTLIST UserDefinedSymbolization
            SupportSLD (0 | 1) "0"
            UserLayer (0 | 1) "0"
            UserStyle (0 | 1) "0"
            RemoteWFS (0 | 1) "0" >
  
  <!-- Nested list of zero or more map Layers offered by this server. -->
  <!ELEMENT Layer ( Name?, Title, Abstract?, KeywordList?, SRS*,
                    LatLonBoundingBox?, BoundingBox*, Dimension*, Extent*,
                    Attribution?, AuthorityURL*, Identifier*, MetadataURL*, DataURL*,
                    FeatureListURL*, Style*, ScaleHint?, Layer* ) >
  
  <!-- Optional attributes-->
  <!ATTLIST Layer queryable (0 | 1) "0"
                  cascaded CDATA #IMPLIED
                  opaque (0 | 1) "0"
                  noSubsets (0 | 1) "0"
                  fixedWidth CDATA #IMPLIED
                  fixedHeight CDATA #IMPLIED >
            
  <!-- Identifier for a single Spatial Reference Systems (SRS). -->
  <!ELEMENT SRS (#PCDATA) >
  
  <!-- The LatLonBoundingBox attributes indicate the edges of the enclosing
  rectangle in latitude/longitude decimal degrees (as in SRS EPSG:4326 [WGS1984
  lat/lon]). -->
  <!ELEMENT LatLonBoundingBox EMPTY>
  <!ATTLIST LatLonBoundingBox 
            minx CDATA #REQUIRED
            miny CDATA #REQUIRED
            maxx CDATA #REQUIRED
            maxy CDATA #REQUIRED>
  
  <!-- The BoundingBox attributes indicate the edges of the bounding box
  in units of the specified spatial reference system. -->
  <!ELEMENT BoundingBox EMPTY>
  <!ATTLIST BoundingBox 
            SRS CDATA #REQUIRED
            minx CDATA #REQUIRED
            miny CDATA #REQUIRED
            maxx CDATA #REQUIRED
            maxy CDATA #REQUIRED
            resx CDATA #IMPLIED
            resy CDATA #IMPLIED>
  
  <!-- The Dimension element declares the _existence_ of a dimension. -->
  <!ELEMENT Dimension EMPTY >
  <!ATTLIST Dimension
            name CDATA #REQUIRED
            units CDATA #REQUIRED
            unitSymbol CDATA #IMPLIED>
  
  <!-- The Extent element indicates what _values_ along a dimension are valid. -->
  <!ELEMENT Extent (#PCDATA) >
  <!ATTLIST Extent
            name CDATA #REQUIRED
            default CDATA #IMPLIED
            nearestValue (0 | 1) "0">
  
  <!-- Attribution indicates the provider of a Layer or collection of Layers.
  The provider's URL, descriptive title string, and/or logo image URL may be
  supplied.  Client applications may choose to display one or more of these
  items.  A format element indicates the MIME type of the logo image located at
  LogoURL.  The logo image's width and height assist client applications in
  laying out space to display the logo. -->
  <!ELEMENT Attribution ( Title?, OnlineResource?, LogoURL? )>
  <!ELEMENT LogoURL (Format, OnlineResource) >
  <!ATTLIST LogoURL
            width NMTOKEN #REQUIRED
            height NMTOKEN #REQUIRED>
  
  <!-- A Map Server may use zero or more MetadataURL elements to offer detailed,
  standardized metadata about the data underneath a particular layer. The type
  attribute indicates the standard to which the metadata complies.  Two types
  are defined at present: 'TC211' = ISO TC211 19115; 'FGDC' = FGDC CSDGM.  The
  format element indicates how the metadata is structured. -->
  <!ELEMENT MetadataURL (Format, OnlineResource) >
  <!ATTLIST MetadataURL
            type ( TC211 | FGDC ) #REQUIRED>
  
  <!-- A Map Server may use zero or more Identifier elements to list ID numbers
  or labels defined by a particular Authority.  For example, the Global Change
  Master Directory (gcmd.gsfc.nasa.gov) defines a DIF_ID label for every
  dataset.  The authority name and explanatory URL are defined in a separate
  AuthorityURL element, which may be defined once and inherited by subsidiary
  layers.  Identifiers themselves are not inherited. -->
  
  <!ELEMENT AuthorityURL (OnlineResource) >
  <!ATTLIST AuthorityURL
            name NMTOKEN #REQUIRED >
  <!ELEMENT Identifier (#PCDATA) >
  <!ATTLIST Identifier
            authority CDATA #REQUIRED >
  
  <!-- A Map Server may use DataURL to offer more information about the data
  underneath a particular layer. While the semantics are not well-defined, as
  long as the results of an HTTP GET request against the DataURL are properly
  MIME-typed, Viewer Clients and Cascading Map Servers can make use of this. -->
  <!ELEMENT DataURL (Format, OnlineResource) >
  
  <!-- A Map Server may use FeatureListURL to point to a list of the features
  represented in a Layer. -->
  <!ELEMENT FeatureListURL (Format, OnlineResource) >
  
  <!-- A Style element lists the name by which a style is requested and a
  human-readable title for pick lists, optionally (and ideally) provides a
  human-readable description, and optionally gives a style URL. -->
  <!ELEMENT Style ( Name, Title, Abstract?,
                    LegendURL*, StyleSheetURL?, StyleURL? ) >
  
  <!-- A Map Server may use zero or more LegendURL elements to provide an
  image(s) of a legend relevant to each Style of a Layer.  The Format element
  indicates the MIME type of the legend. Width and height attributes are
  provided to assist client applications in laying out space to display the
  legend. -->
  <!ELEMENT LegendURL (Format, OnlineResource) >
  <!ATTLIST LegendURL
            width NMTOKEN #REQUIRED
            height NMTOKEN #REQUIRED>
  
  <!-- StyleSheeetURL provides symbology information foreach Style of a Layer. -->
  <!ELEMENT StyleSheetURL (Format, OnlineResource) >
  
  <!-- A Map Server may use StyleURL to offer more information about the data or
  symbology underlying a particular Style. While the semantics are not
  well-defined, as long as the results of an HTTP GET request against the
  StyleURL are properly MIME-typed, Viewer Clients and Cascading Map Servers can
  make use of this. A possible use could be to allow a Map Server to provide
  legend information. -->
  <!ELEMENT StyleURL (Format, OnlineResource) >
  
  <!-- Minimum and maximum scale hints for which it is appropriate to
  display this layer. -->
  <!ELEMENT ScaleHint EMPTY>
  <!ATTLIST ScaleHint
            min CDATA #REQUIRED
            max CDATA #REQUIRED>
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/geoserver/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd
  
  Index: WMS_exception_1_1_1.dtd
  ===================================================================
  <!ELEMENT ServiceExceptionReport (ServiceException*)>
  <!ATTLIST ServiceExceptionReport version CDATA #FIXED "1.1.1">
  
  <!ELEMENT ServiceException (#PCDATA)>
  <!ATTLIST ServiceException code CDATA #IMPLIED>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/CHANGES
  
  Index: CHANGES
  ===================================================================
  
  mapbuilder-lib Release Information
  ==================================
  $Id$
  
  This file contains information about updates to each release:
  
  mapbuilder-lib-1.0-release
  ==========================
  This marks the first official release of the Community Mapbuilder
  library.
  
  Bugs fixed:
  -----------
  MAP-68		IE: MapPane refreshing layers 
  MAP-73 		js error passing bbox in via URL (was bug 1391168 on Sourceforge - resubmitted here) 
  MAP-60 		Demis demo - AOIForm.xsl error 
  MAP-104 	WFS-T demo errors 
  MAP-103 	update config schema to 1.0 
  MAP-102 	thisWidget is null in contextEditor search form 
  MAP-99 		localName is not supported by IE 
  MAP-72 		cgiArgs bbox is broken 
  MAP-44 		hide layer not working in IE Submitted: camerons SF-1364550 
  MAP-98 		Time Series demo zoom in should reset the movie loop 
  MAP-97 		support WMS 1.0 in WmsCapabilities model 
  MAP-77 		simple/basic demos 
  MAP-62 		config text stylesheet should override widgetText file values 
  MAP-61 		clarify NASA time series loading 
  MAP-54 		CSS Buttons Submitted By: Mike Adair SF - 1195495 
  MAP-48 		show busy signal Submitted: Steven M Ottens SF - 1322587 
  MAP-41 		MapPane HTML 4.01 and XHTML compatibility Submitted: sgillies SF-1294608 
  MAP-18 		js error passing bbox in via URL submitted: davidherbert2 SF-1391168 
  MAP-8 		GetFeatureInfo fails against GeoServer WMS Submitted: kc7bfi SF-1400525 
  MAP-101 	Proj.js attribution 
  MAP-78 		demo contexts updates 
  MAP-74 		Stop refreshing the UI controls!!! 
  MAP-64 		incorrect aspect ratio in modisWorld context file 
  MAP-33 		Gml point opacity - transparensity has changed Submitted: maiqui SF-1258381 
  MAP-30 		Links in mapbuilder/index.html broker Submitted: camerons SF-1164770 
  MAP-28 		query icon Submitted: tomkralidis SF-968519 
  
  Outstanding Issues (highest priority first):
  --------------------------------------------
  MAP-105 	Pixel Coord <--> LatLong translation only works for EPSG:4326 projections
  MAP-95 		Acceptance Tests
  MAP-94 		New GUI Widgets
  MAP-93 		User authenticates with the system in order to make modifications to the map features (Add/remove/delete)
  MAP-92 		Interface with OpenStreetMap project
  MAP-91 		Interface with Google Maps
  MAP-90 		Demis Maps
  MAP-88 		Map Feature Rendering: SLD
  MAP-87 		Map Feature Rendering: Satelite imagery
  MAP-84 		Gazetteer/GeoCoder
  MAP-83 		Map Feature Rendering: XML/GML
  MAP-82 		Map Annotation
  MAP-81 		Map Symbology
  MAP-76 		Invalid GetFeatureInfo URL - creates MapServer exception
  MAP-70 		add WSDL/SOAP support
  MAP-19 		IE problem: "Error: 'this.doc' is null or not an object Submitted: Cappelaere SF-1390868
  MAP-9 		Layer Control does not update when a new layer is loaded Submitted: Cappelaere SF-1393270
  MAP-6 		Problem with two WMS layers with the same name submitted: kc7bfi SF-1400521
  MAP-2 		Hardcoded reference to localhost will prevent remote machines from viewing Generated Content
  MAP-100 	A reload/refresh main map pane widget
  MAP-96 		The php server scripts use short tags, this breaks on servers that have disabled use of shortags
  MAP-89 		Moving Objects
  MAP-86 		Map Widgets: Scale Bar
  MAP-85 		Map Widgets: Distance
  MAP-80 		Map Data Repository
  MAP-79 		Build a Mapuilder Application from a web interface
  MAP-75 		Proxy and Serializer scripts should have proper PHP header tag
  MAP-71 		Duplicate GetFeatureInfo responses forced if mouse click occurs before previous query finished.
  MAP-59 		GetFeatureInfo URL generated for a second WMS in same context as first is repeated in the variable string.
  MAP-56 		Give visual marker to current active layer in legend Submitted By: Nedjo Rogers SF - 1157443
  MAP-52 		Add support for WKT data source. Submitted: Nedjo Rogers SF-1203287
  MAP-50 		Add SVG rendering of GML data Submitted: Nedjo Rogers
  MAP-49 		set properties by URL parameters Submitted: Mike Adair SF - 1257212
  MAP-47 		process multiple context documents in one page Submitted John Pulles SF- 1401526
  MAP-43 		duplicate layers mess up when deleting them Submitted: graphrisc SF-1361616
  MAP-42 		error initializing mapbuilder when used in drupal module Submitted: openwereld SF-1352137
  MAP-40 		GeoRSS divs not cleared on loadModel Submitted: nobody SF-1291065
  MAP-39 		Feature isn't deselected after it was deleted Submitted: camerons SF-1364103
  MAP-38 		Null gml:coordinate Point is rendered in top left of MapPane Submitted: Camerons SF-1351128
  MAP-37 		CSS error in Firefox 1.5beta causes layers not to load Submitted: camerons SF-1337858
  MAP-36 		Drag Pan Tool: Mouseup outside the map should be procesed Submitted: maiqui SF-1259486
  MAP-35 		use scalehints in context docs Submitted: madair1 SF-1174298
  MAP-25 		Move util.js into JS objects Submitted: camerons SF-1071242
  MAP-24 		Gazetteer widget auto zoom Submitted: nobody SF-1380974
  MAP-23	 	PHP proxy strips attribute namespaces Submitted: madair1 SF-1386495
  MAP-22 		wfs-t java.lang.ExceptionInInitializerError Submitted: mneteler SF-1383838
  MAP-21 		<widget> is not defined" javascript errors Submitted: openwereld SF-1386001
  MAP-17 		Line 96 Error firstChild is null or not an object Submitted: Cappelaere SF-1392108
  MAP-16 		Line 278 Object required Submitted: Cappelaere SF-1392112
  MAP-15 		Line 29 invalid argument Context Editor Submitted: Cappelaere SF-1392122
  MAP-14 		Update GeoRSS demo to new feed format Submitted: Cappelaere SF-1394556
  MAP-13 		FF 1.5 docStyle.css error Submitted: Cappelaere SF-1394569
  MAP-12 		wrong value for port in proxy.php Submitted: zjonp SF-1397656
  MAP-7 		Graphical Highlight of WFS Polygon is mangled Submitted: sjf_8 SF-1404143
  MAP-57 		Inconsistency in handling of aspect ratio for map viewer between bounding box and image size
  MAP-55 		Create hover-over popups when mouse hovers over a feature Submitted By: Cameron Shorter SF - 1173569
  MAP-53 		Mapbuilder and Geoserver to use the same demos Submitted by: Cameron Shorter SF - 1196838
  MAP-51 		set the locator map with an image Submitted Virginie Berre SF - 1220313
  MAP-34 		GmlRenderer complexity OUT OF CONTROL with zoomin Submitted: maiqui SF-1306834
  MAP-32 		Incorrect click position in WFS-T demo on IE Submitted: camerons SF-1193142
  MAP-29 		Coord string does not handle space char inside tuple Submitted camerons SF-1013754
  MAP-27 		Change Open GIS to Open Geospacial Submitted: camerons SF-1168180
  MAP-26 		Layers from geoserver periodically not returned Submitted: camerons SF-1357587
  
  
  
  mapbuilder-lib-1.0-rc2 (stable)
  ===============================
  This commences the second release candidate of the 1.0 release
  of mapbuilder.
  
  This is the first release developed using the suite of tools
  provided by Codehaus. 
  
  Note: All bug numbers have been reassigned to a new JIRA-specific format.
  Original SourceForge bug number is appended to issue description, along
  with original author.
  
  Bugs fixed:
  -----------
  MAP-1 	JIRA setup for mapbuilder 
  MAP-3 	Import existing SF Open Bug reports 
  MAP-4 	errors because of missing 'px' in MapPane.xsl was SF-1387043 
  MAP-5 	add Transverse Mercator (and UTM) to Proj submitted:madair1 SF:1404410 
  MAP-8 	GetFeatureInfo fails against GeoServer WMS Submitted: kc7bfi SF-1400525 
  MAP-10 	fixedWidth MapPane property broken Submitted: madair1 SF-1399511 
  MAP-20 	map doesn't move while panning Submitted: openwereld SF-1386852 
  MAP-28 	query icon Submitted: tomkralidis SF-968519 
  MAP-30 	Links in mapbuilder/index.html broker Submitted: camerons SF-1164770 
  MAP-44 	hide layer not working in IE Submitted: camerons SF-1364550 
  MAP-45 	java servlets compiled with JDK1.5 fail when run in 1.4 Submitted: madair1 SF-1365816 
  MAP-58 	Improper handling of GetFeatureInfo url generation - URL repeated in variable string 
  MAP-60 	Demis demo - AOIForm.xsl error 
  MAP-62 	config text stylesheet should override widgetText file values 
  MAP-64 	incorrect aspect ratio in modisWorld context file 
  MAP-65 	No EditPolygon Implementation 
  
  
  Outstanding Issues (highest priority first):
  --------------------------------------------
  MAP-68 	IE: MapPane refreshing layers 
  MAP-6 	Problem with two WMS layers with the same name submitted: kc7bfi SF-1400521 
  MAP-2 	Hardcoded reference to localhost will prevent remote machines from viewing Generated Content 
  MAP-9 	Layer Control does not update when a new layer is loaded Submitted: Cappelaere SF-1393270 
  MAP-19 	IE problem: "Error: 'this.doc' is null or not an object Submitted: Cappelaere SF-1390868 
  MAP-7 	Graphical Highlight of WFS Polygon is mangled Submitted: sjf_8 SF-1404143 
  MAP-11 	EditPolygon Tool Problem Submitted: nobody SF-1397748 
  MAP-38 	Null gml:coordinate Point is rendered in top left of MapPane Submitted: Camerons SF-1351128 
  MAP-17 	Line 96 Error firstChild is null or not an object Submitted: Cappelaere SF-1392108 
  MAP-16 	Line 278 Object required Submitted: Cappelaere SF-1392112 
  MAP-12 	wrong value for port in proxy.php Submitted: zjonp SF-1397656 
  MAP-37 	CSS error in Firefox 1.5beta causes layers not to load Submitted: camerons SF-1337858 
  MAP-13 	FF 1.5 docStyle.css error Submitted: Cappelaere SF-1394569 
  MAP-42 	error initializing mapbuilder when used in drupal module Submitted: openwereld SF-1352137 
  MAP-21 	<widget> is not defined" javascript errors Submitted: openwereld SF-1386001 
  MAP-40 	GeoRSS divs not cleared on loadModel Submitted: nobody SF-1291065 
  MAP-59 	GetFeatureInfo URL generated for a second WMS in same context as first is repeated in the variable string. 
  MAP-22 	wfs-t java.lang.ExceptionInInitializerError Submitted: mneteler SF-1383838 
  MAP-39 	Feature isn't deselected after it was deleted Submitted: camerons SF-1364103 
  MAP-41 	MapPane HTML 4.01 and XHTML compatibility Submitted: sgillies SF-1294608 
  MAP-18 	js error passing bbox in via URL submitted: davidherbert2 SF-1391168 
  MAP-35 	use scalehints in context docs Submitted: madair1 SF-1174298 
  MAP-43 	duplicate layers mess up when deleting them Submitted: graphrisc SF-1361616 
  MAP-24 	Gazetteer widget auto zoom Submitted: nobody SF-1380974 
  MAP-23 	PHP proxy strips attribute namespaces Submitted: madair1 SF-1386495 
  MAP-14 	Update GeoRSS demo to new feed format Submitted: Cappelaere SF-1394556 
  MAP-25 	Move util.js into JS objects Submitted: camerons SF-1071242 
  MAP-15 	Line 29 invalid argument Context Editor Submitted: Cappelaere SF-1392122 
  MAP-36 	Drag Pan Tool: Mouseup outside the map should be procesed Submitted: maiqui SF-1259486 
  MAP-71 	Duplicate GetFeatureInfo responses forced if mouse click occurs before previous query finished. 
  MAP-32 	Incorrect click position in WFS-T demo on IE Submitted: camerons SF-1193142 
  MAP-26 	Layers from geoserver periodically not returned Submitted: camerons SF-1357587 
  MAP-34 	GmlRenderer complexity OUT OF CONTROL with zoomin Submitted: maiqui SF-1306834 
  MAP-29 	Coord string does not handle space char inside tuple Submitted camerons SF-1013754 
  MAP-31 	ZoomBy factor should be in config file Submitted: camerons SF-1181411 
  MAP-57 	Inconsistency in handling of aspect ratio for map viewer between bounding box and image size 
  
  
  mapbuilder-lib-1.0-rc1 (stable)
  ===============================
  This commences the first release candidate of the 1.0 release
  of mapbuilder.
  
  It contains a host of new features, an improved skin library,
  and substantial stability improvements.
  
  Bugs fixed:
  -----------
  1257487 First feature entry causes JS error
  1192667 PNG format doesn't use transparancy on IE
  1175978 rename model/DescribeFeatureType.js
  1257981 Comments are not stripped out when building a distribution
  1253624 image src in Legend.xml is not with skinDir. little fix
  1253597 GmlRenderWZ.xsl more versatil
  1253586 bug with fix in FeatureList.xsl
  1253581 Initial deformaton in the image.
  1221091 pb with the tool zoom in
  1191398 model template attribute not working correctly
  1177691 Problems panning/zooming off the map area
  1116660 Remove TransactionStatus widget when EditFeature selected
  967937  aspect ratio on startup
  967933  layer list ordering
  1162133 Add GPL header to all source files.
  
  Outstanding Issues (highest priority first):
  --------------------------------------------
  1365816  java servlets compiled with JDK1.5 fail when run in 1.4   
  1364550  hide layer not working in IE 
  1361616  duplicate layers mess up when deleting them 
  1352137  error initializing mapbuilder when used in drupal module 
  1294608  MapPane HTML 4.01 and XHTML compatibility 
  1291065  GeoRSS divs not cleared on loadModel 
  1364103  Feature isn't deselected after it was deleted 
  1351128  Null gml:coordinate Point is rendered in top left of MapPane 
  1337858  CSS error in Firefox 1.5beta causes layers not to load 
  1259486  Drag Pan Tool: Mouseup outside the map should be procesed. 
  1174298  use scalehints in context docs 
  1306834  GmlRenderer complexity OUT OF CONTROL with zoomin 
  1258381  Gml point opacity - transparensity has changed 
  1193142  Incorrect click position in WFS-T demo on IE 
  1181411  ZoomBy factor should be in config file 
  1164770  links in mapbuilder/index.html broker 
  1013754  Coord string does not handle space char inside tuple 
  968519   query icon 
  1168180  Change Open GIS to Open Geospacial 
  1357587  Layers from geoserver periodically not returned 
  1071242  Move util.js into JS objects 
  
  mapbuilder-lib-0.4
  ==================
  This is the first release under the Lesser GNU Public License (LGPL).
  It contains a handful of bug fixes.
  
  Bugs fixed:
  -----------
  1213206 implement asynchronous document loading
  1227556 error when trying to insert a new feature using the wfs-t de
  1225821 Add [info] button and corresponding query
  1222170 Local install can't find mapbuilderConfig.xml
  1250144 FeatureList should only show leaf nodes of GML
  1168984 publish.sh references incorrect jsdoc.pl
  1168981 bin/publish.sh references incorrect XSL
  
  Outstanding Issues (highest priority first):
  -------------------------------------------
  1193142 Incorrect click position in WFS-T demo on IE
  1175989 js error when loading WFS Servers
  1221091 pb with the tool zoom in
  1195505 graphical map scale bar
  1192667 PNG format doesn't use transparancy on IE
  1191398 model template attribute not working correctly
  1177691 Problems panning/zooming off the map area
  1174298 use scalehints in context docs
  1116660 Remove TransactionStatus widget when EditFeature selected
  1115672 User should be able to deselect EditFeature buttons
  967937 aspect ratio on startup
  967933 layer list ordering
  1196838 Mapbuilder and Geoserver to use the same demos
  1181411 ZoomBy factor should be in config file
  1164770 links in mapbuilder/index.html broker
  1153752 demo/index.html should explain need for Tomcat installation
  1013754 Coord string does not handle space char inside tuple
  968519 query icon
  1175978 rename model/DescribeFeatureType.js
  1168180 Change Open GIS to Open Geospacial
  1162133 Add GPL header to all source files.
  1102212 EditTools don't contain French tooltip
  1071242 Move util.js into JS objects
  
  
  mapbuilder-lib-0.3.1-alpha (alpha quality)
  ========================================
  This is an interum bug fix release to ensure releases keep up with the
  head development.  This release has had minimal testing done on it.
  
  Bugs fixed:
  -----------
  1216418 build leaves out /server/php
  1176000 Selecting "My map collection" not working
  1119953 Feature Entry should use WebServiceRequest.js
  1104715 MapPane doesn't refresh after a new feature is submitted
  1069050 Limit multiple paint requests
  1064707 GmlRender image does not move during a ZoomPan
  1216926 missing proxy files
  1187614 "input out of range error" when using NTS Service in LCC
  1180306 refactor language handling
  1174320 mapscale text update
  1162293 Default load WMC doc is invalid
  1118614 IE - handle disabled ActiveX objects
  1118377 Geoserver to be packaged with suitable layers for mapbuilder
  995127 Error during loading process on IE 6 on Windows XP
  973651 add more img attributes
  967806 CursorTrack.xsl units label display
  1191479 WFS-T demo uses absolute URLs to geoserver
  1175577 The build process doesnt copy images for design doc
  1166844 ant script create build/build/build/... directories
  1157444 Remove the title attribute from map images
  
  Outstanding Issues (highest priority fist):
  -------------------------------------------
  1213206 implement asynchronous document loading
  1192667 PNG format doesn't use transparancy on IE
  1175989 js error when loading WFS Servers
  1195505 graphical map scale bar
  1193142 Incorrect click position in WFS-T demo on IE
  1191398 model template attribute not working correctly
  1177691 Problems panning/zooming off the map area
  1174298 use scalehints in context docs
  1116660 Remove TransactionStatus widget when EditFeature selected
  1115672 User should be able to deselect EditFeature buttons
  967937 aspect ratio on startup
  967933 layer list ordering
  1196838 Mapbuilder and Geoserver to use the same demos
  1181411 ZoomBy factor should be in config file
  1168984 publish.sh references incorrect jsdoc.pl
  1168981 bin/publish.sh references incorrect XSL
  1164770 links in mapbuilder/index.html broker
  1153752 demo/index.html should explain need for Tomcat installation
  1013754 Coord string does not handle space char inside tuple
  968519 query icon
  1175978 rename model/DescribeFeatureType.js
  1168180 Change Open GIS to Open Geospacial
  1162133 Add GPL header to all source files.
  1102212 EditTools don't contain French tooltip
  1071242 Move util.js into JS objects
  
  
  mapbuilder-lib-0.3-alpha (alpha quality)
  ========================================
  This release fixes some of the demos which were not able access server side
  functionality as well as addressing the following bugs:
  
  Bugs fixed:
  -----------
  962714  Slow load with no user feedback
  1065426 Create AoiBox widget which is not dependant on wz_jsgraphics
  1103047 XSL files not using CR/LF properly and are all on one line
  
  
  Outstanding Issues (highest priority fist):
  -------------------------------------------
  1064707 GmlRender image does not move during a ZoomPan
  1104715 MapPane doesn't refresh after a new feature is submitted
  1119953 Feature Entry should use WebServiceRequest.js
  967933  layer list ordering
  967937  aspect ratio on startup
  973651  add more img attributes
  995127  Error during loading process on IE 6 on Windows XP
  1118377 Geoserver to be packaged with suitable layers for mapbuilder
  1157443 Give visual marker to current active layer in legend
  1162293 Default load WMC doc is invalid
  1115672 User should be able to deselect EditFeature buttons
  1116660 Remove TransactionStatus widget when EditFeature selected
  1118614 IE - handle disabled ActiveX objects
  967806  CursorTrack.xsl units label display
  1166844 ant script create build/build/build/... directories
  968519  query icon
  1013754 Coord string does not handle space char inside tuple
  1153752 demo/index.html should explain need for Tomcat installation
  1157444 Remove the title attribute from map images
  1168981 bin/publish.sh references incorrect XSL
  1168984 publish.sh references incorrect jsdoc.pl
  1164770 links in mapbuilder/index.html broker
  1102212 EditTools don't contain French tooltip
  1162133 Add GPL header to all source files.
  1071242 Move util.js into JS objects
  
  mapbuilder-lib-0.2-alpha (alpha quality)
  ========================================
  This released is designed to provide a demonstration of a number of
  features which have been developed since the last release.  The new
  features are considered alpha quality and we suggest waiting for a future
  release before using these features in a production product.
  
  Extra functionality introduced in this release includes:
  * Time series Web Map Service (WMS) client
  * A gazateer (pull down list of placenames)
  * GML Rendering
  * Feature rendering from a Web Feature Service (WFS) query
  * Feature entry to a Transactional Web Feature Service (WFS-T)
  * Web Map Context (WMC) Editor client
  * Javascript and XSL is now compressed to reduce downloads.
  
  The schema for the configuration file has changed since last release
  which means configuration files from release 0.1 will not work with 0.2.
  Minor changes to the schema are expected for the next release.
  
  Outstanding Issues (highest priority fist):
  -------------------------------------------
  1064707 GmlRender image does not move during a ZoomPan
  962714  Slow load with no user feedback
  1069050 Limit multiple paint requests
  1119953 Feature Entry should use WebServiceRequest.js
  1104715 MapPane doesn't refresh after a new feature is submitted
  1164770 links in mapbuilder/index.html broker
  1162293 Default load WMC doc is invalid
  1157443 Give visual marker to current active layer in legend
  1118377 Geoserver to be packaged with suitable layers for mapbuilder
  995127  Error during loading process on IE 6 on Windows XP
  967937  aspect ratio on startup
  967933  layer list ordering
  973651  add more img attributes
  1116660 Remove TransactionStatus widget when EditFeature selected
  1115672 User should be able to deselect EditFeature buttons
  1065426 Create AoiBox widget which is not dependant on wz_jsgraphics
  1118614 IE - handle disabled ActiveX objects
  967806  CursorTrack.xsl units label display
  1157444 Remove the title attribute from map images
  1153752 demo/index.html should explain need for Tomcat installation
  968519  query icon
  1013754 Coord string does not handle space char inside tuple
  1162133 Add GPL header to all source files.
  1102212 EditTools don't contain French tooltip
  1103047 XSL files not using CR/LF properly and are all on one line
  1071242 Move util.js into JS objects
  
  mapbuilder-lib-0.1 (beta quality)
  =================================
  This release has become very stable.  The only known issue of consequence is
  that the pages take a long time to load over a slow connection without any user
  feedback.  This is not a problem if you install mapbuilder-lib locally.
  
  Outstanding Issues:
  -------------------
  962714 Slow load with no user feedback
  964720 lat/long populated even when mouse is off widget
  
  Issues addressed since last release:
  ------------------------------------
  962718 Selection of Layers in Mozilla 1.5
  963966 enabling tools from buttons
  966438 Query image icon broken for relative directories
  966436 Add Pan Tool
  958878 AOI box larger than locator map
  960701 AOI Box not visible at startup
  
  
  mapbuilder-lib-0.1-rc3 (beta quality):
  ======================================
  * Added Reset button which resets to original area of interest
  * Simplified the Main html page by moving the Javascript to Mapbuilder.js
  * General cleanup and restructuring of Tools code
  
  mapbuilder-lib-0.1-rc2 (alpha quality):
  =======================================
  * Fixes showstopper bugs in IE relating to loading of scripts.
  * Mapbuilder now takes a while to load because we force scripts to
    be loaded before rendering widgets.
  * The reset button was commented out because it did not work on IE.
  
  mapbuilder-lib-0.1-rc1 (alpha quality):
  =======================================
  This initial version of Mapbuilder libraries contains:
  * Web Map Server (WMS) client map.
  * Building of a Map from a Web Map Context (WMC) document.
  * Legend which turns layers on and off.
  * Selection of an Area Of Interest by a locator map.
  * Tools to Zoom in and out.
  * The libraries have been tested on IE 6 and Mozilla 1.3 to 1.6.
  
  The Mapbuilder Configuration file is expected to change in future
  releases and it is not expected that future versions will be
  backwardly compatable with this version (although the upgrade path
  should be simple).
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/LGPL
  
  Index: LGPL
  ===================================================================
  		  GNU LESSER GENERAL PUBLIC LICENSE
  		       Version 2.1, February 1999
  
   Copyright (C) 1991, 1999 Free Software Foundation, Inc.
       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   Everyone is permitted to copy and distribute verbatim copies
   of this license document, but changing it is not allowed.
  
  [This is the first released version of the Lesser LGPL.  It also counts
   as the successor of the GNU Library Public License, version 2, hence
   the version number 2.1.]
  
  			    Preamble
  
    The licenses for most software are designed to take away your
  freedom to share and change it.  By contrast, the GNU General Public
  Licenses are intended to guarantee your freedom to share and change
  free software--to make sure the software is free for all its users.
  
    This license, the Lesser General Public License, applies to some
  specially designated software packages--typically libraries--of the
  Free Software Foundation and other authors who decide to use it.  You
  can use it too, but we suggest you first think carefully about whether
  this license or the ordinary General Public License is the better
  strategy to use in any particular case, based on the explanations below.
  
    When we speak of free software, we are referring to freedom of use,
  not price.  Our General Public Licenses are designed to make sure that
  you have the freedom to distribute copies of free software (and charge
  for this service if you wish); that you receive source code or can get
  it if you want it; that you can change the software and use pieces of
  it in new free programs; and that you are informed that you can do
  these things.
  
    To protect your rights, we need to make restrictions that forbid
  distributors to deny you these rights or to ask you to surrender these
  rights.  These restrictions translate to certain responsibilities for
  you if you distribute copies of the library or if you modify it.
  
    For example, if you distribute copies of the library, whether gratis
  or for a fee, you must give the recipients all the rights that we gave
  you.  You must make sure that they, too, receive or can get the source
  code.  If you link other code with the library, you must provide
  complete object files to the recipients, so that they can relink them
  with the library after making changes to the library and recompiling
  it.  And you must show them these terms so they know their rights.
  
    We protect your rights with a two-step method: (1) we copyright the
  library, and (2) we offer you this license, which gives you legal
  permission to copy, distribute and/or modify the library.
  
    To protect each distributor, we want to make it very clear that
  there is no warranty for the free library.  Also, if the library is
  modified by someone else and passed on, the recipients should know
  that what they have is not the original version, so that the original
  author's reputation will not be affected by problems that might be
  introduced by others.
  
    Finally, software patents pose a constant threat to the existence of
  any free program.  We wish to make sure that a company cannot
  effectively restrict the users of a free program by obtaining a
  restrictive license from a patent holder.  Therefore, we insist that
  any patent license obtained for a version of the library must be
  consistent with the full freedom of use specified in this license.
  
    Most GNU software, including some libraries, is covered by the
  ordinary GNU General Public License.  This license, the GNU Lesser
  General Public License, applies to certain designated libraries, and
  is quite different from the ordinary General Public License.  We use
  this license for certain libraries in order to permit linking those
  libraries into non-free programs.
  
    When a program is linked with a library, whether statically or using
  a shared library, the combination of the two is legally speaking a
  combined work, a derivative of the original library.  The ordinary
  General Public License therefore permits such linking only if the
  entire combination fits its criteria of freedom.  The Lesser General
  Public License permits more lax criteria for linking other code with
  the library.
  
    We call this license the "Lesser" General Public License because it
  does Less to protect the user's freedom than the ordinary General
  Public License.  It also provides other free software developers Less
  of an advantage over competing non-free programs.  These disadvantages
  are the reason we use the ordinary General Public License for many
  libraries.  However, the Lesser license provides advantages in certain
  special circumstances.
  
    For example, on rare occasions, there may be a special need to
  encourage the widest possible use of a certain library, so that it becomes
  a de-facto standard.  To achieve this, non-free programs must be
  allowed to use the library.  A more frequent case is that a free
  library does the same job as widely used non-free libraries.  In this
  case, there is little to gain by limiting the free library to free
  software only, so we use the Lesser General Public License.
  
    In other cases, permission to use a particular library in non-free
  programs enables a greater number of people to use a large body of
  free software.  For example, permission to use the GNU C Library in
  non-free programs enables many more people to use the whole GNU
  operating system, as well as its variant, the GNU/Linux operating
  system.
  
    Although the Lesser General Public License is Less protective of the
  users' freedom, it does ensure that the user of a program that is
  linked with the Library has the freedom and the wherewithal to run
  that program using a modified version of the Library.
  
    The precise terms and conditions for copying, distribution and
  modification follow.  Pay close attention to the difference between a
  "work based on the library" and a "work that uses the library".  The
  former contains code derived from the library, whereas the latter must
  be combined with the library in order to run.
  
  		  GNU LESSER GENERAL PUBLIC LICENSE
     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  
    0. This License Agreement applies to any software library or other
  program which contains a notice placed by the copyright holder or
  other authorized party saying it may be distributed under the terms of
  this Lesser General Public License (also called "this License").
  Each licensee is addressed as "you".
  
    A "library" means a collection of software functions and/or data
  prepared so as to be conveniently linked with application programs
  (which use some of those functions and data) to form executables.
  
    The "Library", below, refers to any such software library or work
  which has been distributed under these terms.  A "work based on the
  Library" means either the Library or any derivative work under
  copyright law: that is to say, a work containing the Library or a
  portion of it, either verbatim or with modifications and/or translated
  straightforwardly into another language.  (Hereinafter, translation is
  included without limitation in the term "modification".)
  
    "Source code" for a work means the preferred form of the work for
  making modifications to it.  For a library, complete source code means
  all the source code for all modules it contains, plus any associated
  interface definition files, plus the scripts used to control compilation
  and installation of the library.
  
    Activities other than copying, distribution and modification are not
  covered by this License; they are outside its scope.  The act of
  running a program using the Library is not restricted, and output from
  such a program is covered only if its contents constitute a work based
  on the Library (independent of the use of the Library in a tool for
  writing it).  Whether that is true depends on what the Library does
  and what the program that uses the Library does.
    
    1. You may copy and distribute verbatim copies of the Library's
  complete source code as you receive it, in any medium, provided that
  you conspicuously and appropriately publish on each copy an
  appropriate copyright notice and disclaimer of warranty; keep intact
  all the notices that refer to this License and to the absence of any
  warranty; and distribute a copy of this License along with the
  Library.
  
    You may charge a fee for the physical act of transferring a copy,
  and you may at your option offer warranty protection in exchange for a
  fee.
  
    2. You may modify your copy or copies of the Library or any portion
  of it, thus forming a work based on the Library, and copy and
  distribute such modifications or work under the terms of Section 1
  above, provided that you also meet all of these conditions:
  
      a) The modified work must itself be a software library.
  
      b) You must cause the files modified to carry prominent notices
      stating that you changed the files and the date of any change.
  
      c) You must cause the whole of the work to be licensed at no
      charge to all third parties under the terms of this License.
  
      d) If a facility in the modified Library refers to a function or a
      table of data to be supplied by an application program that uses
      the facility, other than as an argument passed when the facility
      is invoked, then you must make a good faith effort to ensure that,
      in the event an application does not supply such function or
      table, the facility still operates, and performs whatever part of
      its purpose remains meaningful.
  
      (For example, a function in a library to compute square roots has
      a purpose that is entirely well-defined independent of the
      application.  Therefore, Subsection 2d requires that any
      application-supplied function or table used by this function must
      be optional: if the application does not supply it, the square
      root function must still compute square roots.)
  
  These requirements apply to the modified work as a whole.  If
  identifiable sections of that work are not derived from the Library,
  and can be reasonably considered independent and separate works in
  themselves, then this License, and its terms, do not apply to those
  sections when you distribute them as separate works.  But when you
  distribute the same sections as part of a whole which is a work based
  on the Library, the distribution of the whole must be on the terms of
  this License, whose permissions for other licensees extend to the
  entire whole, and thus to each and every part regardless of who wrote
  it.
  
  Thus, it is not the intent of this section to claim rights or contest
  your rights to work written entirely by you; rather, the intent is to
  exercise the right to control the distribution of derivative or
  collective works based on the Library.
  
  In addition, mere aggregation of another work not based on the Library
  with the Library (or with a work based on the Library) on a volume of
  a storage or distribution medium does not bring the other work under
  the scope of this License.
  
    3. You may opt to apply the terms of the ordinary GNU General Public
  License instead of this License to a given copy of the Library.  To do
  this, you must alter all the notices that refer to this License, so
  that they refer to the ordinary GNU General Public License, version 2,
  instead of to this License.  (If a newer version than version 2 of the
  ordinary GNU General Public License has appeared, then you can specify
  that version instead if you wish.)  Do not make any other change in
  these notices.
  
    Once this change is made in a given copy, it is irreversible for
  that copy, so the ordinary GNU General Public License applies to all
  subsequent copies and derivative works made from that copy.
  
    This option is useful when you wish to copy part of the code of
  the Library into a program that is not a library.
  
    4. You may copy and distribute the Library (or a portion or
  derivative of it, under Section 2) in object code or executable form
  under the terms of Sections 1 and 2 above provided that you accompany
  it with the complete corresponding machine-readable source code, which
  must be distributed under the terms of Sections 1 and 2 above on a
  medium customarily used for software interchange.
  
    If distribution of object code is made by offering access to copy
  from a designated place, then offering equivalent access to copy the
  source code from the same place satisfies the requirement to
  distribute the source code, even though third parties are not
  compelled to copy the source along with the object code.
  
    5. A program that contains no derivative of any portion of the
  Library, but is designed to work with the Library by being compiled or
  linked with it, is called a "work that uses the Library".  Such a
  work, in isolation, is not a derivative work of the Library, and
  therefore falls outside the scope of this License.
  
    However, linking a "work that uses the Library" with the Library
  creates an executable that is a derivative of the Library (because it
  contains portions of the Library), rather than a "work that uses the
  library".  The executable is therefore covered by this License.
  Section 6 states terms for distribution of such executables.
  
    When a "work that uses the Library" uses material from a header file
  that is part of the Library, the object code for the work may be a
  derivative work of the Library even though the source code is not.
  Whether this is true is especially significant if the work can be
  linked without the Library, or if the work is itself a library.  The
  threshold for this to be true is not precisely defined by law.
  
    If such an object file uses only numerical parameters, data
  structure layouts and accessors, and small macros and small inline
  functions (ten lines or less in length), then the use of the object
  file is unrestricted, regardless of whether it is legally a derivative
  work.  (Executables containing this object code plus portions of the
  Library will still fall under Section 6.)
  
    Otherwise, if the work is a derivative of the Library, you may
  distribute the object code for the work under the terms of Section 6.
  Any executables containing that work also fall under Section 6,
  whether or not they are linked directly with the Library itself.
  
    6. As an exception to the Sections above, you may also combine or
  link a "work that uses the Library" with the Library to produce a
  work containing portions of the Library, and distribute that work
  under terms of your choice, provided that the terms permit
  modification of the work for the customer's own use and reverse
  engineering for debugging such modifications.
  
    You must give prominent notice with each copy of the work that the
  Library is used in it and that the Library and its use are covered by
  this License.  You must supply a copy of this License.  If the work
  during execution displays copyright notices, you must include the
  copyright notice for the Library among them, as well as a reference
  directing the user to the copy of this License.  Also, you must do one
  of these things:
  
      a) Accompany the work with the complete corresponding
      machine-readable source code for the Library including whatever
      changes were used in the work (which must be distributed under
      Sections 1 and 2 above); and, if the work is an executable linked
      with the Library, with the complete machine-readable "work that
      uses the Library", as object code and/or source code, so that the
      user can modify the Library and then relink to produce a modified
      executable containing the modified Library.  (It is understood
      that the user who changes the contents of definitions files in the
      Library will not necessarily be able to recompile the application
      to use the modified definitions.)
  
      b) Use a suitable shared library mechanism for linking with the
      Library.  A suitable mechanism is one that (1) uses at run time a
      copy of the library already present on the user's computer system,
      rather than copying library functions into the executable, and (2)
      will operate properly with a modified version of the library, if
      the user installs one, as long as the modified version is
      interface-compatible with the version that the work was made with.
  
      c) Accompany the work with a written offer, valid for at
      least three years, to give the same user the materials
      specified in Subsection 6a, above, for a charge no more
      than the cost of performing this distribution.
  
      d) If distribution of the work is made by offering access to copy
      from a designated place, offer equivalent access to copy the above
      specified materials from the same place.
  
      e) Verify that the user has already received a copy of these
      materials or that you have already sent this user a copy.
  
    For an executable, the required form of the "work that uses the
  Library" must include any data and utility programs needed for
  reproducing the executable from it.  However, as a special exception,
  the materials to be distributed need not include anything that is
  normally distributed (in either source or binary form) with the major
  components (compiler, kernel, and so on) of the operating system on
  which the executable runs, unless that component itself accompanies
  the executable.
  
    It may happen that this requirement contradicts the license
  restrictions of other proprietary libraries that do not normally
  accompany the operating system.  Such a contradiction means you cannot
  use both them and the Library together in an executable that you
  distribute.
  
    7. You may place library facilities that are a work based on the
  Library side-by-side in a single library together with other library
  facilities not covered by this License, and distribute such a combined
  library, provided that the separate distribution of the work based on
  the Library and of the other library facilities is otherwise
  permitted, and provided that you do these two things:
  
      a) Accompany the combined library with a copy of the same work
      based on the Library, uncombined with any other library
      facilities.  This must be distributed under the terms of the
      Sections above.
  
      b) Give prominent notice with the combined library of the fact
      that part of it is a work based on the Library, and explaining
      where to find the accompanying uncombined form of the same work.
  
    8. You may not copy, modify, sublicense, link with, or distribute
  the Library except as expressly provided under this License.  Any
  attempt otherwise to copy, modify, sublicense, link with, or
  distribute the Library is void, and will automatically terminate your
  rights under this License.  However, parties who have received copies,
  or rights, from you under this License will not have their licenses
  terminated so long as such parties remain in full compliance.
  
    9. You are not required to accept this License, since you have not
  signed it.  However, nothing else grants you permission to modify or
  distribute the Library or its derivative works.  These actions are
  prohibited by law if you do not accept this License.  Therefore, by
  modifying or distributing the Library (or any work based on the
  Library), you indicate your acceptance of this License to do so, and
  all its terms and conditions for copying, distributing or modifying
  the Library or works based on it.
  
    10. Each time you redistribute the Library (or any work based on the
  Library), the recipient automatically receives a license from the
  original licensor to copy, distribute, link with or modify the Library
  subject to these terms and conditions.  You may not impose any further
  restrictions on the recipients' exercise of the rights granted herein.
  You are not responsible for enforcing compliance by third parties with
  this License.
  
    11. If, as a consequence of a court judgment or allegation of patent
  infringement or for any other reason (not limited to patent issues),
  conditions are imposed on you (whether by court order, agreement or
  otherwise) that contradict the conditions of this License, they do not
  excuse you from the conditions of this License.  If you cannot
  distribute so as to satisfy simultaneously your obligations under this
  License and any other pertinent obligations, then as a consequence you
  may not distribute the Library at all.  For example, if a patent
  license would not permit royalty-free redistribution of the Library by
  all those who receive copies directly or indirectly through you, then
  the only way you could satisfy both it and this License would be to
  refrain entirely from distribution of the Library.
  
  If any portion of this section is held invalid or unenforceable under any
  particular circumstance, the balance of the section is intended to apply,
  and the section as a whole is intended to apply in other circumstances.
  
  It is not the purpose of this section to induce you to infringe any
  patents or other property right claims or to contest validity of any
  such claims; this section has the sole purpose of protecting the
  integrity of the free software distribution system which is
  implemented by public license practices.  Many people have made
  generous contributions to the wide range of software distributed
  through that system in reliance on consistent application of that
  system; it is up to the author/donor to decide if he or she is willing
  to distribute software through any other system and a licensee cannot
  impose that choice.
  
  This section is intended to make thoroughly clear what is believed to
  be a consequence of the rest of this License.
  
    12. If the distribution and/or use of the Library is restricted in
  certain countries either by patents or by copyrighted interfaces, the
  original copyright holder who places the Library under this License may add
  an explicit geographical distribution limitation excluding those countries,
  so that distribution is permitted only in or among countries not thus
  excluded.  In such case, this License incorporates the limitation as if
  written in the body of this License.
  
    13. The Free Software Foundation may publish revised and/or new
  versions of the Lesser General Public License from time to time.
  Such new versions will be similar in spirit to the present version,
  but may differ in detail to address new problems or concerns.
  
  Each version is given a distinguishing version number.  If the Library
  specifies a version number of this License which applies to it and
  "any later version", you have the option of following the terms and
  conditions either of that version or of any later version published by
  the Free Software Foundation.  If the Library does not specify a
  license version number, you may choose any version ever published by
  the Free Software Foundation.
  
    14. If you wish to incorporate parts of the Library into other free
  programs whose distribution conditions are incompatible with these,
  write to the author to ask for permission.  For software which is
  copyrighted by the Free Software Foundation, write to the Free
  Software Foundation; we sometimes make exceptions for this.  Our
  decision will be guided by the two goals of preserving the free status
  of all derivatives of our free software and of promoting the sharing
  and reuse of software generally.
  
  			    NO WARRANTY
  
    15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
  WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
  OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
  LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
  THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  
    16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
  WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
  AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
  FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
  CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
  LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
  RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
  FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
  SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  DAMAGES.
  
  		     END OF TERMS AND CONDITIONS
  
             How to Apply These Terms to Your New Libraries
  
    If you develop a new library, and you want it to be of the greatest
  possible use to the public, we recommend making it free software that
  everyone can redistribute and change.  You can do so by permitting
  redistribution under these terms (or, alternatively, under the terms of the
  ordinary General Public License).
  
    To apply these terms, attach the following notices to the library.  It is
  safest to attach them to the start of each source file to most effectively
  convey the exclusion of warranty; and each file should have at least the
  "copyright" line and a pointer to where the full notice is found.
  
      <one line to give the library's name and a brief idea of what it does.>
      Copyright (C) <year>  <name of author>
  
      This library is free software; you can redistribute it and/or
      modify it under the terms of the GNU Lesser General Public
      License as published by the Free Software Foundation; either
      version 2.1 of the License, or (at your option) any later version.
  
      This library is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Lesser General Public License for more details.
  
      You should have received a copy of the GNU Lesser General Public
      License along with this library; if not, write to the Free Software
      Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  
  Also add information on how to contact you by electronic and paper mail.
  
  You should also get your employer (if you work as a programmer) or your
  school, if any, to sign a "copyright disclaimer" for the library, if
  necessary.  Here is a sample; alter the names:
  
    Yoyodyne, Inc., hereby disclaims all copyright interest in the
    library `Frob' (a library for tweaking knobs) written by James Random Hacker.
  
    <signature of Ty Coon>, 1 April 1990
    Ty Coon, President of Vice
  
  That's all there is to it!
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/LICENSE
  
  Index: LICENSE
  ===================================================================
  Mapbuilder-lib is a browser based Web Mapping client.
  http://mapbuilder.sourceforge.net
  
  Copyright (C) 2005 Cameron Shorter, Mike Adair, Nedjo Rodgers,
  Tom Kralidis, Matthew Perry.
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  
  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
  
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/MapbuilderProxy.jsp
  
  Index: MapbuilderProxy.jsp
  ===================================================================
  <%
  /**
   * This is a JSP replacement for ProxyRedirect servlet from mapbuilder,
   * so it is no needed to include the servlet into the geoserver code base
   */
  
  	if("GET".equals(request.getMethod())){
  		//execute the GET
  		String serverUrl = request.getParameter("url");
  		java.net.URL url = new java.net.URL(serverUrl);
  		if (!"http".equals(url.getProtocol())) {
  			throw new javax.servlet.ServletException(
  					"only use HTTP Url's, please don't hack this server!");
  		}
  		java.io.InputStream in = url.openStream();
  
  		response.setContentType("text/xml");
  		byte[] buff = new byte[1024];
  		int count;
  		java.io.OutputStream o = response.getOutputStream();
  		while ((count = in.read(buff)) > -1) {
  			o.write(buff, 0, count);
  		}
  		o.flush();
  		o.close();
  	}else{
  		//execute the POST
      try {
        // Transfer bytes from in to out
        java.io.PrintWriter o = response.getWriter();
        javax.servlet.ServletInputStream in = request.getInputStream();
        
        org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
  
        String serverUrl = request.getHeader("serverUrl");
        org.apache.commons.httpclient.methods.PostMethod httppost = new org.apache.commons.httpclient.methods.PostMethod(serverUrl);
  
        httppost.setRequestBody(in);
        //httppost.setRequestContentLength(PostMethod.CONTENT_LENGTH_CHUNKED);
  
        client.executeMethod(httppost);
  
        if (httppost.getStatusCode() == org.apache.commons.httpclient.HttpStatus.SC_OK) {
          response.setContentType("text/xml");
          String responseBody = httppost.getResponseBodyAsString();
          response.setContentLength(responseBody.length());
          System.out.println("responseBody:" + responseBody);
          o.print( responseBody );
        } else {
          throw new javax.servlet.ServletException("Unexpected failure: " + httppost.getStatusLine().toString());
        }
        httppost.releaseConnection();
        o.flush();
        o.close();
      } catch (java.io.IOException e) {
        throw new javax.servlet.ServletException(e);
      }    
  	}
  	%>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/README
  
  Index: README
  ===================================================================
  mapbuilder-lib
  ==============
  $Id$
  
  Version
  =======
  mapbuilder-lib-1.0-rc2
  
  Installation
  ============
  Download the latest mapbuilder-lib file from
  http://sourceforge.net/projects/mapbuilder
  
  Uncompress the file.
  
  Run
  ===
  You can view an index of demonstration applications by viewing the
  following file in a recent web browser:  mapbuilder\demo\index.html
  
  Some demonstrations require mapbuilder to be installed in a web server
  which supports PHP (like Apache), or a Servlet Container (like Tomcat).
  
  For more information, refer to the documentation.
  
  Browser Support
  ===============
  Internet Explorer 6+, Netscape 6+, Mozilla 1.3+ are supported.
  
  Documentation
  =============
  More detailed documentation is available in the mapbuilder/docs directory
  and at http://mapbuilder.sourceforge.net
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  
  <HTML>
    <HEAD>
      <TITLE>Community Mapbuilder - developer's home page</TITLE>
      <link rel='StyleSheet' type='text/css' href='/mapbuilder/lib/skin/default/docsStyle.css'>
    </HEAD>
    <BODY>
    <h1>Community Mapbuilder</h1>
    <h3>Documentation</h3>
      <DL>
      <DT>
          <A href="demo">Demo pages</A>
      </DT>
      <DD>
          A collection of pages showing various configurations that are possible.
      </DD>
      <DT>
          <A href="http://docs.codehaus.org/display/MAP/Home/">Wiki</A>
      </DT>
      <DD>
          Both user and developer documentation are being maintained on the Codehaus wiki.
      </DD>
      <DT>
          <A href="userGuide">Tutorial</A>
      </DT>
      <DD>
        A short tutorial to introduce the concepts in mapbuilder.  
        This is now being maintained on the <a href="http://docs.codehaus.org/display/MAP/User+Guide">wiki.</a>
        (Only avaliable in a JSP install)
      </DD>
      <DT>
      <A href="docs/design/index.html">Software Design Description</A>
      </DT>
      <DD>
        High level design of mapbuilder-lib.
      </DD>
      <DT>
      <A href="docs/jsdoc/index.html">Jsdoc - Class description</A>
      </DT>
      <DD>
        Description of javascript classes in a javadoc format.
      </DD>
      <DT>
          <A href="docs/register/">Component register</A>
      </DT>
      <DD>
        For help with selecting components to be included in your configuration.  
        This will become a wizard type of thing eventually.
      </DD>
  
      <h3>Credits</h3>
      <p>This software is built using:</p>
      <dt><a href="http://mapbuilder.sourceforge.net">Mapbuilder-lib</a></dt>
      <dd>mapbuilder-lib is an open source library of browser based mapping widgets.</dd>
      <dt><a href="http://sarissa.sourceforge.net">Sarissa</a></dt>
      <dd>Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs. It offers various XML related goodies like Document instantiation, XML loading from URLs or strings, XSLT transformations, XPath queries etc and comes especially handy for people doing what is lately known as "AJAX" development.</dd>
      <dt><a href="http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm">Walter Zorn's JS Graphics</a></dt>
      <dd>This JavaScript VectorGraphics library provides graphics capabilities for JavaScript</dd>
      <dt>Javascript Compression</dt>
      <dd>Our Javascript Compression is derived from Eric Hammond's <a href="http://www.anvilon.com/software/jsjam">JS JAM</a></dd>
      <dt><a href="http://mapserver.commenspace.org/tools/scalebar/">Scalebar</a></dt>
      <dd>Adapted from Tim Schaub's scalebar tool <a href="http://www.commenspace.org/">CommEn Space</a></dd>
      </DL>
  
      <table class="footer">
        <tr>
          <td><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a></td>
          <td width="60"><img src="lib/skin/default/images/Icon.gif"/></td>
        </tr>
      </table>
  
    </BODY>
  </HTML>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/wfs.jsp
  
  Index: wfs.jsp
  ===================================================================
  <%@ taglib uri="/WEB-INF/taglibs-xtags.tld" prefix="xtags" %>
  <%
      /* Get the WFS GetFeature request and the XSL Stylesheet
       * If not specified, use the defaults
       */
       String xml = request.getParameter("wfsurl");
       if (xml == null)
       {
           xml = "wfs.xml";
       }
  
       String xsl = request.getParameter("xsl");
       if (xsl == null) 
       {
           xsl = "wfs.xsl";
       }
  
  %>
  
  <html>
  <head>
  <title> Map Query </title>
  <style>
     ul     { font-size: 12pt; list-style-type: none; padding:1px; padding-left:16px; }
     a      { color: darkblue }
     .title { font-size: 16pt; width:100%; color:darkblue; border: 1px black solid;
              text-align:center; padding: 1px; }
  </style>
  </head>
  <body>
  <div class="title"> Map Query </div>
  <xtags:style xml="<%=xml%>" xsl="<%=xsl%>"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  
  <HTML>
    <HEAD>
      <TITLE>Mapbuilder demos</TITLE>
      <link rel='StyleSheet' type='text/css' href='/mapbuilder/lib/skin/default/docsStyle.css'>
    </HEAD>
    <BODY>
      <h1>Mapbuilder Demo Pages</h1>
      <DL>
      
      <DT>
          <A href="simple/index.html">Simple Map Viewer</A>
      </DT>
      <DD>
        A minimal map implementation showing a map embedded in a page.
      </DD>
      
      <DT>
          <A href="basic/index.html">Basic Map Viewer</A>
      </DT>
      <DD>
        A basic map viewer implementation.
        This is a good demo to copy when building a new application.
      </DD>
      
      <DT>
          <A href="Demis/index.html">Demis Maps Viewer</A>
      </DT>
      <DD>
        A Demis maps viewer which allows a user to switch maps Google style.
      </DD>
      
      <DT>
          <A href="timeSeries/index.html">WMS Time Series</A>
      </DT>
      <DD>
        Shows maps as a time series.  Zoom in to a region of interest.
      </DD>
      <!--DT>
          <A href="complete/index.html">Complete configuration</A>
      </DT>
      <DD>
        Not pretty to look at but shows integration of most components.
        Intended for testing extensions to the code base.
      </DD-->
      <DT>
          <A href="wfs-t/index.html">Feature Entry</A>
      </DT>
      <DD>
        Shows editing and updating of GML features and uploading to a
        Transactional Web Feature Service (WFS-T).
        This demo accesses data from a 
        <a href="http://geoserver.sourceforge.net">Geoserver</a>
        installation <a href="wfs-t/install.html">installed</a> in the same
        Java Servlet Webapps directory as Mapbuilder.
      </DD>
      <DT>
          <A href="contextEditor/index.html">Context Editor</A>
      </DT>
      <DD>
        Creation and editing of Web Map Context documents from searching and browsing a registry.
      </DD>
      <!--DT>
          <A href="geoRSS/index.html">Live RSS/Atom Feeds with georss extension</A>
      </DT>
      <DD>
        A small application initially demonstrated at <a href="http://mapserver.gis.umn.edu/mum/mtg2005.html">OSG'05</a> 
        that showed how to extend Mapbuilder.<br/> 
        This one processes a live geoRSS feed.
        While this is <a href='geoRSS/index2.html'>Atom feed variation of it</a> (using georss pro extension) <a href='www.georss.org'>from georss.org</a>
      </DD-->
      <!--
      <DT>
          <A href="forms">Form test page</A>
      </DT>
      <DD>
        A schema driven form application for editing XML documents.
      </DD>
      <DT>
          <A href="owsContext">OWS Context IE</A>
      </DT>
      <DD>
        A page demostrating the results of the OWS Context Interoperability
        Experiment from the OGC.
      </DD>
      <DT>
          <A href="wpsIE/index.html">OGC WPS IE</A>
      </DT>
      <DD>
        A generic client for the Web Processing Service Interoperability
        Experiment from the OGC.
      </DD>
      -->
      </DL>
      <ul>
        <li>Browsers supported are Internet Explorer 6 or later, Mozilla 1.3 or later, Netscape 6 or later.</li>
        <li>Some functionality requires the server proxy and serialize 
        scripts in the configuration file.  Implementations of these 
        are available for PHP enabled servers and Java Servlet Container 
        (like Tomcat).
        </li>
      </ul>
    
      <table class="footer">
        <tr>
          <td><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</td>
          <td width="60"><img src="../lib/skin/default/images/Icon.gif"/></td>
        </tr>
      </table>
  
    </BODY>
  </HTML>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/Demis/BlueMarble.xml
  
  Index: BlueMarble.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  
  	<General>
  
  		<Window width="600" height="300"/>
  
  		<BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
  
  		<Title xml:lang="en">World Base Map</Title>
  
  		<KeywordList>
  
  			<Keyword>world</Keyword>
  
  			<Keyword>atlas</Keyword>
  
  		</KeywordList>
  
  		<Abstract xml:lang="en">World Base Map.</Abstract>
  
  	</General>
  
  	<LayerList>
  
  		<Layer queryable="1" hidden="0">
  
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=BlueMarble"/>
  
  			</Server>
  
  			<Name>Countries,Earth+Image,Coastlines,Waterbodies,Transportation,Borders,Cities,Airports</Name>
  
  			<Title>WMS 1.0</Title>
  
  			<SRS>EPSG:4326</SRS>
  
  			<FormatList>
  
  				<Format current="1">image/gif</Format>
  
  			</FormatList>
  
  			<StyleList>
  
  				<Style current="1">
  
  					<Name>default</Name>
  
  					<Title>default</Title>
  
  				</Style>
  
  			</StyleList>
  
  		</Layer>
  
  	</LayerList>
  
  </ViewContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/Demis/CollectionList.xsl
  
  Index: CollectionList.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parses an OGC context collection document to generate a context pick list
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xlink="http://www.w3.org/1999/xlink"
      exclude-result-prefixes="wmc xlink">
  
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8"/>
    <xsl:strip-space elements="*"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
  
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <!-- xsl:param name="jsfunction">config.loadModel('</xsl:param -->
    <xsl:param name="jsfunction">modelSwitcher('</xsl:param>
    <xsl:param name="targetModel"/>
  
    <!-- template rule matching source root element -->
    <xsl:template match="/wmc:ViewContextCollection">
  
      <ul>
        <xsl:apply-templates select="wmc:ViewContextReference"/>
      </ul>
  
    </xsl:template>
  
    <xsl:template match="wmc:ViewContextReference">
      <xsl:param name="linkUrl">javascript:<xsl:value-of select="$jsfunction"/><xsl:value-of select="$targetModel"/>','<xsl:value-of select="wmc:ContextURL/wmc:OnlineResource/@xlink:href"/>')</xsl:param>
      <xsl:param name="name"><xsl:value-of select='wmc:Title'/></xsl:param>
      <input type='button' value="{$name}"  onClick="{$linkUrl}" />
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/Demis/DemisWorldMap.xml
  
  Index: DemisWorldMap.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  
  	<General>
  
  		<Window width="600" height="300"/>
  
  		<BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
  
  		<Title xml:lang="en">World Base Map</Title>
  
  		<KeywordList>
  
  			<Keyword>world</Keyword>
  
  			<Keyword>atlas</Keyword>
  
  		</KeywordList>
  
  		<Abstract xml:lang="en">World Base Map.</Abstract>
  
  	</General>
  
  	<LayerList>
  
  		<Layer queryable="1" hidden="0">
  
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  
  			</Server>
  
  			<Name>Bathymetry,Countries,Topography,Hillshading,Builtup+areas,Coastlines,Waterbodies,Inundated,Rivers,Streams,Railroads,Highways,Roads,Trails,Borders,Cities,Settlements,Spot+elevations,Airports,Ocean+features</Name>
  
  			<Title>WMS 1.0</Title>
  
  			<SRS>EPSG:4326</SRS>
  
  			<FormatList>
  
  				<Format current="1">image/gif</Format>
  
  			</FormatList>
  
  			<StyleList>
  
  				<Style current="1">
  
  					<Name>default</Name>
  
  					<Title>default</Title>
  
  				</Style>
  
  			</StyleList>
  
  		</Layer>
  
  	</LayerList>
  
  </ViewContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/Demis/USAMap.xml
  
  Index: USAMap.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  
  	<General>
  
  		<Window width="600" height="300"/>
  
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
  
  		<Title xml:lang="en">World Base Map</Title>
  
  		<KeywordList>
  
  			<Keyword>world</Keyword>
  
  			<Keyword>atlas</Keyword>
  
  		</KeywordList>
  
  		<Abstract xml:lang="en">World Base Map.</Abstract>
  
  	</General>
  
  	<LayerList>
  
  		<Layer queryable="1" hidden="0">
  
  			<Server service="OGC:WMS" version="1.1.0" title="OGC:WMS">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/wms/wms.asp?WMS=USAMap"/> 
  
  			</Server>
  
  		  <Name>Land,Topography,Urban+area,Hillshading,Park+or+Forest,Waterbodies,Rivers,Streams,State+line,Roads,Main+Roads,Highways,Cities,State+Capital</Name>  
  
  			<Title>WMS 1.1</Title>
  
  			<SRS>EPSG:4326</SRS>
  
  			<FormatList>
  
  				<Format current="1">image/gif</Format>
  
  			</FormatList>
  
  			<StyleList>
  
  				<Style current="1">
  
  					<Name>default</Name>
  
  					<Title>default</Title>
  
  				</Style>
  
  			</StyleList>
  
  		</Layer>
  
  	</LayerList>
  
  </ViewContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/Demis/atlasWorld.xml
  
  Index: atlasWorld.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="600" height="300"/>
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <Title xml:lang="en">World Base Map</Title>
      <Title xml:lang="fr">Carte mondiale de base</Title>
      <KeywordList>
        <Keyword>world</Keyword>
        <Keyword>atlas</Keyword>
      </KeywordList>
      <Abstract xml:lang="en">Atlas of Canada, World Base Map. Small scale vector based map served by Mapserver WMS.</Abstract>
      <Abstract xml:lang="fr">L`atlas du Canada, Carte mondiale de base. Une carte de petite échelle servis par Mapserver WMS.</Abstract>
      <LogoURL width="34" height="35" format="image/jpg">
        <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/site/english/atlas_identifier.jpg"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Michael Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+1 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+1 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>land</Name>
        <Title>land area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>lake_fill</Name>
        <Title>lakes</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>lake_outline</Name>
        <Title>lake outlines</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>rivers</Name>
        <Title>rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>boundaries</Name>
        <Title>boundaries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="1">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>capital</Name>
        <Title>capitals</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>country_names</Name>
        <Title>country names</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="1">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>capital_names</Name>
        <Title>capital names</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/Demis/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by Tom Kralidis (NRCAN CCRs) -->
  <MapbuilderConfig version="1.0.0" id="DemisMapExample" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>DemisWorldMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<Loading id="loading"/>
  				<Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</Loading2>
  				<ModelUrlInput id="urlInput"/>
  				<AoiBoxDHTML id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/Null.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<MapScaleText id="mapScaleText"/>
  				<!-- 
          <MapScaleBar id="mapScaleBar"/> 
          -->
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  					<showPx>false</showPx>
  					<showDMS>true</showDMS>
  					<showLatLong>false</showLatLong>
  					<showMGRS>false</showMGRS>
  					<precision>2</precision>
  				</CursorTrack>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<MouseClickHandler id="mainMouseClick"/>
  				<History id="extentHistory">
  					<targetModel>mainMap</targetModel>
  				</History>
  			</tools>
  		</Context>
  		<ContextCollection id="collectionGroup">
  			<defaultModelUrl>mapCollection.xml</defaultModelUrl>
  			<widgets>
  				<CollectionList id="collectionList">
  					<targetModel>mainMap</targetModel>
  					<stylesheet>./CollectionList.xsl</stylesheet>
  				</CollectionList>
  			</widgets>
  		</ContextCollection>
  	</models>
  	<widgets>
  		<Back id="back">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/UndoDisable.png</disabledSrc>
  		</Back>
  		<Forward id="forward">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/RedoDisable.png</disabledSrc>
  		</Forward>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<SetAoi id="setAoi">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/SetAoiEnable.png</enabledSrc>
  			<disabledSrc>/images/SetAoiDisable.png</disabledSrc>
  		</SetAoi>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<ModelSwitcher id="switcher">
  			<targetModel>mainMap</targetModel>
  		</ModelSwitcher>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<languages>en,fr,fr-CA</languages>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/Demis/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Mapbuilder Demis Maps Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config.xml';
        
        function modelSwitcher( targetModel, modelUrl ) {
          config.objects.switcher.switchMap( targetModel, modelUrl );
        }
        
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    
    <body onload="mbDoLoad()">
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> Demis Maps Demo</h1>
        <tr><td>
          <div id="collectionList"></div>
        </td></tr>
        <tr><td>
        <div id="xxx"></div>
        </td></tr>
        <tr><td>
          <div id="mainMapPane">
          <noscript>
              this page requires Javascript to be enabled
          </noscript>
          </div>
        </td></tr>
      </table>
      
      <table>     
        <tr>
          <td align='left' id="mainButtonBar"></td>
          <td align="center" id="mapScaleText"/>
          <td align="center" id="mapScaleBar"/>
          <td align="right" id="cursorTrack" />
          <td id="aoiForm" />
        </tr>
   
      </table>
          
      <div id="loading">
        <p>Loading Program<br/>
        <img src="../../lib/skin/default/images/Loading.gif"/>
        </p>
      </div>
   
      <table><tbody> 
        <tr align="right">
          <td> Built with
            <a href="http://mapbuilder.sourceforge.net"> Community Map Builder </a>
          </td>
          <td> 
            <img src="../../lib/skin/default/images/Icon.gif"> 
          </td>
        </tr></tbody> 
      </table>
    </body>
  </html>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/Demis/mapCollection.xml
  
  Index: mapCollection.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContextCollection version="1.0.0" xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net http://schemas.opengis.net/context/1.0.0/collection.xsd">
  	<!-- List of context XML URLs -->
    <ViewContextReference version="1.0.0" id="WorldMap">
      <Title>World</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="DemisWorldMap.xml"/>
      </ContextURL>
    </ViewContextReference>
  	<ViewContextReference version="1.0.0" id="USAMap">
      <Title>USA Streets</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="USAMap.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="BlueMarble">
  		<Title>Satellite</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="BlueMarble.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  </ViewContextCollection>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/australian_weather/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>context.xml</defaultModelUrl>
  			<widgets>
  				<Widget id="mapTitle">
  					<stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
  				</Widget>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<AoiBoxWZ id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxWZ>
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  				</CursorTrack>
  				<Legend id="legend">
          </Legend>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<MouseClickHandler id="mainMouseClick"/>
  			</tools>
  		</Context>
  		<Context id="locator">
  			<defaultModelUrl>../data/context/locatorMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="locatorWidget">
  					<htmlTagId>locatorMap</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<fixedWidth>180</fixedWidth>
  				</MapPane>
  				<AoiBoxWZ id="aoiBox3">
  					<htmlTagId>locatorMap</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxWZ>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="locatorAoi"/>
  				<ZoomToAoi id="locatorZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Context>
  		<Transaction id="transaction">
  			<widgets>
  				<TransactionResponse id="transactionResponse">
          </TransactionResponse>
  			</widgets>
  		</Transaction>
  	</models>
  	<widgets>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>/widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  	<!-- Url of LOCAL redirection script, required to access external URLs -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/australian_weather/context.xml
  
  Index: context.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="terrapages_aus" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="500" height="500"/>
      <BoundingBox SRS="EPSG:4326" minx="110" miny="-50" maxx="160" maxy="0"/>
      <Title>BOM, Australia</Title>
      <KeywordList>
        <Keyword>australia</Keyword>
      </KeywordList>
      <Abstract>BOM</Abstract>
      <LogoURL width="187" height="48" format="image/gif">
        <OnlineResource xlink:type="simple" xlink:href="http://www.bom.gov.au/images/bom_logo.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
      </DescriptionURL>
    </General>
    <LayerList>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>coast</Name>
  <Title>Australian Coast</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>satirgif</Name>
  <Title>Satellite IR</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>radarseaus</Name>
  <Title>Radar for SE Australia</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>radarnsw</Name>
  <Title>Radar for New South Wales</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>radarqld</Name>
  <Title>Radar for Queensland</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>radarnt</Name>
  <Title>Radar for Northern Territory</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>radarwa</Name>
  <Title>Radar for Western Australia</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>radarsa</Name>
  <Title>Radar for South Australia</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>hotspots</Name>
  <Title>Hotspots from CSIRO Sentinel</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>windanalysis</Name>
  <Title>Wind Analysis</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>forecasts_icon</Name>
  <Title>Precis Forecast (icon)</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>forecast_text</Name>
  <Title>Temperature Forecast</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
     <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://www4.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map"/>
        </Server>
  <Name>coastline</Name>
  <Title>GA 100k Coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
          <Format current="0">image/png</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/australian_weather/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  <!--
  Description: A Browser based Transactional Web Feature Server client
               based on javascript and XSL
               libraries from http://mapbuilder.sourceforge.net .
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
  <html>
    <head>
      <title>Map Builder Demo for BOM</title>
  
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
  
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config.xml';
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
  
    <body onload="mbDoLoad()">
      <!-- Layout mapbuilder widgets and HTML -->
      <table>
        <tr><th colspan=2> <img src="http://www.bom.gov.au/images/bom_logo.gif" width=187 hieght=48 alt="[BOM]" align=center ></th></tr>
        <tr><td><h2 id="mapTitle"/></td></tr>
        <tr valign="top">
          <td>
            <table>
              <tr><td colspan="2" id="mainMapPane"/></tr>
              <tr>
                <td align="left" id="mainButtonBar"/>
                <td align="right" id="cursorTrack" />
              </tr>
            </table>
          </td>
          <td>
            <table>
              <tr><td valign="top" id="locatorMap"/></tr>
              <tr><td id="legend"/></tr>
            </table>
          </td>
        </tr>
        <tr align="right">
          <td colspan="2">
            <table>
              <tr align="right">
                <td>Built with <a href="http://mapbuilder.sourceforge.net">Community Map Builder</a></td>
                <td><img src="../../lib/skin/default/images/Icon.gif"/></td>
              </tr>
            </table>
          </td>
        </tr>
        <tr><td id="eventLog"/></tr>
      </table>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/basic/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="1.0.0" id="basicMap" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>../data/context/demisWorldMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<AoiBoxDHTML id="aoiBoxMain">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>2</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<Legend id="legend"/>
  				<Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</Loading2>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  			</tools>
  		</Context>
  	</models>
  	<widgets>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/basic/index.html
  
  Index: index.html
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        
  <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
      <title>Mapbuilder Basic Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config.xml';
  
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> Basic Demo</h1>
      <div id="mainMapPane">
          <noscript>
              this page requires Javascript to be enabled
          </noscript>
    </div>
      <div id="mainButtonBar">
      </div>
      <div id="legend">
      </div>
      <div>
      <h2>Examples of working with MapBuilder:</h2>
      <ul>
        <li>
          <a href="javascript:alert('hover over this link to see the AOI')" 
            onmouseover="config.objects.mainMap.setParam('aoi', new Array(new Array(-25,50),new Array(30,-25)))">Highlight an Area of Interest (AOI)</a>
        </li>
        <li>
          <a href="?mainMap=../data/context/cded.xml">Load a different map by a URL parameter</a>
        </li>
        <li>
          <a href="javascript:config.loadModel('mainMap','../data/context/modisWorld.xml')">
          Load a different map by JavaScript function call</a>
        </li>
        <li>
          <a href="?bbox=0,0,50,50">Load the map with a different Bounding Box</a>
        </li>
        <li>etc.</li>
      </ul>
      </div>
    </body>
  </html>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/complete/complete.jsp
  
  Index: complete.jsp
  ===================================================================
  <%@page contentType="text/html"%>
  
  <!--
  Description: A Browser based Web Map Server Client based on javascript and XSL
               libraries from http://mapbuilder.sourceforge.net .
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  <%
    request.setAttribute("mbConfigUrl", "/demo/complete/completeConfig.xml");
  %>
  
  
  <html>
    <head>
      <title>Mapbuilder Demo</title>
  
      <link rel="stylesheet" href="<%= request.getContextPath() %>/lib/skin/default/mapStyle.css" type="text/css">
  
    <jsp:include page="/MapbuilderHead.jsp" flush="true"/>
  
    </head>
  
    <body onload="mbDoLoad()">
      <!-- Layout mapbuilder widgets and HTML -->
      <h1><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a> Demo</h1>
      <table>
        <tr>
          <td valign="top" style="padding:6px;width:180">
          <div id="locatorMap" >
          </td>
          <td>
            <h2 id="mapTitle"></h2>
            <div id="mainMapPane"/>
          </td>
        </tr>
        <tr>
          <td/>
          <td valign="top">
            <table width="100%">
              <tr>
                <td align="left">
                  <div id="mainButtonBar"/>
                </td>
                <td align="center" id="mapScaleText"/>
                <td align="right" id="cursorTrack" />
              </tr>
            </table>
          </td>
        </tr>
        <tr>
          <td id="legend"/>
          <td id="collectionList"/>
        </tr>
        <tr>
          <td id="locationsSelect"/>
          <td id="ntsLookupForm"/>
        </tr>
        <tr>
          <td id="urlInput"/>
          <td id="abstract"/>
        </tr>
        <tr>
          <td id="saveModel"/>
          <td id="wmsCapabilitiesImport"/>
        </tr>
        <tr>
          <td/>
          <td id="aoiForm"/>
        </tr>
        <tr>
          <td id="featureList"/>
          <td id="transactionResponse"/>
        </tr>
        <tr>
          <td colspan="2">
            <div id="eventLog"/>
          </td>
        </tr>
      </table>
      <br/>
      <p align="right"><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</p>
  
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/complete/completeConfig.xml
  
  Index: completeConfig.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: hhttp://www.gnu.org/copyleft/lesser.html
  
      $Id$
    -->
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
  	<models>
  		<!--Logger id="eventLogDoc">
        <serializeUrl>../../writeXml</serializeUrl>
        <widgets>
          <Widget id="eventLog">
            <stylesheet>../../lib/widget/EventLog.xsl</stylesheet>
          </Widget>
        </widgets>
      </Logger-->
  		<Context id="mainMap">
  			<defaultModelUrl>../data/context/demisWorldMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<MapScaleBar id="scalebar">
          	<!--all of these properties are optional--> 
          	<!--displaySystem>english</displaySystem--> 
          	<displaySystem>metric</displaySystem> 
            <minWidth>100</minWidth>
            <maxWidth>300</maxWidth>
          	<divisions>4</divisions>
            <subdivisions>2</subdivisions>
          	<showMinorMeasures>false</showMinorMeasures>
            <abbreviateLabel>true</abbreviateLabel>
            <singleLine>false</singleLine>
            <align>left</align>  <!-- left, center, or right -->
          </MapScaleBar>
  				<Loading id="loading"/>
          <Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
          </Loading2>
  				<AoiBoxDHTML id="aoiBoxMain">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  					<showXY>false</showXY>
  				</CursorTrack>
  				<Legend id="legend"/>
  				<Widget id="abstract">
  					<stylesheet>../../lib/widget/Abstract.xsl</stylesheet>
  				</Widget>
  				<Widget id="mapTitle">
  					<stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
  				</Widget>
  				<!--AoiForm id="aoiForm"/-->
  				<MapScaleText id="mapScaleText"/>
  				<SaveModel id="saveModelWidget">
  					<htmlTagId>saveModel</htmlTagId>
  				</SaveModel>
  				<LayerControl id="layerControl">
            <moveUpImage>/images/LayerMoveUpDisable.png</moveUpImage>
            <moveDownImage>/images/LayerMoveDownDisable.png</moveDownImage>
            <deleteImage>/images/LayerRemoveDisable.png</deleteImage>
  				</LayerControl>
  				<!--
          <SearchForm id="searchForm">
          </SearchForm>
          -->
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<MouseClickHandler id="mainMouseClick"/>
          <History id="extentHistory">
            <targetModel>mainMap</targetModel>
          </History>
  			</tools>
  		</Context>
  		<Context id="locator">
  			<defaultModelUrl>../data/context/locatorMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="locatorWidget">
  					<htmlTagId>locatorMap</htmlTagId>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<fixedWidth>180</fixedWidth>
  					<extraAttributes>false</extraAttributes>
  				</MapPane>
  				<AoiBoxDHTML id="aoiBoxLocator">
  					<htmlTagId>locatorMap</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<ModelUrlInput id="urlInput">
  					<defaultUrl>../data/context/modisWorld.xml</defaultUrl>
  				</ModelUrlInput>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="locatorAoi"/>
  				<ZoomToAoi id="locatorZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Context>
  		<ContextCollection id="collectionGroup">
  			<defaultModelUrl>../data/context/demoCollection.xml</defaultModelUrl>
  			<widgets>
  				<CollectionList id="collectionList">
  					<targetModel>mainMap</targetModel>
  				</CollectionList>
  			</widgets>
  		</ContextCollection>
  		<Model id="locations">
  			<defaultModelUrl>../data/locations/Global.xml</defaultModelUrl>
  			<widgets>
  				<Locations id="locationsSelect">
  					<targetModel>mainMap</targetModel>
  				</Locations>
  			</widgets>
  			<tools>
  				<ZoomToAoi id="locationsZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Model>
  		<Transaction id="transaction">
  			<widgets>
  				<TransactionResponse id="transactionResponse">
          </TransactionResponse>
  			</widgets>
  		</Transaction>
      <Model id="featureInfoResponse" template="true">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <FeatureInfo id="features">
            <htmlTagId>featureInfo</htmlTagId>
          </FeatureInfo>
        </widgets>
      </Model>
  		<FeatureCollection id="featureCollection">
  			<widgets>
  				<GmlRendererWZ id="testGmlRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			
  			</widgets>
  			<namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
  		</FeatureCollection>
  		<FeatureCollection id="ntsGml" template="true">
  			<!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
  			<widgets>
  				<GmlRendererWZ id="testNTSRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF00FF</lineColor>
  					<lineWidth>2</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			</widgets>
  		</FeatureCollection>
  		<FeatureCollection id="watershedGml">
  			<!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
  			<widgets>
  				<GmlRendererWZ id="watershedRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#0000FF</lineColor>
  					<lineWidth>1</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			</widgets>
  		</FeatureCollection>
  		<!-- example of the point feature renderer
      <FeatureCollection id="pointFeatures">
        <defaultModelUrl>../data/gml/topp_cities.xml</defaultModelUrl>
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <nodeSelectXpath>/wfs:FeatureCollection/gml:featureMember/topp:tasmania_cities</nodeSelectXpath>
        <widgets>
          <GmlPointRenderer id="pointRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
            <normalImage>/images/MarkerA.gif</normalImage>
            <highlightImage>/images/MarkerB.gif</highlightImage>
          </GmlPointRenderer>
        </widgets>
      </FeatureCollection>
      -->
  		<WmsCapabilities id="wmsCapTemplate">
  			<widgets>
  				<Widget id="loadAllLayers">
  					<stylesheet>../../lib/widget/SelectAllMapLayers.xsl</stylesheet>
  				</Widget>
  				<ModelStatus id="wmsLoadStatus">
  					<htmlTagId>layerList</htmlTagId>
  					<outputNodeId>layerListCanvas</outputNodeId>
  				</ModelStatus>
  				<Widget id="layerListWidget">
  					<htmlTagId>layerList</htmlTagId>
  					<outputNodeId>layerListCanvas</outputNodeId>
  					<stylesheet>../../lib/widget/SelectMapLayers.xsl</stylesheet>
  				</Widget>
  			</widgets>
  			<tools>
  				<Caps2Context id="convertCaps">
  					<targetModel>mainMap</targetModel>
  				</Caps2Context>
          <EditContext id="editContext">
            <targetModel>mainMap</targetModel>
          </EditContext>
  			</tools>
  			<nodeSelectXpath>//Layer</nodeSelectXpath>
  		</WmsCapabilities>
  	</models>
  	<widgets>
  		<ModelUrlInput id="wmsCapsUrlInput">
  			<targetModel>wmsCapTemplate</targetModel>
  			<defaultUrl>http://localhost:8080/geoserver/wms/GetCapabilities</defaultUrl>
  		</ModelUrlInput>
  		<WebServiceForm id="ntsLookupForm">
  			<targetModel>ntsGml</targetModel>
  			<stylesheet>../../lib/widget/NtsForm.xsl</stylesheet>
  			<webServiceUrl>http://geoservices.cgdi.ca/NTS/NTSLookup</webServiceUrl>
  		</WebServiceForm>
  		<WebServiceForm id="watershedLookupForm">
  			<htmlTagId>ntsLookupForm</htmlTagId>
  			<targetModel>watershedGml</targetModel>
  			<stylesheet>../../lib/widget/CdnWatershedForm.xsl</stylesheet>
  			<webServiceUrl>http://devgeo.cciw.ca:8080/WatershedLookupServlet/WatershedLookupServlet</webServiceUrl>
  		</WebServiceForm>
      <Back id="back">
        <buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/UndoDisable.png</disabledSrc>
      </Back>
      <Forward id="forward">
        <buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/RedoDisable.png</disabledSrc>
      </Forward>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<SetAoi id="setAoi">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/SetAoiEnable.png</enabledSrc>
  			<disabledSrc>/images/SetAoiDisable.png</disabledSrc>
  		</SetAoi>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<GetFeatureInfo id="getFeatureInfo">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureInfoResponse</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/QueryEnable.png</enabledSrc>
  			<disabledSrc>/images/QueryDisable.png</disabledSrc>
  			<context>mainMap</context>
  		</GetFeatureInfo>
  		<!--EditPoint id="editPoint">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditPointEnable.png</enabledSrc>
  			<disabledSrc>/images/EditPointDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>http://localhost:8080/geoserver/wfs</webServiceUrl>
  			<featureXpath>/gml:featureMember/points/_SHAPE_/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
  			<defaultModelUrl>../data/gml/defaultAddPoint.xml</defaultModelUrl>
  			<targetContext>mainMap</targetContext>
  		</EditPoint-->
  		<!--EditLine id="editLine">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditLineEnable.png</enabledSrc>
  			<disabledSrc>/images/EditLineDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>http://localhost:8080/geoserver/wfs</webServiceUrl>
  			<featureXpath>/gml:featureMember/topp:bc_roads/topp:the_geom/gml:MultiLineString/gml:lineStringMember/gml:LineString/gml:coordinates</featureXpath>
  			<defaultModelUrl>../data/gml/roads.xml</defaultModelUrl>
  			<targetContext>mainMap</targetContext>
  		</EditLine-->
  		<Save id="save">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/SaveDisable.png</disabledSrc>
  			<popupWindowName>modelXML</popupWindowName>
  		</Save>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<languages>en,fr,fr-CA</languages>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skinDir + language subdir -->
  	<!-- example of overriding the server config values -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/complete/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  <!--
  Description: A Browser based Web Map Server Client based on javascript and XSL
               libraries from http://mapbuilder.sourceforge.net .
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
  <html>
    <head>
      <title>Mapbuilder Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/button.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/scalebar-fat.css'>
  
  
      <script>
      // URL of Mapbuilder configuration file. Required.
      var mbConfigUrl='completeConfig.xml';
      
      //you can set the language value here; or as a param in the GET URL
      //var language="fr";
  
      //example of user initialization function;  all mapbuilder objects are
      //guaranteed to exist when this is called; 
      //pass a reference to it in the onload method
      function difnumInit() {
        config.loadModel('mainMap','../data/context/modisWorld.xml');
      }
      function aoiInit() {
        //example of setting AOI or bbox when the page loads
        //window.cgiArgs['bbox'] = "0,0,50,50";
        //window.cgiArgs['aoi'] = "0,0,50,50";
        //or else set these as URL params for the same effect
      }
      </script>
      
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
  
    <!--body onload="mbDoLoad(bboxInit)"-->
    <body onload="mbDoLoad(aoiInit)">
      <!-- Layout mapbuilder widgets and HTML -->
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> Demo</h1>
      <p style="text-align:right; font-size: 70%; margin-top: 0;">
        <a href="?language=en">English</a>
        <a href="?language=fr">francais</a>
      </p>
      <table>
        <tr>
          <td valign="top" style="padding:6px;width:180">
          <div id="locatorMap" >
          </td>
          <td>
            <h2 id="mapTitle"></h2>
            <div id="mainMapPane"/>
            <div id="loading">
              <p>Loading Program<br/>
              <img src="../../lib/skin/default/images/Loading.gif"/>
              </p>
            </div>
          </td>
        </tr>
        <tr>
          <td/>
          <td valign="top">
            <table width="100%">
              <tr>
                <td align="left">
                  <div id="mainButtonBar"/>
                </td>
                <td align="center" id="mapScaleText"/>
                <td align="right" id="cursorTrack" />
              </tr>
              <tr>
                <td colspan="3" id="scalebar"></td>
              </tr>
            </table>
          </td>
        </tr>
        <tr>
          <td id="legend"/>
          <td>
            Select a map to load:
            <div id="collectionList" style="float:left"/>
            <div id="featureInfo" style="float:right"></div>
          </td>
        </tr>
        <tr>
          <td><img id="previewImage" src="../../lib/skin/default/images/Spacer.gif" width="180"/>
          </td>
          <td id="layerControl"/>
        </tr>
        <tr>
          <td id="locationsSelect"/>
          <td id="ntsLookupForm"/>
        </tr>
        <tr>
          <td id="urlInput"/>
          <td id="aoiForm"/>
        </tr>
        <tr>
          <td id="saveModel"/>
          <td id="abstract"/>
        </tr>
        <tr>
          <td id="featureList"/>
          <td id="transactionResponse"/>
        </tr>
        <tr>
          <td/>
          <td>
            Specify a WMS capabilities doc to show as a map:
            <div id="wmsCapsUrlInput"/>
            <div id="loadAllLayers"/>
          </td>
        </tr>
        <tr>
          <td/>
          <td>
            <div id="layerList"/>
          </td>
        </tr>
        <tr>
          <td colspan="2">
            <div id="eventLog"/>
          </td>
        </tr>
      </table>
      <br/>
      <p align="right"><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</p>
  
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/OWSCatResourceFilter.xml
  
  Index: OWSCatResourceFilter.xml
  ===================================================================
  <Filter>
  
  	<And>
  
  		<BBOX>
  
  			<PropertyName>NAME</PropertyName>
  
  			<Box srsName="EPSG:4326">
  
  				<coordinates/>
  
  			</Box>
  
  		</BBOX>
  
  		<PropertyIsEqualTo>
  
  			<PropertyName>service_type</PropertyName>
  
  			<Literal>OGC:WMS</Literal>
  
  		</PropertyIsEqualTo>
  
  		<Or>
  
  			<Or>
  
  				<PropertyIsLike wildCard="*" singleChar="." escape="!">
  
  					<PropertyName>title</PropertyName>
  
  					<Literal/>
  
  				</PropertyIsLike>
  
  				<PropertyIsLike wildCard="*" singleChar="." escape="!">
  
  					<PropertyName>abstract</PropertyName>
  
  					<Literal/>
  
  				</PropertyIsLike>
  
  			</Or>
  
  			<PropertyIsLike wildCard="*" singleChar="." escape="!">
  
  				<PropertyName>keywords</PropertyName>
  
  				<Literal/>
  
  			</PropertyIsLike>
  
  		</Or>
  
  	</And>
  
  </Filter>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/OWSCatResultList.xsl
  
  Index: OWSCatResultList.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: presents the list of FeatureTypes from a WFS capabilities doc.
              Links provided to filter and load the selected FeatureType.
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wfs="http://www.opengis.net/wfs"
      xmlns:owscat="http://www.ec.gc.ca/owscat"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  		xmlns:ogc="http://www.opengis.net/ogc"
  		xmlns:gml="http://www.opengis.net/gml"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="skinDir"/>
  
    <xsl:param name="tooltip">click to add the layer to the map</xsl:param>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/wfs:FeatureCollection">
      <table>
        <tr>
          <th>
            Search results:
          </th>
        </tr>
        <xsl:apply-templates select="gml:featureMember/owscat:service_resources"/>
      </table>
    </xsl:template>
  
    <!-- template rule matching source root element -->
    <xsl:template match="owscat:service_resources">
      <xsl:variable name="rowClass">altRow_<xsl:value-of select="position() mod 2"/></xsl:variable>
      <xsl:variable name="abstract" select="owscat:abstract"/>
      <xsl:variable name="name" select="owscat:name"/>
      <tr class="{$rowClass}">
        <td>
          <h4>
          <a href="javascript:config.objects.addLayer.addLayerFromCat('{$name}')" class="mbButton">
            <img src="{$skinDir}/images/LayerAddDisable.png" title="{$tooltip}" border="0"/>
          </a>
          <xsl:value-of select="owscat:title"/></h4>
          <xsl:value-of select="concat(substring($abstract, 0, 200),'...')"/>
          <span class="dataSource">provided by: <xsl:value-of select="owscat:organization"/></span>
        </td>
      </tr>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/OWSCatSearchForm.js
  
  Index: OWSCatSearchForm.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display a form for input of parameters to generate a web service 
   * request.  This JS object handles the form submit via HTTP Get by appending 
   * a query string to the form's action URL.  The query string is created from
   * all input elements and their values.
   * The target model is then loaded from the URL created.
   * A stylehseet must be specified as a property in config for this widget.  
   * See widget/NtsForm.xsl for an example. 
   *
   * @constructor
   * @base WidgetBase
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function OWSCatSearchForm(widgetNode, model) {
    WidgetBaseXSL.apply(this, new Array(widgetNode, model));
  
    this.filter = Sarissa.getDomDocument();
    this.filter.async = false; 
    this.filter.load("OWSCatResourceFilter.xml");
    this.filter.setProperty("SelectionLanguage", "XPath");
  
  
    /**
     * Refreshes the form onblur handlers when this widget is painted.
     * @param objRef Pointer to this CurorTrack object.
     */
    this.postPaint = function(objRef) {
      objRef.searchForm = document.getElementById(objRef.formName);
      objRef.searchForm.parentWidget = objRef;
  
      objRef.searchForm.westCoord.onblur = objRef.setAoi;
      objRef.searchForm.northCoord.onblur = objRef.setAoi;
      objRef.searchForm.eastCoord.onblur = objRef.setAoi;
      objRef.searchForm.southCoord.onblur = objRef.setAoi;
      objRef.searchForm.westCoord.model = objRef.model;
      objRef.searchForm.northCoord.model = objRef.model;
      objRef.searchForm.eastCoord.model = objRef.model;
      objRef.searchForm.southCoord.model = objRef.model;
  
      objRef.searchForm.onkeypress = objRef.handleKeyPress;
      objRef.searchForm.onsubmit = objRef.submitForm;
      //objRef.searchForm.mapsheet.onblur = objRef.setMapsheet;
    }
  
    /**
     * Output the AOI coordinates to the associated form input elements.  This
     * method is registered as an AOI listener on the context doc.
     * @param objRef Pointer to this searchForm object.
     */
    this.displayAoiCoords = function(objRef) {
      //objRef.searchForm = document.getElementById(objRef.formName);
      var aoi = objRef.model.getParam("aoi");
      objRef.searchForm.westCoord.value = aoi[0][0];
      objRef.searchForm.northCoord.value = aoi[0][1];
      objRef.searchForm.eastCoord.value = aoi[1][0];
      objRef.searchForm.southCoord.value = aoi[1][1];
    }
    this.model.addListener('aoi', this.displayAoiCoords, this);
  
    /**
     * Handles user input from the form element.  This is an onblur handler for 
     * the input elements.
     */
    this.setAoi = function() {
      var aoi = this.model.getParam("aoi");
      if (aoi) {
        var ul = aoi[0];
        var lr = aoi[1];
        switch(this.name) {
          case 'westCoord':
            ul[0] = this.value;
            break;
          case 'northCoord':
            ul[1] = this.value;
            break;
          case 'eastCoord':
            lr[0] = this.value;
            break;
          case 'southCoord':
            lr[1] = this.value;
            break;
        }
        this.model.setParam("aoi",new Array(ul,lr) );
      }
    }
  
  /**
   * Change the AOI coordinates from select box choice of prefined locations
   * @param bbox the bbox value of the location keyword chosen
   */
    this.setLocation = function(bbox) {
      var bboxArray = new Array();
      bboxArray     = bbox.split(",");
      var ul = new Array(parseFloat(bboxArray[0]),parseFloat(bboxArray[2]));
      var lr = new Array(parseFloat(bboxArray[1]),parseFloat(bboxArray[3]));
      this.model.setParam("aoi",new Array(ul,lr));
  
      //convert this.model XY to latlong
      //convert latlong to targetmodel XY
      //extent.setAoi takes XY as input
      //this.targetModel.setParam("aoi", new Array(ul,lr));
      //this.targetModel.setParam("mouseup",this);
    }
  
  
    /**
     * Handles submission of the form (via javascript in an <a> tag)
     */
    this.submitForm = function() {
      var thisWidget = this.parentWidget;
      thisWidget.createFilter(thisWidget);
      thisWidget.targetModel.setParam("wfs_GetFeature","service_resources");
      return false;
    }
  
    /**
     * creates the filter expression
     */
    this.createFilter = function(objRef) {
      objRef.searchForm = document.getElementById(objRef.formName);
      var filter = config.objects["filterExpression"];    //TBD get this ID from config
  
      var aoi = this.model.getParam("aoi");
      var bboxStr = "";
      if (aoi) {
        bboxStr = aoi[0][0]+","+aoi[1][1]+" "+aoi[1][0]+","+aoi[0][1];
      } else {
        var bbox = this.model.getBoundingBox();
        bboxStr = bbox[0]+","+bbox[1]+" "+bbox[2]+","+bbox[3];
      }
      filter.setXpathValue(filter,"/Filter/And/BBOX/Box/coordinates",bboxStr);
      var keywords = "*"+objRef.searchForm.keywords.value+"*";
      filter.setXpathValue(filter,"/Filter/And/Or/Or/PropertyIsLike[PropertyName='title']/Literal",keywords);
      filter.setXpathValue(filter,"/Filter/And/Or/Or/PropertyIsLike[PropertyName='abstract']/Literal",keywords);
      filter.setXpathValue(filter,"/Filter/And/Or/PropertyIsLike[PropertyName='keywords']/Literal",keywords);
    }
  
  
    /**
     * handles keypress events to filter out everything except "enter".  
     * Pressing the "enter" key will trigger a form submit
     * @param event  the event object passed in for Mozilla; IE uses window.event
     */
    this.handleKeyPress = function(event) {
      var keycode;
      var target;
      if (event){
        //Mozilla
        keycode=event.which;
        target=event.currentTarget;
      }else{
        //IE
        keycode=window.event.keyCode;
        target=window.event.srcElement.form;
      }
  
      if (keycode == 13) {    //enter key
        return true;
      }
    }
  
    var RUC_Window=null;
    this.openRucWindow = function( rucType ) { 
      if ( RUC_Window == null || RUC_Window.closed ) { 
        var baseUrl;
        var params;
        switch(rucType) {
          case "placename":
            baseURL = "/rucs/placeName.html?language=" + config.lang + "&formName=" + this.formName;
            params = "width=290,height=480,scrollbars=0,toolbar=0,location=0,directories=0,status=0,menubar=0,resizable=0";
            break;
          case "postalCode":
            baseURL = "/rucs/postalCode.html?language=" + config.lang + "&formName=" + this.formName;
            params = "width=280,height=180,scrollbars=0,toolbar=0,location=0,directories=0,status=0,menubar=0,resizable=0";
            break;
          default:
            alert("unkown RUC type");
            break;
        }
        RUC_Window = open( baseURL, "RUCWindow", params );
      }
      RUC_Window.focus();
      return false;
    } 
    function RUC_closeRUCWindow() { 
      if ( RUC_Window != null && !RUC_Window.closed ) { 
        RUC_Window.close();
      } 
    } 
  
    //set some properties for the form output
    this.formName = "WebServiceForm_" + mbIds.getId();
    this.stylesheet.setParameter("formName", this.formName);
  }
  
    /**
     */
    SetAoiCoords = function(aoiBox) {
      config.objects.mainMap.setParam("aoi",aoiBox );
    }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/contextEditor.css
  
  Index: contextEditor.css
  ===================================================================
  IMG { border-style: none; }
  
  #cursorTrack, #cursorTrack INPUT
  {
    border: 0px blue none;
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
    background-color: transparent;
  }
  
  #mapScaleText, #mapScaleText INPUT
  {
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
  }
  
  #timestamp, #timestamp INPUT
  {
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
    background-color: transparent;
    border: 0px blue none;
  }
  
  #mainMapContainer {
    border: 1px solid olive;
    cursor: crosshair;
  }
  
  /* elements for the layerCOntrol widget */
  .layerControl TD {
    padding: 2px;
    font: 70% Verdana, geneva, arial, sans-serif;
  }
  
  .altRow_1 {
    background-color: #D1E2EC;
  }
  
  .altRow_0 {
    background-color: #FFFFFF;
  }
  
  .dataSource {
    font-size: 80%; 
    font-weight: bold; 
    float: right;
  }
  
  H4 {
    margin-bottom: 0;
  }
  
  
  /*
  #legend {
  	font-size: 70%; 
    font-family: cursive;
    background-color: silver;
  }
  */
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/contextEditor.xml
  
  Index: contextEditor.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by Tom Kralidis (NRCAN CCRs) -->
  <MapbuilderConfig version="1.0.0" id="contextEditorDemoConfig" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>../data/context/DM_Canada.xml</defaultModelUrl>
  			<!--defaultModelUrl>../data/context/atlasWorld.xml</defaultModelUrl-->
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<loadHidden>false</loadHidden>
  				</MapPane>
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  				</CursorTrack>
  				<Widget id="mapTitle">
  					<stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
  				</Widget>
  				<LayerControl id="contextLegend">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<moveUpImage>/images/LayerMoveUpDisable.png</moveUpImage>
  					<moveDownImage>/images/LayerMoveDownDisable.png</moveDownImage>
  					<deleteImage>/images/LayerRemoveDisable.png</deleteImage>
  				</LayerControl>
  				<OWSCatSearchForm id="owsCatSearchForm">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<targetModel>owsCatSearch</targetModel>
  					<scriptFile>OWSCatSearchForm.js</scriptFile>
  					<stylesheet>owsCatSearchForm.xsl</stylesheet>
  				</OWSCatSearchForm>
  				<AoiBoxDHTML id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</Loading2>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  			</tools>
  		</Context>
  		<Context id="locator">
  			<defaultModelUrl>../data/context/locatorMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="locatorWidget">
  					<htmlTagId>locatorMap</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<fixedWidth>180</fixedWidth>
  				</MapPane>
  				<AoiBoxDHTML id="locatorAoi">
  					<htmlTagId>locatorMap</htmlTagId>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="locatorMouse"/>
  				<ZoomToAoi id="locatorZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Context>
  		<ContextCollection id="myMapCollection">
  			<!--defaultModelUrl>../data/context/demoCollection.xml</defaultModelUrl-->
  			<widgets>
  				<CollectionList id="collectionList">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<targetModel>mainMap</targetModel>
  				</CollectionList>
  			</widgets>
  		</ContextCollection>
  		<!-- use this with a WFS capabilities model -->
  		<WfsCapabilities id="wfsCapTemplate">
  			<!--defaultModelUrl>http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA?version=1.0.0&amp;service=WFS&amp;request=GetCapabilities</defaultModelUrl-->
  			<models>
  				<FeatureTypeSchema id="featureTypeTemplate" template="true">
  					<widgets>
  						<Widget id="attributeFilter">
  							<htmlTagId>workspace</htmlTagId>
  							<outputNodeId>workspaceCanvas</outputNodeId>
  							<stylesheet>../../lib/widget/FilterAttributes.xsl</stylesheet>
  						</Widget>
  					</widgets>
  				</FeatureTypeSchema>
  				<FeatureCollection id="getFeatureTemplate" template="true">
  					<method>get</method>
  					<widgets>
  						<GmlRendererWZ id="testGmlRenderer">
  							<htmlTagId>mainMapPane</htmlTagId>
  							<targetModel>mainMap</targetModel>
  							<mapContainerId>mainMapContainer</mapContainerId>
  							<lineColor>#FF00FF</lineColor>
  							<lineWidth>1</lineWidth>
  							<pointDiameter>10</pointDiameter>
  						</GmlRendererWZ>
  						<Legend id="wfsLegend">
  							<htmlTagId>workspace</htmlTagId>
  							<outputNodeId>workspaceCanvas</outputNodeId>
  						</Legend>
  					</widgets>
  				</FeatureCollection>
  				<!--Transaction id="transactionTemplate" template="true">
            <method>post</method>
            <widgets>
              <ShowResponse id="transResponse"/>
            </widgets>
          </Transaction-->
  			</models>
  			<widgets>
  				<Widget id="featureTypes">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<stylesheet>../../lib/widget/SelectFeatureType.xsl</stylesheet>
  				</Widget>
  			</widgets>
  			<tools>
  				<WebServiceRequest id="wfsGetFeature">
  					<targetModel>getFeatureTemplate</targetModel>
  					<requestName>wfs:GetFeature</requestName>
  					<maxFeatures>20</maxFeatures>
  				</WebServiceRequest>
  				<WebServiceRequest id="wfsDescribeFeature">
  					<targetModel>featureTypeTemplate</targetModel>
  					<requestName>wfs:DescribeFeatureType</requestName>
  				</WebServiceRequest>
  				<!--WebServiceRequest id="wfsTransaction">
            <targetModel>transactionTemplate</targetModel>
            <requestName>wfs:Transaction</requestName>
          </WebServiceRequest-->
  			</tools>
  			<nodeSelectXpath>/wfs:WFS_Capabilities/wfs:FeatureTypeList/wfs:FeatureType</nodeSelectXpath>
  		</WfsCapabilities>
  		<WmsCapabilities id="wmsCapTemplate">
  			<!--defaultModelUrl>http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?version=1.1.1&amp;service=WMS&amp;request=GetCapabilities</defaultModelUrl-->
  			<title>OGC Web Map Server (WMS)</title>
  			<models>
  				<!--GetFeatureInfo id="featureTypeTemplate" template="true">
            <widgets>
              <Widget id="attributeFilter">
                <stylesheet>../../lib/widget/FilterAttributes.xsl</stylesheet>
                <outputNodeId>filterForm</outputNodeId>
              </Widget>
            </widgets>
          </GetFeatureInfo-->
  			</models>
  			<widgets>
  				<Widget id="layerList">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<stylesheet>../../lib/widget/SelectMapLayers.xsl</stylesheet>
  				</Widget>
  				<Loading2 id="loading3">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  				</Loading2>
  			</widgets>
  			<tools>
  				<!--WebServiceRequest id="wmsController">
            <targetModel>getMapTemplate</targetModel>
            <requestName>GetMap</requestName>
          </WebServiceRequest-->
  				<!--WebServiceRequest id="wmsController">
            <targetModel>getFeatureInfoTemplate</targetModel>
            <requestName>wms:GetFeatureInfo</requestName>
          </WebServiceRequest-->
  				<EditContext id="editContext">
  					<targetModel>mainMap</targetModel>
  				</EditContext>
  			</tools>
  			<nodeSelectXpath>//Layer</nodeSelectXpath>
  		</WmsCapabilities>
  		<Model id="wmsServers">
  			<title>Web Map Servers</title>
  			<widgets>
  				<WebServiceForm id="wmsServerList">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<targetModel>wmsCapTemplate</targetModel>
  					<stylesheet>../../lib/widget/ServiceRegistryList.xsl</stylesheet>
  					<serviceType>CgdiMapServices</serviceType>
  				</WebServiceForm>
  				<Loading2 id="loading1">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  				</Loading2>
  			</widgets>
  		</Model>
  		<Model id="wfsServers">
  			<title>Web Feature Servers</title>
  			<widgets>
  				<WebServiceForm id="wfsServerList">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<targetModel>wfsCapTemplate</targetModel>
  					<stylesheet>../../lib/widget/ServiceRegistryList.xsl</stylesheet>
  					<serviceType>CgdiFeatureServices</serviceType>
  				</WebServiceForm>
  				<Loading2 id="loadingWFSlist">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  				</Loading2>
  			</widgets>
  		</Model>
  		<WfsCapabilities id="owsCatSearch">
  			<defaultModelUrl>http://devgeo.cciw.ca/cgi-bin/mapserv/owscat?version=1.0.0&amp;service=WFS&amp;request=GetCapabilities</defaultModelUrl>
  			<models>
  				<Model id="filterExpression">
  					<defaultModelUrl>OWSCatResourceFilter.xml</defaultModelUrl>
  				</Model>
  				<OwsCatResources id="owsCatResults">
  					<method>get</method>
  					<widgets>
  						<!--GmlRendererWZ id="resultBbox">
                <htmlTagId>mainMapPane</htmlTagId>
                <targetModel>mainMap</targetModel>
                <lineColor>#FF0000</lineColor>
                <lineWidth>2</lineWidth>
                <pointDiameter>10</pointDiameter>
                <mapContainerId>mainMapContainer</mapContainerId>
              </GmlRendererWZ-->
  						<Widget id="resultList">
  							<htmlTagId>workspace</htmlTagId>
  							<outputNodeId>workspaceCanvas</outputNodeId>
  							<stylesheet>OWSCatResultList.xsl</stylesheet>
  						</Widget>
  					</widgets>
  					<tools>
  						<EditContext id="addLayer">
  							<targetModel>mainMap</targetModel>
  						</EditContext>
  					</tools>
  					<nodeSelectXpath>/wfs:FeatureCollection/gml:featureMember/owscat:service_resources</nodeSelectXpath>
  				</OwsCatResources>
  			</models>
  			<widgets>
  				<Loading2 id="loading">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  				</Loading2>
  			</widgets>
  			<tools>
  				<WebServiceRequest id="owsCatGetFeature">
  					<targetModel>owsCatResults</targetModel>
  					<requestName>wfs:GetFeature</requestName>
  					<requestFilter>filterExpression</requestFilter>
  					<maxFeatures>20</maxFeatures>
  				</WebServiceRequest>
  			</tools>
  			<nodeSelectXpath>/wfs:WFS_Capabilities/wfs:FeatureTypeList/wfs:FeatureType</nodeSelectXpath>
  		</WfsCapabilities>
  	</models>
  	<widgets>
  		<!--TabbedContent id="tabBar">
        <htmlWorkspace>workspace</htmlWorkspace>
        <tab>wmsServerList</tab>
        <tab>layerList</tab>
        <tab>wfsServerList</tab>
        <tab>featureTypes</tab>
        <tab>contextLegend</tab>
        <tab>owsCatSearchForm</tab>
      </TabbedContent-->
  		<ModelUrlInput id="urlInput">
  			<htmlTagId>workspace</htmlTagId>
  			<outputNodeId>workspaceCanvas</outputNodeId>
  			<targetModel>wmsCapTemplate</targetModel>
  		</ModelUrlInput>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<SetAoi id="setAoi">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/SetAoiEnable.png</enabledSrc>
  			<disabledSrc>/images/SetAoiDisable.png</disabledSrc>
  		</SetAoi>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<Save id="save">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/SaveDisable.png</disabledSrc>
  			<popupWindowName>modelXML</popupWindowName>
  		</Save>
  		<Loading2 id="loadingConfig">
  			<htmlTagId>workspace</htmlTagId>
  			<outputNodeId>workspaceCanvas</outputNodeId>
  		</Loading2>
  	</widgets>
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>/widgetText.xml</widgetTextUrl>
  	<!-- in the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/contextEditor_1.xml
  
  Index: contextEditor_1.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="WFSDemoConfig" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>../data/context/DM_Canada.xml</defaultModelUrl>
        <widgets>
          <!--GetMapRequest id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <tools>
              <AoiMouseHandler/>
              <AoiBox>
                <lineColor>#FF0000</lineColor>
                <lineWidth>2</lineWidth>
                <crossSize>1</crossSize>
              </AoiBox>
              <DragPanHandler>
                <enabled>false</enabled>
              </DragPanHandler>
            </tools>
          </GetMapRequest-->
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
            <loadHidden>false</loadHidden>
          </MapPane>
          <Loading id="loading">
          </Loading>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Widget id="mapTitle">
            <stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
          </Widget>
          <Legend id="legend">
            <htmlTagId>workspace</htmlTagId>
            <outputNodeId>workspaceCanvas</outputNodeId>
            <autoRefresh>false</autoRefresh>
          </Legend>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
      <Context id="locator">
        <defaultModelUrl>../data/context/locatorMap.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
      <ContextCollection id="myMapCollection">
        <!--defaultModelUrl>../data/context/demoCollection.xml</defaultModelUrl-->
        <widgets>
          <CollectionList id="collectionList">
            <htmlTagId>workspace</htmlTagId>
            <outputNodeId>workspaceCanvas</outputNodeId>
            <targetModel>mainMap</targetModel>
          </CollectionList>
        </widgets>
      </ContextCollection>
      <!-- use this with a WFS capabilities model -->
      <WfsCapabilities id="wfsCapTemplate">
        <defaultModelUrl>http://localhost:8080/geoserver/wfs?version=1.0.0&amp;service=WFS&amp;request=GetCapabilities</defaultModelUrl>
        <nodeSelectXpath>/wfs:WFS_Capabilities/wfs:FeatureTypeList/wfs:FeatureType[wfs:Name='topp:tasmania_cities']</nodeSelectXpath>
        <models>
          <FeatureTypeSchema id="featureTypeTemplate">
            <widgets>
              <Widget id="attributeFilter">
                <htmlTagId>workspace</htmlTagId>
                <outputNodeId>workspaceCanvas</outputNodeId>
                <stylesheet>../../lib/widget/FilterAttributes.xsl</stylesheet>
              </Widget>
            </widgets>
          </FeatureTypeSchema>
          <FeatureCollection id="getFeatureTemplate">
            <method>get</method>
            <featureXpath>/gml:featureMember/points/_SHAPE_/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
            <widgets>
              <GmlRendererWZ id="testGmlRenderer">
                <htmlTagId>mainMapPane</htmlTagId>
                <targetModel>mainMap</targetModel>
                <lineColor>#FF00FF</lineColor>
                <lineWidth>1</lineWidth>
                <pointDiameter>10</pointDiameter>
                <mapContainerId>mainMapContainer</mapContainerId>
              </GmlRendererWZ>
            </widgets>
          </FeatureCollection>
          <Transaction id="transactionTemplate" template="true">
            <method>post</method>
            <widgets>
              <ShowResponse id="transResponse"/>
            </widgets>
          </Transaction>
        </models>
        <widgets>
          <Widget id="featureTypes">
            <htmlTagId>workspace</htmlTagId>
            <outputNodeId>workspaceCanvas</outputNodeId>
            <stylesheet>../../lib/widget/SelectFeatureType.xsl</stylesheet>
            <toolId>wfsController</toolId>
          </Widget>
        </widgets>
        <tools>
          <WebServiceRequest id="wfsGetFeature">
            <targetModel>getFeatureTemplate</targetModel>
            <requestName>wfs:GetFeature</requestName>
            <maxFeatures>20</maxFeatures>
          </WebServiceRequest>
          <WebServiceRequest id="wfsDescribeFeature">
            <targetModel>featureTypeTemplate</targetModel>
            <requestName>wfs:DescribeFeatureType</requestName>
          </WebServiceRequest>
          <WebServiceRequest id="wfsTransaction">
            <targetModel>transactionTemplate</targetModel>
            <requestName>wfs:Transaction</requestName>
          </WebServiceRequest>
        </tools>
      </WfsCapabilities>
      <WmsCapabilities id="wmsCapTemplate">
        <!--defaultModelUrl>http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?version=1.1.1&amp;service=WMS&amp;request=GetCapabilities</defaultModelUrl-->
        <nodeSelectXpath>//Layer</nodeSelectXpath>
        <title>OGC Web Map Server (WMS)</title>
        <models>
          <!--GetFeatureInfo id="featureTypeTemplate" template="true">
            <widgets>
              <Widget id="attributeFilter">
                <stylesheet>../../lib/widget/FilterAttributes.xsl</stylesheet>
                <outputNodeId>filterForm</outputNodeId>
              </Widget>
            </widgets>
          </GetFeatureInfo-->
          <GetMap id="getMapTemplate" template="true">
            <widgets>
              <MapImage id="renderMap">
                <targetModel>mainMap</targetModel>
                <htmlTagId>mainMapPane</htmlTagId>
                <mapContainerId>mainMapContainer</mapContainerId>
              </MapImage>
            </widgets>
          </GetMap>
        </models>
        <widgets>
          <Widget id="layerList">
            <htmlTagId>workspace</htmlTagId>
            <outputNodeId>workspaceCanvas</outputNodeId>
            <stylesheet>../../lib/widget/SelectMapLayers.xsl</stylesheet>
          </Widget>
          <CopyNode id="copyNodeToContext">
            <targetModel>mainMap</targetModel>
          </CopyNode>
        </widgets>
        <tools>
          <WebServiceRequest id="wmsController">
            <targetModel>getMapTemplate</targetModel>
            <requestName>GetMap</requestName>
          </WebServiceRequest>
          <!--WebServiceRequest id="wmsController">
            <targetModel>getFeatureInfoTemplate</targetModel>
            <requestName>wms:GetFeatureInfo</requestName>
          </WebServiceRequest-->
        </tools>
      </WmsCapabilities>
      <Model id="wmsServers">
        <title>Web Map Servers</title>
        <widgets>
          <WebServiceForm id="wmsServerList">
            <htmlTagId>workspace</htmlTagId>
            <outputNodeId>workspaceCanvas</outputNodeId>
            <stylesheet>../../lib/widget/ServiceRegistryList.xsl</stylesheet>
            <targetModel2>wmsCapTemplate</targetModel2>
          </WebServiceForm>
        </widgets>
      </Model>
      <Model id="wfsServers">
        <title>Web Feature Servers</title>
        <widgets>
          <WebServiceForm id="wfsServerList">
            <htmlTagId>workspace</htmlTagId>
            <outputNodeId>workspaceCanvas</outputNodeId>
            <stylesheet>../../lib/widget/ServiceRegistryList.xsl</stylesheet>
            <targetModel2>wfsCapTemplate</targetModel2>
          </WebServiceForm>
        </widgets>
      </Model>
    </models>
    <widgets>
      <ModelUrlInput id="urlInput">
        <htmlTagId>workspace</htmlTagId>
        <outputNodeId>workspaceCanvas</outputNodeId>
        <targetModel>wmsCapTemplate</targetModel>
      </ModelUrlInput>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to zoom in</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to zoom out</tooltip>
        <tooltip xml:lang="fr">cliquer pour rée</tooltip>
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to pan</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
      </DragPan>
      <SetAoi id="setAoi">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
        <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to set the area of interest</tooltip>
      </SetAoi>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
        <tooltip xml:lang="en">reset the map to full extent</tooltip>
        <tooltip xml:lang="fr">redonner la carte ses dimensions complèts</tooltip>
      </Reset>
      <Save id="save">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/SaveDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to save this map</tooltip>
        <tooltip xml:lang="fr">cliquer pour sauvegarder</tooltip>
        <popupWindowName>modelXML</popupWindowName>
      </Save>
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>getFeatureTemplate</targetModel>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
      </EditPoint>
    </widgets>
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <skinDir>../../lib/skin/default</skinDir>
    <proxyUrl>../../proxy</proxyUrl>
    <serializeUrl>../../writeXml</serializeUrl>
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
    <head>
      <title>Mapbuilder Context Editor Prototype</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/button.css'>
      <link rel='StyleSheet' type='text/css' href='contextEditor.css'>
      <style type="text/css">
        #workspace {
          overflow: auto;
          position: relative;
          border: 0;
        }
      </style>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='contextEditor.xml';
        
        function mbOnload() {
          config.objects.mainMap.addListener("loadModel",initWorkspace,null);
          window.onresize = initWorkspace;
        }
        
        function initWorkspace() {
          var pageBody = document.getElementsByTagName("body")[0];
          var workDiv = document.getElementById("workspace");
          var footerDiv = document.getElementById("mbFooter");
          if (_SARISSA_IS_IE) {
            workDiv.style.height = pageBody.offsetHeight - workDiv.offsetTop - footerDiv.offsetHeight - 30;  //20 is a fudge factor
          } else {
            workDiv.style.height = window.innerHeight - workDiv.offsetTop - footerDiv.offsetHeight - 20;  //20 is a fudge factor
          }
        }
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad(mbOnload)">
      <table style="width:800">
        <tr>
          <td colspan="2">
            <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> Context Editor</h1>
          </td>
        </tr>
        <tr>
          <td valign="top" style="padding:8px; width:200">
            <div>
              <div id="locatorMap"/>
            </div>
              <a href="javascript:config.loadModel('myMapCollection','../data/context/demoCollection.xml')">
              Map collection</a><br/>
              <a href="javascript:config.loadModel('wmsServers','http://geodiscover.cgdi.ca/ceonetWeb/biz?request=searchForService&language=en&levelOfDetail=brief&serviceType=CgdiMapServices&numResultsPerPage=10&page=1')">
              Browse WMS servers</a><br/>
              <a href="javascript:config.loadModel('wfsServers','http://geodiscover.cgdi.ca/ceonetWeb/biz?request=searchForService&language=en&levelOfDetail=brief&serviceType=CgdiFeatureServices&numResultsPerPage=10&page=1')">
              Browse WFS servers</a><br/>
              <a href="javascript:config.paintWidget(config.objects.contextLegend)">
              Map layer control</a><br/>
              <a href="javascript:config.paintWidget(config.objects.owsCatSearchForm)">
              Search form</a><br/>
              <!--a href="javascript:config.saveModel(config)">
              Save config</a><br/-->
          </td>
          <td style="width:600">
            <table width="100%">
              <tr>
                <td>
                  <h2 id="mapTitle"></h2>
                </td>
              </tr>
              <tr>
                <td align="center">
                  <table>
                    <tr>
                      <td colspan="2">
                        <div id="mainMapPane"/>
                      </td>
                    </tr>
                    <tr>
                      <td align="left">
                        <div id="mainButtonBar"/>
                      </td>
                      <td align="right" id="cursorTrack" />
                    </tr>
                  </table>
                </td>
              </tr>
              <tr>
                <td align="left" id="tabBar">
                </td>
              </tr>
              <tr>
                <td align="left">
                  <div id="workspace"></div>
                </td>
              </tr>
            </table>
           </td>
        </tr>
  
        <tr>
          <td colspan="2" class="footer" id="mbFooter">
            <img src="../../lib/skin/default/images/Icon.gif" style="float:right"/>
            <a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$
          </td>
        </tr>
  
      </table>
      
  
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/owsCatSearchForm.xsl
  
  Index: owsCatSearchForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parses an listing of OGC services from the Discovery Portal registry
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  		xmlns:ogc="http://www.opengis.net/ogc"
  		xmlns:gml="http://www.opengis.net/gml"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelTitle"/>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="targetModelId"/>
    <xsl:param name="targetModel"/>
    <xsl:param name="lang">en</xsl:param>
    
    <xsl:param name="webServiceUrl">http://devgeo.cciw.ca/cgi-bin/mapserv/owscat</xsl:param>
    <xsl:param name="formName">owsCatSearch</xsl:param>
    <xsl:param name="searchConfigDoc" select="document('searchConfig.xml')"/>  
    <xsl:param name="selectSize" select="1"/>
    
    <!-- Text params for this widget -->
    <xsl:param name="north">North</xsl:param>
    <xsl:param name="south">South</xsl:param>
    <xsl:param name="east">East</xsl:param>
    <xsl:param name="west">West</xsl:param>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/">
      <div>
      <form name="{$formName}" id="{$formName}" method="get">
        <input type="hidden" name="version" value="1.0.0"/>
        <input type="hidden" name="service" value="WFS"/>
        <input type="hidden" name="request" value="GetFeature"/>
        <input type="hidden" name="typename" value="service_resources"/>
        <input type="hidden" name="outputFormat" value="GML3"/>
        
        <h3>Keywords</h3>
        <input type="text" name="keywords"/>
        <h3>Location</h3>
        <xsl:call-template name="locations">
          <xsl:with-param name="locationsDoc" select="$searchConfigDoc"/>
        </xsl:call-template>
        <xsl:call-template name="aoiBox"/>
        <h3>Service Type</h3>
        <select name="serviceType">
          <option></option>
          <option selected="true">WMS</option>
          <option>WFS</option>
        </select>
        <input class="button" type="reset"/>
        <input class="button" type="submit"/>
        
      </form>
      </div>
    </xsl:template>
  
    <xsl:template name="locations">
      <xsl:param name="locationsDoc"/>
      <DIV>
        <select name="locations" onchange="config.objects.{$widgetId}.setLocation(this.options[this.selectedIndex].value);" size="{$selectSize}">
          <xsl:apply-templates select="$locationsDoc/searchConfig[@entryType='productCollection']/locations/location"/>
        </select>
      </DIV>
    </xsl:template>
    
    <xsl:template match="location">
      <xsl:param name="indent"/>
      <xsl:variable name="bbox" select="translate(wens,' ',',')"/>
      <option value="{$bbox}"><xsl:value-of select="$indent"/><xsl:value-of select="title[@lang=$lang]"/></option>
      <xsl:apply-templates select="location">
        <xsl:with-param name="indent"><xsl:value-of select="$indent"/>&#160;&#160;</xsl:with-param>
      </xsl:apply-templates>
    </xsl:template>
    
    <xsl:template name="aoiBox">
      <p>
        <table>
          <tr>
            <td align="left">or enter</td>
            <td><xsl:value-of select="$north"/></td>
            <td><xsl:value-of select="$south"/></td>
            <td><xsl:value-of select="$east"/></td>
            <td><xsl:value-of select="$west"/></td>
          </tr>
          <tr>
            <td>
            </td>
            <td>
              <input name="northCoord" type="text" size="10" class="searchInput"/>
            </td>
            <td>
              <input name="southCoord" type="text" size="10" class="searchInput"/>
            </td>
            <td>
              <input name="eastCoord" type="text" size="10"  class="searchInput"/>
            </td>
            <td>
              <input name="westCoord" type="text" size="10" class="searchInput"/>
            </td>
          </tr>
        </table>
      </p>
    </xsl:template>
    
    <xsl:template name="ntsInput">
      <p>or enter NTS mapsheet index
        <input name="ntsIndex" type="text" size="6" class="searchInput"/>
      </p>
    </xsl:template>
   
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/searchConfig.xml
  
  Index: searchConfig.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
  <!--==========================================================================
  Filename      : HMI_Locations.xsl
  Project       : CEONet
  Module        : stylesheet
  Document Type : XML
  Purpose       : Locations and corresponding wens.
  
  (c) COPYRIGHT MacDonald Dettwiler, 2003 All Rights Reserved
  
  Author        Date          Issue       Changes
  C.Therriault  09-Mar-2002   207         Initial Release
  M.Robson      21-Feb-2003   844         Put 'order' attributes for the provinces
  M.Adair       30-May-2003   250         adjusted wens for Nfld; removed nfld query 
                                          fragment from new Bruinswick entry
  M.Adair       19-Sep-2003   1018        adjusted wens for NWT to -102
  J.Barney      20-Jan-2004   1114        adjusted wens for NovaScotia to -59.5
  
  ===========================================================================-->
  <searchConfig entryType="productCollection">
     <locations>
        <location id="world">
           <title lang="en">World</title>
           <title lang="fr">Monde</title>
           <wens>-180 180 90 -90</wens>
           <queryFragment>BBOX-INTERSECT( -180, 180, 90, -90 )</queryFragment>
           <location id="africa">
              <title lang="en">Africa</title>
              <title lang="fr">Afrique</title>
              <wens>-18 52 38 -35</wens>
              <queryFragment>
  	      OR
                  (placekey:africa
  	         placekey:afrique
                   title:africa
                   title:afrique)
              </queryFragment>
           </location>
           <location id="asia">
              <title lang="en">Asia</title>
              <title lang="fr">Asie</title>
              <wens>23 179 82 -13</wens>
              <queryFragment/>
           </location>
           <location id="australia">
              <title lang="en">Australia</title>
              <title lang="fr">Australie</title>
              <wens>112 154 -10 -45</wens>
              <queryFragment/>
           </location>
           <location id="europe">
              <title lang="en">Europe</title>
              <title lang="fr">Europe</title>
              <wens>-11 32 72 35</wens>
              <queryFragment/>
           </location>
           <location id="northAmerica">
              <title lang="en">North America</title>
              <title lang="fr">Amérique du Nord</title>
              <wens>-160 54 75 29</wens>
              <queryFragment>
                OR
                  ( placekey:northAmerica 
                    title:PHRASE( north america )
                    title:PHRASE( am*rique du nord )
                  )
              </queryFragment>
              <location id="canada">
                 <title lang="en">Canada</title>
                 <title lang="fr">Canada</title>
                 <wens>-141 -43 84 41.5</wens>
                 <queryFragment>
                    OR
                      ( placekey:northAmerica/canada 
                        title:canada
                      )
                 </queryFragment>
                 <location id="alberta">
                    <title lang="en" order="1">Alberta</title>
                    <title lang="fr" order="1">Alberta</title>
                    <wens>-120 -110 60 49</wens>
                    <queryFragment/>
                 </location>
                 <location id="britishColumbia">
                    <title lang="en" order="2">British Columbia</title>
                    <title lang="fr" order="2">Colombie-Britannique</title>
                    <wens>-139 -114 60 48</wens>
                    <queryFragment/>
                 </location>
                 <location id="manitoba">
                    <title lang="en" order="3">Manitoba</title>
                    <title lang="fr" order="4">Manitoba</title>
                    <wens>-102 -89 60 49</wens>
                    <queryFragment/>
                 </location>
                 <location id="newBrunswick">
                    <title lang="en" order="4">New Brunswick</title>
                    <title lang="fr" order="5">Nouveau-Brunswick</title>
                    <wens>-69 -64 48 45</wens>
                    <queryFragment/>
                 </location>
                 <location id="newfoundlandAndLabrador">
                    <title lang="en" order="5">Newfoundland and Labrador</title>
                    <title lang="fr" order="b">Terre-Neuve-et-Labrador</title>
                    <wens>-67.7 -52 60.3 46.6</wens>
                    <queryFragment>
                      OR
                        ( placekey:northAmerica/canada/newfoundland
                          placekey:northAmerica/canada/labrador 
                          title:newfoundland
  		        title:labrador
  		        title:PHRASE( newfoundland and labrador )
                          title:PHRASE( terre-neuve et labrador )
                        )
                    </queryFragment>
                 </location>
                 <location id="northwestTerritories">
                    <title lang="en" order="6">Northwest Territories</title>
                    <title lang="fr" order="d">Territoires du Nord-Ouest</title>
                    <wens>-136.5 -102 79 60</wens>
                    <queryFragment/>
                 </location>
                 <location id="novaScotia">
                    <title lang="en" order="7">Nova Scotia</title>
                    <title lang="fr" order="6">Nouvelle-Écosse</title>
                    <wens>-66.3 -59.5 47 43</wens>
                    <queryFragment>
                      OR
                        ( placekey:northAmerica/canada/nova_scotia 
                          title:nova_scotia
  		        title:PHRASE( nova scotia )
                          title:PHRASE( nouvelle-*cosse )
                        )
                    </queryFragment>
                 </location>
                 <location id="nunavut">
                    <title lang="en" order="8">Nunavut</title>
                    <title lang="fr" order="7">Nunavut</title>
                    <wens>-121 -61 84 52</wens>
                    <queryFragment/>
                 </location>
                 <location id="ontario">
                    <title lang="en" order="9">Ontario</title>
                    <title lang="fr" order="8">Ontario</title>
                    <wens>-95 -74 57 41.5</wens>
                    <queryFragment>
                      OR
                        ( placekey:northAmerica/canada/ontario 
                          title:ontario
                        )
                    </queryFragment>
                 </location>
                 <location id="princeEdwardIsland">
                    <title lang="en" order="a">Prince Edward Island</title>
                    <title lang="fr" order="3">Île-du-Prince-Édouard</title>
                    <wens>-64.5 -62 47 45.9</wens>
                    <queryFragment/>
                 </location>
                 <location id="quebec">
                    <title lang="en" order="b">Quebec</title>
                    <title lang="fr" order="9">Québec</title>
                    <wens>-79.5 -57 63 45</wens>
                    <queryFragment/>
                 </location>
                 <location id="saskatchewan">
                    <title lang="en" order="c">Saskatchewan</title>
                    <title lang="fr" order="a">Saskatchewan</title>
                    <wens>-110 -101.5 60 49</wens>
                    <queryFragment/>
                 </location>
                 <location id="yukonTerritory">
                    <title lang="en" order="d">Yukon Territory</title>
                    <title lang="fr" order="c">Territoire du Yukon</title>
                    <wens>-141 -123.8 69.6 60</wens>
                    <queryFragment/>
                 </location>
              </location>
              <location id="unitedStatesOfAmerica">
                 <title lang="en" >United States of America</title>
                 <title lang="fr" >États-Unis d'Amérique</title>
                 <wens>-130 -64 50 24</wens>
                 <queryFragment/>
              </location>
              <location id="southAmerica">
                 <title lang="en" >South America</title>
                 <title lang="fr" >Amérique du Sud</title>
                 <wens>-94 -34 25 -57</wens>
                 <queryFragment/>
              </location>
           </location>
        </location>
     </locations>
     <subjects>
        <subject id="allSubjects">
           <title lang="en">All subjects</title>
           <title lang="fr">Tous les sujets</title>
           <queryFragment/>
        </subject>
        <subject id="atmosphereWeather">
           <title lang="en">Atmosphere / Weather</title>
           <title lang="fr">Atmosphère et conditions météorologiques</title>
           <queryFragment/>
           <subject id="currentWeather">
              <title lang="en">Current weather and forecasts</title>
              <title lang="fr">Conditions et prévisions météorologiques</title>
              <queryFragment/>
           </subject>
           <subject id="generalClimat">
              <title lang="en">General climate data</title>
              <title lang="fr">Données climatiques générales</title>
              <queryFragment/>
           </subject>
           <subject id="weatherDisasters">
              <title lang="en">Weather disasters</title>
              <title lang="fr">Désastres climatiques</title>
              <queryFragment/>
           </subject>
           <subject id="winds">
              <title lang="en">Winds</title>
              <title lang="fr">Vents</title>
              <queryFragment/>
           </subject>
        </subject>
        <subject id="geology">
           <title lang="en">Geology</title>
           <title lang="fr">Géologie</title>
           <queryFragment/>
           <subject id="earthquakes">
              <title lang="en">Earthquakes</title>
              <title lang="fr">Séismes</title>
              <queryFragment/>
           </subject>
        </subject>
        <subject id="landSurface">
           <title lang="en">Land Surface</title>
           <title lang="fr">Surface de la Terre</title>
           <queryFragment>
          OR
            ( themekey:landUse
              themekey:PHRASE( land use )
              themekey:forest*
              themekey:agric*
              themekey:vegetation
              themekey:topography
              themekey:soil
              title:elevation
              themekey:ice
            )
        </queryFragment>
           <subject id="agriculture">
              <title lang="en">Agriculture</title>
              <title lang="fr">Agriculture</title>
              <queryFragment/>
           </subject>
           <subject id="forestry">
              <title lang="en">Forestry</title>
              <title lang="fr">Foresterie</title>
              <queryFragment/>
           </subject>
           <subject id="landUse">
              <title lang="en">Land use</title>
              <title lang="fr">Utilisation du sol</title>
              <queryFragment/>
           </subject>
           <subject id="snow">
              <title lang="en">Snow</title>
              <title lang="fr">Neige</title>
              <queryFragment/>
           </subject>
           <subject id="soil">
              <title lang="en">Soil</title>
              <title lang="fr">Sol</title>
              <queryFragment/>
           </subject>
           <subject id="topography">
              <title lang="en">Topography</title>
              <title lang="fr">Topographie</title>
              <queryFragment/>
           </subject>
           <subject id="vegetation">
              <title lang="en">Vegetation</title>
              <title lang="fr">Végétation</title>
              <queryFragment/>
           </subject>
        </subject>
        <subject id="socialHumanTopics">
           <title lang="en">Social and human topics</title>
           <title lang="fr">Aspects sociaux et humains</title>
           <queryFragment/>
           <subject id="educationalResources">
              <title lang="en">Educational Resources</title>
              <title lang="fr">Ressources éducatives</title>
              <queryFragment/>
           </subject>
           <subject id="humanEnvironmentalEffects">
              <title lang="en">Human environmental effects</title>
              <title lang="fr">Incidences anthropiques sur l'environnement</title>
              <queryFragment/>
           </subject>
        </subject>
        <subject id="water">
           <title lang="en">Water</title>
           <title lang="fr">Eau</title>
           <queryFragment/>
           <subject id="freshwater">
              <title lang="en">Freshwater</title>
              <title lang="fr">Eau douce</title>
              <queryFragment/>
           </subject>
           <subject id="lakeIce">
              <title lang="en">Lake ice</title>
              <title lang="fr">Glaces de lacs</title>
              <queryFragment/>
           </subject>
           <subject id="oceans">
              <title lang="en">Oceans</title>
              <title lang="fr">Océans</title>
              <queryFragment/>
           </subject>
           <subject id="seaIce">
              <title lang="en">Sea ice</title>
              <title lang="fr">Glaces de mer</title>
              <queryFragment/>
           </subject>
        </subject>
     </subjects>
     <productTypes>
        <productType id="allProductTypes">
           <title lang="en">All product types</title>
           <title lang="fr">Tous les types de produits</title>
           <queryFragment/>
        </productType>
        <productType id="airborneProducts">
           <title lang="en">Airborne products</title>
           <title lang="fr">Produits aériens</title>
           <queryFragment/>
           <productType id="airborneImagery">
              <title lang="en">Airborne imagery</title>
              <title lang="fr">Imagerie aérienne</title>
              <queryFragment/>
           </productType>
           <productType id="airPhotos">
              <title lang="en">Air photos</title>
              <title lang="fr">Photos aériennes</title>
              <queryFragment/>
           </productType>
        </productType>
        <productType id="mapsCharts">
           <title lang="en">Maps and Charts</title>
           <title lang="fr">Cartes terrestres et marines</title>
           <queryFragment/>
           <productType id="aeronautical">
              <title lang="en">Aeronautical</title>
              <title lang="fr">Aéronautique</title>
              <queryFragment/>
           </productType>
           <productType id="digitalElevationModel">
              <title lang="en">Digital elevation model</title>
              <title lang="fr">Modèle altimétrique numérique</title>
              <queryFragment/>
           </productType>
           <productType id="geopolitical">
              <title lang="en">Geopolitical</title>
              <title lang="fr">Géopolitique</title>
              <queryFragment/>
           </productType>
           <productType id="nautical">
              <title lang="en">Nautical</title>
              <title lang="fr">Nautique</title>
              <queryFragment/>
           </productType>
           <productType id="thematic">
              <title lang="en">Thematical</title>
              <title lang="fr">Thématique</title>
              <queryFragment/>
           </productType>
           <productType id="topographic">
              <title lang="en">Topographic</title>
              <title lang="fr">Topographique</title>
              <queryFragment/>
           </productType>
        </productType>
        <productType id="satelliteProducts">
           <title lang="en">Satellite products</title>
           <title lang="fr">Produits satellitaires</title>
           <queryFragment/>
           <productType id="satelliteImagery">
              <title lang="en">Satellite imagery</title>
              <title lang="fr">Images-satellites</title>
              <queryFragment/>
           </productType>
        </productType>
        <productType id="onsiteMeasurements">
           <title lang="en">On-site measurements</title>
           <title lang="fr">Mesures sur place</title>
           <queryFragment/>
        </productType>
        <productType id="studies">
           <title lang="en">Studies</title>
           <title lang="fr">Études</title>
           <queryFragment/>
        </productType>
     </productTypes>
  </searchConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/contextEditor/tabList.css
  
  Index: tabList.css
  ===================================================================
  ul.tablist
  
  {
  
     padding: 3px 0;
  
     width: 540;
  
     margin-top: 10px;
  
  }
  
  
  
  ul.tablist li
  
  {
  
     list-style: none;
  
     display: inline;
  
     margin: 0;
  
  }
  
  
  
  ul.tablist li a
  
  {
  
     text-decoration: none;
  
     padding: 3px 0.5em;
  
     margin-right: 3px;
  
     border: 1px solid #778;
  
     border-bottom: none;
  
     background: #6699CC;
  
     color: #FFF;
  
     font-weight: bold;
  
  }
  
  
  
  ul.tablist li a:hover/*, li a:focus*/
  
  {  
  
     background: #003466;
  
  }
  
  
  
  ul.tablist li a.current
  
  {
  
     background: #003466;
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/DM_Canada.xml
  
  Index: DM_Canada.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_l7o" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="400" height="200"/>
      <BoundingBox SRS="EPSG:4326" minx="-142" miny="40" maxx="-52" maxy="85"/>
      <!--BoundingBox SRS="EPSG:42304" minx="-2600000" miny="-1000000" maxx="3100000" maxy="3800000"/-->
      <Title>Canada Map</Title>
      <KeywordList>
        <Keyword>Canada</Keyword>
      </KeywordList>
      <Abstract>A UMN MapServer installation at DM Solutions.</Abstract>
      <ContactInformation>
        <ContactPersonPrimary> 
          <ContactPerson>Michael Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
           <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+01 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+01 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
    <Layer queryable="0" hidden="0"><Server service="wms" version="1.1.0" title="GMap WMS Demo Server">
    <OnlineResource xlink:type="simple" xlink:href="http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?"/></Server>
    <Name>bathymetry</Name><Title>Elevation/Bathymetry</Title><SRS>EPSG:4326</SRS></Layer>
    <Layer queryable="0" hidden="0"><Server service="wms" version="1.1.0" title="GMap WMS Demo Server">
    <OnlineResource xlink:type="simple" xlink:href="http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?"/></Server>
    <Name>land_fn</Name><Title>Foreign Lands</Title><SRS>EPSG:4326</SRS></Layer>
    <Layer queryable="0" hidden="0"><Server service="wms" version="1.1.0" title="GMap WMS Demo Server">
    <OnlineResource xlink:type="simple" xlink:href="http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?"/></Server>
    <Name>prov_bound</Name><Title>Province</Title><SRS>EPSG:4326</SRS></Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/SLDParamExample.xml
  
  Index: SLDParamExample.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <ViewContext version="1.0.0"
               id="owsview_generated_context"
               xmlns="http://www.opengis.net/context"
               xmlns:xlink="http://www.w3.org/1999/xlink"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
   <General>
    <Window width="500" height="300" />
    <BoundingBox SRS="EPSG:4326" minx="-160.212693" miny="20.096000" maxx="-53.787307" maxy="83.904000" />
    <Title>owsview Viewer Client Generator automatically generated context</Title>
    <KeywordList>
     <Keyword>owsview</Keyword>
     <Keyword>CGDI</Keyword>
     <Keyword>GeoConnections</Keyword>
     <Keyword>NRCan</Keyword>
     <Keyword>OGC</Keyword>
    </KeywordList>
    <Abstract>This is a generated context, automatically generated by owsview Viewer Client Generator (http://cgdi-dev.geoconnections.org/prototypes/owsview) on Wed Nov 10 09:34:23 2004 from IP 199.212.18.131</Abstract> 
    <LogoURL width="150" height="75" format="image/gif">
     <OnlineResource xlink:type="simple" xlink:href="http://cgdi-dev.geoconnections.org/prototypes/owsview/graphics/cgdi.png"/>
    </LogoURL>
    <DescriptionURL format="text/html">
     <OnlineResource xlink:type="simple" xlink:href="http://cgdi.gc.ca/"/>
    </DescriptionURL>
    <ContactInformation>
     <ContactPersonPrimary>
      <ContactPerson>Tom Kralidis</ContactPerson>
      <ContactOrganization>Environment Canada</ContactOrganization>
     </ContactPersonPrimary>
     <ContactPosition>Systems Scientist</ContactPosition>
      <ContactAddress>
      <AddressType>postal</AddressType>
      <Address>867 Lakeshore Road</Address>
      <City>Burlington</City>
      <StateOrProvince>Ontario</StateOrProvince>
      <PostCode>L7R 4A6</PostCode>
      <Country>Canada</Country>
     </ContactAddress>
     <ContactVoiceTelephone>+01-905-336-4409</ContactVoiceTelephone>
     <ContactFacsimileTelephone>+01-905-336-4499</ContactFacsimileTelephone>
     <ContactElectronicMailAddress>tom.kralidis at ec.gc.ca</ContactElectronicMailAddress>
    </ContactInformation>
   </General> 
   <LayerList>
    <Layer queryable="0" hidden="0">
     <Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
      <OnlineResource xlink:type="simple" xlink:href="http://mapserv2.esrin.esa.it/ionicweb/map/GAEL_WORLD_MARCH"/>
     </Server>
     <Name>GAEL_WORLD_MARCH</Name>
     <Title>Mosaic of MERIS_RR products</Title>
     <SRS>EPSG:4326</SRS>
     <FormatList>
      <Format current="1">image/png</Format>
     </FormatList>
     <StyleList>
     <Style current="1">
      <Name>default</Name>
      <Title>default</Title>
     </Style>
     </StyleList>
    </Layer>
    <Layer queryable="1" hidden="0">
     <Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
      <OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi"/>
     </Server>
     <Name>COASTL_BND_1M:Foundation</Name>
     <Title>Coastlines</Title>
     <SRS>EPSG:4326</SRS>
     <FormatList>
      <Format current="1">image/gif</Format>
     </FormatList>
     <StyleList>
     <Style current="1">
      <Name>default</Name>
      <Title>default</Title>
      <LegendURL>
       <OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi?VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=COASTL_BND_1M:Foundation&amp;FORMAT=image/gif"/>
      </LegendURL>    
     </Style>
     </StyleList>
    </Layer>
    <Layer queryable="1" hidden="0">
     <Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
      <OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi"/>
     </Server>
     <Name>POLBNDL_BND_1M:Foundation</Name>
     <Title>Political Boundaries</Title>
     <SRS>EPSG:4326</SRS>
     <FormatList>
      <Format current="1">image/gif</Format>
     </FormatList>
     <StyleList>
     <Style current="1">
      <SLD>
       <OnlineResource xlink:type="simple" xlink:href="http://cgdi-dev.geoconnections.org/prototypes/owsview/cache/110009719722986sld_1_0_0.xml" />
      </SLD>
      <LegendURL>
       <OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi?VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=POLBNDL_BND_1M:Foundation&amp;FORMAT=image/gif"/>
      </LegendURL>    
     </Style>
     </StyleList>
    </Layer>
    <Layer queryable="1" hidden="0">
     <Server service="OGC:WMS" version="1.1.0" title="OGC:WMS">
      <OnlineResource xlink:type="simple" xlink:href="http://geo.compusult.net/scripts/mapman.dll?Name=weather"/>
     </Server>
     <Name>WEATHER</Name>
     <Title>North American Hourly METAR Weather Reports</Title>
     <SRS>EPSG:4326</SRS>
     <FormatList>
      <Format current="1">image/gif</Format>
     </FormatList>
     <StyleList>
     <Style current="1">
      <Name>DEFAULT</Name>
      <Title>DEFAULT</Title>
      <LegendURL>
       <OnlineResource xlink:type="simple" xlink:href="http://geo.compusult.net/legends/weather.gif"/>
      </LegendURL>    
     </Style>
     </StyleList>
    </Layer>
    <Layer queryable="1" hidden="0">
     <Server service="OGC:WMS" version="1.1.0" title="OGC:WMS">
      <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/mapserver/request.asp"/>
     </Server>
     <Name>Cities</Name>
     <Title>Cities</Title>
     <SRS>EPSG:4326</SRS>
     <FormatList>
      <Format current="1">image/gif</Format>
     </FormatList>
     <StyleList>
     <Style current="1">
      <Name>default</Name>
      <Title>default</Title>
     </Style>
     </StyleList>
    </Layer>
   </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/atlasWorld.xml
  
  Index: atlasWorld.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="400" height="200"/>
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <Title xml:lang="en">World Base Map</Title>
      <Title xml:lang="fr">Carte mondiale de base</Title>
      <KeywordList>
        <Keyword>world</Keyword>
        <Keyword>atlas</Keyword>
      </KeywordList>
      <Abstract xml:lang="en">Atlas of Canada, World Base Map. Small scale vector based map served by Mapserver WMS.</Abstract>
      <Abstract xml:lang="fr">L`atlas du Canada, Carte mondiale de base. Une carte de petite échelle servis par Mapserver WMS.</Abstract>
      <LogoURL width="34" height="35" format="image/jpg">
        <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/site/english/atlas_identifier.jpg"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Michael Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+1 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+1 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>land</Name>
        <Title>land area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>lake_fill</Name>
        <Title>lakes</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>lake_outline</Name>
        <Title>lake outlines</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>rivers</Name>
        <Title>rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>boundaries</Name>
        <Title>boundaries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="1">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>capital</Name>
        <Title>capitals</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>country_names</Name>
        <Title>country names</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="1">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>capital_names</Name>
        <Title>capital names</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/boston.xml
  
  Index: boston.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <ViewContext xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wmc="http://www.opengis.net/context" version="1.0.0" id="eos_data_gateways" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="400" height="200"/>
      <Title>Shape files on Boston</Title>
      <BoundingBox SRS="EPSG:4326" minx="-71.186" miny="42.194" maxx="-70.953" maxy="42.432"/>
    </General>
    <LayerList>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Shape files on Boston">
          <OnlineResource type="simple" xlink:href="http://demo.ionicsoft.com/ionicweb/wfs/BOSTON_SHAPE?"/>
        </Server>
        <Name>highways</Name>
        <Title>highways</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Shape files on Boston">
          <OnlineResource type="simple" xlink:href="http://demo.ionicsoft.com/ionicweb/wfs/BOSTON_SHAPE?"/>
        </Server>
        <Name>hydro</Name>
        <Title>hydro</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Shape files on Boston">
          <OnlineResource type="simple" xlink:href="http://demo.ionicsoft.com/ionicweb/wfs/BOSTON_SHAPE?"/>
        </Server>
        <Name>land_use</Name>
        <Title>land_use</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Shape files on Boston">
          <OnlineResource type="simple" xlink:href="http://demo.ionicsoft.com/ionicweb/wfs/BOSTON_SHAPE?"/>
        </Server>
        <Name>pests_treebugs</Name>
        <Title>pests_treebugs</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Shape files on Boston">
          <OnlineResource type="simple" xlink:href="http://demo.ionicsoft.com/ionicweb/wfs/BOSTON_SHAPE?"/>
        </Server>
        <Name>place_names</Name>
        <Title>place_names</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Shape files on Boston">
          <OnlineResource type="simple" xlink:href="http://demo.ionicsoft.com/ionicweb/wfs/BOSTON_SHAPE?"/>
        </Server>
        <Name>protectedareas</Name>
        <Title>protectedareas</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Shape files on Boston">
          <OnlineResource type="simple" xlink:href="http://demo.ionicsoft.com/ionicweb/wfs/BOSTON_SHAPE?"/>
        </Server>
        <Name>roads</Name>
        <Title>roads</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/cded.xml
  
  Index: cded.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_l7o" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="400" height="337"/>
      <BoundingBox SRS="EPSG:42304" minx="-2600000" miny="-1000000" maxx="3100000" maxy="3800000"/>
      <!--		<BoundingBox SRS="EPSG:42304" minx="-3546709.473205" miny="-869773.355764" maxx="4444893.074820" maxy="3923457.184829" />-->
      <Title>Canadian Digital Elevation Data (GeoBase)</Title>
      <KeywordList>
        <Keyword>Atlas</Keyword>
        <Keyword>Canada</Keyword>
        <Keyword>CITS</Keyword>
        <Keyword>CDED</Keyword>
        <Keyword>DNEC</Keyword>
        <Keyword>elevation</Keyword>
        <Keyword>geobase</Keyword>
      </KeywordList>
      <Abstract>The &lt;b&gt;Canada Digital Elevation Data&lt;/b&gt; (CDED) consist of an ordered array of ground elevations at regularly spaced intervals. These CDED are derived from the National Topographic Data Base (NTDB) digital files at the 1:50 000 and 1:250 000 scales, according to the National Topographic System (NTS).</Abstract>
      <LogoURL width="273" height="22" format="image/gif">
        <OnlineResource xlink:type="simple" xlink:href="http://www.nrcan-rncan.gc.ca/inter/images/nrcan.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/search?action=fullMetadata&amp;entryId=5156&amp;entryType=productCollection"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Tom Kralidis</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+01 613 947 1828</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+01 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>tom.kralidis at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
    
    
    
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Centre d'information topographique, RNCan / Centre for Topographic Information, NRCan">
          <OnlineResource xlink:type="simple" xlink:href="http://wms.cits.rncan.gc.ca/wms-bin/wms.cgi?"/>
        </Server>
              <Name>DNEC_250K:ELEVATION/ELEVATION</Name>
              <Title>Canadian Digital elevation data (CDED) 1:250k</Title>
          <Abstract>Les &lt;b&gt;données numériques d'élévation du Canada&lt;/b&gt; (DNEC) sont constituées de quadrillages d'élévation de terrain à intervalles réguliers. Ces DNEC sont dérivées des fichiers numériques de la Base nationale de données topographiques (BNDT) aux échelles de 1/50 000 et de 1/250 000, selon le Système national de référence cartographique (SNRC).&lt;br&gt;&lt;br&gt;The &lt;b&gt;Canada Digital Elevation Data&lt;/b&gt; (CDED) consist of an ordered array of ground elevations at regularly spaced intervals. These CDED are derived from the National Topographic Data Base (NTDB) digital files at the 1:50 000 and 1:250 000 scales, according to the National Topographic System (NTS).</Abstract>
        <DataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geobase.ca/"/>
        </DataURL>
        <MetadataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/search?action=fullMetadata&amp;entryType=productCollection&amp;entryId=5156&amp;entryLang=en"/>
        </MetadataURL>
        <SRS>EPSG:42304</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
          <Format>image/gif</Format>
          <Format>image/tiff</Format>
          <Format>image/jpeg</Format>
          <Format>image/ppm</Format>
          <Format>application/x-cubestor-wkb</Format>
          <Format>application/x-cubestor-gml.1</Format>
          <Format>application/x-cubestor-gml.2</Format>
        </FormatList>
        <StyleList>
              <Style current="1">
                <Name>Dnec_CITS</Name>
                <Title>Dnec_CITS</Title>
                <LegendURL format="image/gif">
                  <OnlineResource xlink:type="simple" xlink:href="http://wms.cits.rncan.gc.ca/wms-bin/wms.cgi?SERVICE=WMS&amp;VERSION=1.1.3&amp;REQUEST=GetLegendGraphic&amp;LAYER=DNEC_250K%3AELEVATION%2FELEVATION&amp;STYLE=Dnec_CITS&amp;FORMAT=image%2Fgif"/>
                </LegendURL>
              </Style>
        </StyleList>
      </Layer>
      <Layer queryable="0" hidden="1">
        <Server service="OGC:WMS" version="1.1.1" title="Centre d'information topographique, RNCan / Centre for Topographic Information, NRCan">
          <OnlineResource xlink:type="simple" xlink:href="http://wms.cits.rncan.gc.ca/wms-bin/wms.cgi?"/>
        </Server>
              <Name>DNEC_50K:ELEVATION/ELEVATION</Name>
              <Title>Canadian Digital elevation data (CDED) 1:50k</Title>
          <Abstract>Les &lt;b&gt;données numériques d'élévation du Canada&lt;/b&gt; (DNEC) sont constituées de quadrillages d'élévation de terrain à intervalles réguliers. Ces DNEC sont dérivées des fichiers numériques de la Base nationale de données topographiques (BNDT) aux échelles de 1/50 000 et de 1/250 000, selon le Système national de référence cartographique (SNRC).&lt;br&gt;&lt;br&gt;The &lt;b&gt;Canada Digital Elevation Data&lt;/b&gt; (CDED) consist of an ordered array of ground elevations at regularly spaced intervals. These CDED are derived from the National Topographic Data Base (NTDB) digital files at the 1:50 000 and 1:250 000 scales, according to the National Topographic System (NTS).</Abstract>
        <DataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geobase.ca/"/>
        </DataURL>
        <MetadataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/search?action=fullMetadata&amp;entryType=productCollection&amp;entryId=5156&amp;entryLang=en"/>
        </MetadataURL>
        <SRS>EPSG:42304</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
          <Format>image/gif</Format>
          <Format>image/tiff</Format>
          <Format>image/jpeg</Format>
          <Format>image/ppm</Format>
          <Format>application/x-cubestor-wkb</Format>
          <Format>application/x-cubestor-gml.1</Format>
          <Format>application/x-cubestor-gml.2</Format>
        </FormatList>
        <StyleList>
              <Style current="1">
                <Name>Dnec_CITS</Name>
                <Title>Dnec_CITS</Title>
                <LegendURL format="image/gif">
                  <OnlineResource xlink:type="simple" xlink:href="http://wms.cits.rncan.gc.ca/wms-bin/wms.cgi?SERVICE=WMS&amp;VERSION=1.1.3&amp;REQUEST=GetLegendGraphic&amp;LAYER=DNEC_50K%3AELEVATION%2FELEVATION&amp;STYLE=Dnec_CITS&amp;FORMAT=image%2Fgif"/>
                </LegendURL>
              </Style>
        </StyleList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
        </Server>
        <Name>drain_15m</Name>
        <Title>Drainage (1:15 000 000)</Title>
        <Abstract>Coastline, rivers and lake shorelines intended for display at a scale of 1:60 000 000.</Abstract>
        <DataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
        </DataURL>
        <MetadataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
        </MetadataURL>
        <SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
          <Format>image/gif</Format>
          <Format>image/jpeg</Format>
          <Format>image/wbmp</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
      </Layer>
      <Layer queryable="0" hidden="1">
        <Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
        </Server>
        <Name>roads_15m</Name>
        <Title>Road network (1:15 000 000)</Title>
        <Abstract>Road network and ferry routes intended for display at the scale of 1:15 000 000.</Abstract>
        <DataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
        </DataURL>
        <MetadataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
        </MetadataURL>
        <SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
          <Format>image/gif</Format>
          <Format>image/jpeg</Format>
          <Format>image/wbmp</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
        </Server>
        <Name>can_7.5m</Name>
        <Title>Landmass outline (1:7 500 000)</Title>
        <Abstract>The outline of the landmass of Canada</Abstract>
        <DataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
        </DataURL>
        <MetadataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
        </MetadataURL>
        <SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
          <Format>image/gif</Format>
          <Format>image/jpeg</Format>
          <Format>image/wbmp</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
        </Server>
        <Name>nat_bounds</Name>
        <Title>Provincial and Territorial Boundaries</Title>
        <Abstract>Provincial and territorial boundaries</Abstract>
        <DataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
        </DataURL>
        <MetadataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
        </MetadataURL>
        <SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
          <Format>image/gif</Format>
          <Format>image/jpeg</Format>
          <Format>image/wbmp</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Canada Centre for Remote Sensing Web Map Service">
          <OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi"/>
        </Server>
        <Name>POPPLACE_PT:CEOWARE2</Name>
        <Title>Populated Places 1M</Title>
        <Abstract>Atlas of Canada National Frameworks data are standardized national coverages of commonly used geospatial datasets at the 1:1 000 000 scale. A variety of framework layers (e.g. hydrology, roads, railways, populated places) have been integrated so that their relative positions are correct. Hydrology (which includes coastline) is the base layer to which all others are fitted. In addition, the Atlas of Canada National Frameworks collection forms a base to which an increasing number of national-scale thematic frameworks from other Federal Government agencies are integrated (e.g. ecological regions, census subdivisions). National Scale Frameworks Populated Places, Canada is a selection of named populated places suitable for use at a scale of 1:1 000 000. The points have been fitted to other 1:1 000 000 National Scale Frameworks layers. Therefore, points represent the approximate locations of places relative to these other layers. A subset of data from the Canadian
  Geographical Names Data Base (CGNDB) were used. The CGNDB is maintained by the Names Section of the Centre for Topographic Information (Government of Canada, Natural Resources Canada). The selection of features was based on population size, historical significance and noteworthiness. Cartographic considerations were also taken into account.</Abstract>
        <DataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/download/frameworkdata/popplace/"/>
        </DataURL>
        <MetadataURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=13778&amp;entryType=productCollection&amp;keymap=outlineCanada"/>
        </MetadataURL>
        <SRS>EPSG:4326 AUTO:42001 AUTO:42002 AUTO:42003 AUTO:42004 EPSG:4267 EPSG:4269 EPSG:26703 EPSG:26704 EPSG:26705 EPSG:26706 EPSG:26707 EPSG:26708 EPSG:26709 EPSG:26710 EPSG:26711 EPSG:26712 EPSG:26713 EPSG:26714 EPSG:26715 EPSG:26716 EPSG:26717 EPSG:26718 EPSG:26719 EPSG:26720 EPSG:26721 EPSG:26722 EPSG:26903 EPSG:26904 EPSG:26905 EPSG:26906 EPSG:26907 EPSG:26908 EPSG:26909 EPSG:26910 EPSG:26911 EPSG:26912 EPSG:26913 EPSG:26914 EPSG:26915 EPSG:26916 EPSG:26917 EPSG:26918 EPSG:26919 EPSG:26920 EPSG:26921 EPSG:26922 EPSG:26923 EPSG:26930 EPSG:26986 EPSG:26987 EPSG:27582 EPSG:27700 EPSG:32118 EPSG:32128 EPSG:32129 EPSG:32601 EPSG:32602 EPSG:32603 EPSG:32604 EPSG:32605 EPSG:32606 EPSG:32607 EPSG:32608 EPSG:32609 EPSG:32610 EPSG:32611 EPSG:32612 EPSG:32613 EPSG:32614 EPSG:32615 EPSG:32616 EPSG:32617 EPSG:32618 EPSG:32619 EPSG:32620 EPSG:32621 EPSG:32622 EPSG:32623 EPSG:32624 EPSG:32625 EPSG:32626 EPSG:32627 EPSG:32628 EPSG:32629 EPSG:32630 EPSG:32631 EPSG:32632 EPSG:32633 E
 PSG:32634 EPSG:32635 EPSG:32636 EPSG:32637 EPSG:32638 EPSG:32639 EPSG:32640 EPSG:32641 EPSG:32642 EPSG:32643 EPSG:32644 EPSG:32645 EPSG:32646 EPSG:32647 EPSG:32648 EPSG:32649 EPSG:32650 EPSG:32651 EPSG:32652 EPSG:32653 EPSG:32654 EPSG:32655 EPSG:32656 EPSG:32657 EPSG:32658 EPSG:32659 EPSG:32660 EPSG:32701 EPSG:32702 EPSG:32703 EPSG:32704 EPSG:32705 EPSG:32706 EPSG:32707 EPSG:32708 EPSG:32709 EPSG:32710 EPSG:32711 EPSG:32712 EPSG:32713 EPSG:32714 EPSG:32715 EPSG:32716 EPSG:32717 EPSG:32718 EPSG:32719 EPSG:32720 EPSG:32721 EPSG:32722 EPSG:32723 EPSG:32724 EPSG:32725 EPSG:32726 EPSG:32727 EPSG:32728 EPSG:32729 EPSG:32730 EPSG:32731 EPSG:32732 EPSG:32733 EPSG:32734 EPSG:32735 EPSG:32736 EPSG:32737 EPSG:32738 EPSG:32739 EPSG:32740 EPSG:32741 EPSG:32742 EPSG:32743 EPSG:32744 EPSG:32745 EPSG:32746 EPSG:32747 EPSG:32748 EPSG:32749 EPSG:32750 EPSG:32751 EPSG:32752 EPSG:32753 EPSG:32754 EPSG:32755 EPSG:32756 EPSG:32757 EPSG:32758 EPSG:32759 EPSG:32760 EPSG:41001 EPSG:41002 EPSG:42101 
 EPSG:42102 EPSG:42103 EPSG:42104 EPSG:42105 EPSG:42106 EPSG:42200 EPSG:42201 EPSG:42202 EPSG:42203 EPSG:42204 EPSG:42205 EPSG:42206 EPSG:42207 EPSG:42208 EPSG:100001 EPSG:42301 EPSG:42302 EPSG:42303 EPSG:42304 EPSG:42305 EPSG:42306 EPSG:42307 EPSG:42308 EPSG:42309 EPSG:42310</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
          <Format>image/gif</Format>
       </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
            <!--LegendURL width="16" height="16" format="image/gif">
              <OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi?VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=POPPLACE_PT%3ACEOWARE2&amp;FORMAT=image%2Fgif"/>
            </LegendURL-->
          </Style>
        </StyleList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/cite.xml
  
  Index: cite.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="500" height="285"/>
      <BoundingBox SRS="EPSG:4326" minx="-0.0042" miny="-0.0024" maxx="0.0042" maxy="0.0024"/>
      <Title>Blue Lake Cite Map</Title>
      <KeywordList>
        <Keyword>CITE</Keyword>
      </KeywordList>
      <Abstract></Abstract>
    </General>
    <LayerList>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:Forests</Name>
        <Title>Forests</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:Ponds</Name>
        <Title>Ponds</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:Lakes</Name>
        <Title>Lakes</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:Streams</Name>
        <Title>Streams</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:NamedPlaces</Name>
        <Title>Named Places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:Buildings</Name>
        <Title>Buildings</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:DividedRoutes</Name>
        <Title>Divided Routes</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:RoadSegments</Name>
        <Title>Road Segments</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:Bridges</Name>
        <Title>Bridges</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
        </Server>
        <Name>cite:MapNeatline</Name>
        <Title>Map Neatline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList><Format current="1">image/png</Format></FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/cite_deegree.xml
  
  Index: cite_deegree.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <ViewContext xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wmc="http://www.opengis.net/context" version="1.0.0" id="eos_data_gateways" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="400" height="200"/>
      <Title>deegree wms</Title>
      <BoundingBox SRS="EPSG:4326" minx="-18" miny="-9" maxx="18" maxy="9"/>
    </General>
    <LayerList>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:BasicPolygons</Name>
        <Title>cite:BasicPolygons</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:Bridges</Name>
        <Title>cite:Bridges</Title>
        <Abstract/>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:BuildingCenters</Name>
        <Title>cite:BuildingCenters</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:Buildings</Name>
        <Title>cite:Buildings</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:DividedRoutes</Name>
        <Title>cite:DividedRoutes</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:Forests</Name>
        <Title>cite:Forests</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:Lakes</Name>
        <Title>cite:Lakes</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:MapNeatline</Name>
        <Title>cite:MapNeatline</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:NamedPlaces</Name>
        <Title>cite:NamedPlaces</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:Ponds</Name>
        <Title>cite:Ponds</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:RoadSegments</Name>
        <Title>cite:RoadSegments</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="deegree wms">
          <OnlineResource type="simple" xlink:href="http://ogc-ri.deegree.org/deegree/wms?"/>
        </Server>
        <Name>cite:Streams</Name>
        <Title>cite:Streams</Title>
        <Abstract/>
        <SRS/>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/demisWorldMap.xml
  
  Index: demisWorldMap.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  	<General>
      <Title>Demis World Map (WMS)</Title>
  		<Window width="600" height="300"/>
  		<BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <KeywordList>
        <Keyword>OGC WMS</Keyword>
        <Keyword>Web Map Service</Keyword>
        <Keyword>VMap0</Keyword>
        <Keyword>DCW</Keyword>
        <Keyword>SRTM</Keyword>
        <Keyword>ETOPO2</Keyword>
      </KeywordList>
      <Abstract>Digital chart of the World, 1:1000,000 scale basemap from various public domain data sources</Abstract>
      <LogoURL width="198" height="83" format="image/jpg">
        <OnlineResource xlink:type="simple" xlink:href="http://www.demis.nl/home/images/OGCCompliant.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://www.demis.nl/home/pages/wms/demiswms.htm"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Bart Adriaanse</ContactPerson>
          <ContactOrganization>Demis bv. The Netherlands</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>GIS &amp; Software Engineer</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>Rotterdamseweg 183C</Address>
          <City>Delft</City>
          <StateOrProvince>ZH</StateOrProvince>
          <PostCode>2629HD</PostCode>
          <Country>Netherlands</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+31152682510</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+31152682507</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>contact at demis.nl</ContactElectronicMailAddress>
      </ContactInformation>
  	</General>
  	<LayerList>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  			</Server>
  			<Name>Bathymetry,Countries,Topography,Hillshading</Name>
  			<Title>Topography</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  			</Server>
  			<Name>Coastlines,Waterbodies,Inundated,Rivers,Streams</Name>
  			<Title>Land features</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  			</Server>
  			<Name>Builtup+areas,Railroads,Highways,Roads,Trails,Borders,Cities,Settlements,Airports</Name>
  			<Title>Man-made features</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  			</Server>
  			<Name>Spot+elevations,Ocean+features</Name>
  			<Title>Misc. features</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  	</LayerList>
  </ViewContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/demoCollection.xml
  
  Index: demoCollection.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContextCollection version="1.0.0" xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net http://schemas.opengeospatial.net/context/1.0.0/collection.xsd">
  	<!-- List of context XML URLs -->
  	<ViewContextReference version="1.0.0" id="atlas">
  		<Title>Atlas World base map</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="../data/context/atlasWorld.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="demis">
  		<Title>Demis World map</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="../data/context/demisWorldMap.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="cded">
      <Title>Canadian Digital Elevation Data (GeoBase)</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="../data/context/cded.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="lsat7Ortho">
  		<Title>Landsat Orthorectified Imagery over Canada</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="../data/context/lsat7Ortho.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="mars">
  		<Title>Mars landings</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="../data/context/mars.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="modisWorldMosaic">
      <Title>MODIS world mosaic</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="../data/context/modisWorld.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="radarsatMosaicCanada">
      <Title>Radarsat Mosaic of Canada</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="../data/context/radarsatMosaic.xml"/>
  		</ContextURL>
  	</ViewContextReference>
    <ViewContextReference version="1.0.0" id="cite">
  		<Title>Cite Reference (local geoserver)</Title>
  		<ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="../data/context/cite.xml"/>
  		</ContextURL>
  	</ViewContextReference>
    <ViewContextReference version="1.0.0" id="cite">
  		<Title>Cite Reference (deegree server)</Title>
  		<ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="../data/context/cite_deegree.xml"/>
  		</ContextURL>
  	</ViewContextReference>
    <ViewContextReference version="1.0.0" id="sldExample">
  		<Title>SLD param example</Title>
  		<ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="../data/context/SLDParamExample.xml"/>
  		</ContextURL>
  	</ViewContextReference>
    <ViewContextReference version="1.0.0" id="boston">
  		<Title>Boston</Title>
  		<ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="../data/context/boston.xml"/>
  		</ContextURL>
  	</ViewContextReference>
    <ViewContextReference version="1.0.0" id="local">
      <Title>http://localhost:8080/geoserver</Title>
  		<ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="../data/context/local.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="aafc">
  		<Title>External server example (requires proxy script)</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/contexts/radarsatMosaic.xml"/>
  		</ContextURL>
  	</ViewContextReference>
    
  </ViewContextCollection>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/local.xml
  
  Index: local.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <ViewContext version="1.0.0"
  			    id="eos_data_gateways"
  			    xmlns="http://www.opengis.net/context"
  			    xmlns:xlink="http://www.w3.org/1999/xlink"
  			    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  			    xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
  	<General>
  		<Window width="500" height="300" />
      <BoundingBox SRS="EPSG:4326" minx="489154" miny="5433017" maxx="505234" maxy="5448023"/>
  		<!--BoundingBox SRS="EPSG:4326" minx="-180.000000" miny="-90.000000" maxx="180.000000" maxy="90.000000"/-->
  		<Title>http://localhost:8080/geoserver</Title>
  		<KeywordList>
  			<Keyword>EOS</Keyword>
  			<Keyword>EOSDIS</Keyword>
  			<Keyword>NASA</Keyword>
  			<Keyword>CCRS</Keyword>
  			<Keyword>CEOS</Keyword>
  			<Keyword>OGC</Keyword>
  		</KeywordList>
      <Abstract>Users default Geoserver http://geoserver.sf.net WMS/WFS</Abstract>
  	</General>
  	<LayerList>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.1.1" title="Local">
  				<OnlineResource xlink:type="simple" xlink:href="http://localhost:8080/geoserver/wms"/>
  			</Server>
  			<Name>topp:states</Name>
  			<Title>USA Population</Title>
        <Abstract>USA census data.</Abstract>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/png</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>population</Name>
  					<Title>population</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.1.1" title="Local">
  				<OnlineResource xlink:type="simple" xlink:href="http://localhost:8080/geoserver/wms"/>
  			</Server>
  			<Name>topp:bc_roads</Name>
  			<Title>BC Roads</Title>
  			<Abstract>Some roads in British Columbia</Abstract>
  			<SRS>EPSG:27354</SRS>
  			<FormatList>
  				<Format current="1">image/png</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>normal</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  	</LayerList>
  </ViewContext> 
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/locatorCanada.xml
  
  Index: locatorCanada.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_l7o" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="180" height="152"/>
      <BoundingBox SRS="EPSG:42304" minx="-2600000" miny="-1000000" maxx="3100000" maxy="3800000"/>
      <!--		<BoundingBox SRS="EPSG:42304" minx="-3546709.473205" miny="-869773.355764" maxx="4444893.074820" maxy="3923457.184829" />-->
      <Title>Canada locator map (DM Solutions)</Title>
      <KeywordList>
        <Keyword>Canada</Keyword>
      </KeywordList>
      <Abstract>A simple map for use as a locator</Abstract>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Michael Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+01 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+01 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
    <Layer queryable="0" hidden="0"><Server service="wms" version="1.1.0" title="GMap WMS Demo Server"><OnlineResource xlink:type="simple" xlink:href="http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?"/></Server><Name>bathymetry</Name><Title>Elevation/Bathymetry</Title><SRS>EPSG:42304</SRS></Layer><Layer queryable="0" hidden="0"><Server service="wms" version="1.1.0" title="GMap WMS Demo Server"><OnlineResource xlink:type="simple" xlink:href="http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?"/></Server><Name>land_fn</Name><Title>Foreign Lands</Title><SRS>EPSG:42304</SRS></Layer><Layer queryable="0" hidden="0"><Server service="wms" version="1.1.0" title="GMap WMS Demo Server"><OnlineResource xlink:type="simple" xlink:href="http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?"/></Server><Name>prov_bound</Name><Title>Province</Title><SRS>EPSG:42304</SRS></Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/locatorMap.xml
  
  Index: locatorMap.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="mb_atlasLocatorMap" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gdp="http://geodiscover.cgdi.ca" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="180" height="90"/>
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <Title>GDP Atlas of Canada search map</Title>
      <KeywordList>
        <Keyword>atlas</Keyword>
      </KeywordList>
      <Abstract>background map for use in search map widget</Abstract>
      <LogoURL width="34" height="35" format="image/gif">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/hmi/common/images/ml/ES.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/about/en/9.1.4.html"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Michael Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+1 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+1 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>land</Name>
        <Title>land area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/lsat7Ortho.xml
  
  Index: lsat7Ortho.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <ViewContext version="1.0.0"
               id="atlas_l7o"
               xmlns="http://www.opengis.net/context"
               xmlns:xlink="http://www.w3.org/1999/xlink"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
  	<General>
      <Window width="400" height="337"/>
      <BoundingBox SRS="EPSG:42304" minx="-2600000" miny="-1000000" maxx="3100000" maxy="3800000"/>
  <!--		<BoundingBox SRS="EPSG:42304" minx="-3546709.473205" miny="-869773.355764" maxx="4444893.074820" maxy="3923457.184829" />-->
  		<Title>Landsat Orthorectified Imagery over Canada</Title>
  		<KeywordList>
  			<Keyword>Atlas</Keyword>
  			<Keyword>Canada</Keyword>
  			<Keyword>CITS</Keyword>
  			<Keyword>Landsat</Keyword>
  			<Keyword>Orthorectified</Keyword>
  			<Keyword>CCRS</Keyword>
  			<Keyword>NRCan</Keyword>
  		</KeywordList>
  		<Abstract>View showcasing the Landsat Orthorectified Imagery of Canada with overlays from the Atlas of Canada, by Natural Resources Canada</Abstract>
  		<LogoURL width="273" height="22" format="image/gif">
  			<OnlineResource xlink:type="simple" xlink:href="http://www.nrcan-rncan.gc.ca/inter/images/nrcan.gif"/>
  		</LogoURL>
  		<DescriptionURL format="text/html">
  			<OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/search?action=fullMetadata&amp;entryId=1583&amp;entryType=productCollection"/>
  		</DescriptionURL>
  		<ContactInformation>
  			<ContactPersonPrimary>
  				<ContactPerson>Tom Kralidis</ContactPerson>
  				<ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
  			</ContactPersonPrimary>
  			<ContactPosition>Systems Scientist</ContactPosition>
  			<ContactAddress>
  				<AddressType>postal</AddressType>
  				<Address>615 Booth Street, room 650</Address>
  				<City>Ottawa</City>
  				<StateOrProvince>Ontario</StateOrProvince>
  				<PostCode>K1A 0E9</PostCode>
  				<Country>Canada</Country>
  			</ContactAddress>
  			<ContactVoiceTelephone>+01 613 947 1828</ContactVoiceTelephone>
  			<ContactFacsimileTelephone>+01 613 947 2410</ContactFacsimileTelephone>
  			<ContactElectronicMailAddress>tom.kralidis at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
  		</ContactInformation>
  	</General>
  	<LayerList>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.1.1" title="Canada Centre for Remote Sensing Web Map Service">
  				<OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi"/>
  			</Server>
  			<Name>L7O_B743:CEOWARE2</Name>
  			<Title>Landsat 7 Orthorectified Imagery over Canada - band 743</Title>
  			<Abstract>The orthoimage data set is created with the most accurate control data available at the time of creation. The imagery has been corrected with either provincial and aerial triangulation data or, if not available, the most accurate NTDB data. The objective is to obtain accuracy of 30 metres or better in the South and 50 metres or better in the North for a 90% level of confidence. The accuracy is evaluated for each orthoimage dataset. The control data, which has been extracted from sources as mentioned above, can consist of road intersection vector data or lake/island centroids. In some cases the intersection of the centre line of surficial river may have been used. The control points are distributed homogeneously within the image in specific sectors. Sectors are located in the surround of the image, in the lowest and highest elevation area of the image, and in all other areas in which overlapping image base sectors are located.</Abstract>
  			<DataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/download/landsat_7/ortho/"/>
  			</DataURL>
  			<MetadataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=1583&amp;entryType=productCollection&amp;context=&amp;keymap=outlineCanada"/>
  			</MetadataURL>
  			<SRS>EPSG:4326 AUTO:42001 AUTO:42002 AUTO:42003 AUTO:42004 EPSG:2263 EPSG:2283 EPSG:4267 EPSG:4269 EPSG:26703 EPSG:26704 EPSG:26705 EPSG:26706 EPSG:26707 EPSG:26708 EPSG:26709 EPSG:26710 EPSG:26711 EPSG:26712 EPSG:26713 EPSG:26714 EPSG:26715 EPSG:26716 EPSG:26717 EPSG:26718 EPSG:26719 EPSG:26720 EPSG:26721 EPSG:26722 EPSG:26903 EPSG:26904 EPSG:26905 EPSG:26906 EPSG:26907 EPSG:26908 EPSG:26909 EPSG:26910 EPSG:26911 EPSG:26912 EPSG:26913 EPSG:26914 EPSG:26915 EPSG:26916 EPSG:26917 EPSG:26918 EPSG:26919 EPSG:26920 EPSG:26921 EPSG:26922 EPSG:26923 EPSG:26930 EPSG:26985 EPSG:26986 EPSG:26987 EPSG:27582 EPSG:27700 EPSG:32118 EPSG:32128 EPSG:32129 EPSG:32601 EPSG:32602 EPSG:32603 EPSG:32604 EPSG:32605 EPSG:32606 EPSG:32607 EPSG:32608 EPSG:32609 EPSG:32610 EPSG:32611 EPSG:32612 EPSG:32613 EPSG:32614 EPSG:32615 EPSG:32616 EPSG:32617 EPSG:32618 EPSG:32619 EPSG:32620 EPSG:32621 EPSG:32622 EPSG:32623 EPSG:32624 EPSG:32625 EPSG:32626 EPSG:32627 EPSG:32628 EPSG:32629 EPSG:32630 EPSG:3
 2631 EPSG:32632 EPSG:32633 EPSG:32634 EPSG:32635 EPSG:32636 EPSG:32637 EPSG:32638 EPSG:32639 EPSG:32640 EPSG:32641 EPSG:32642 EPSG:32643 EPSG:32644 EPSG:32645 EPSG:32646 EPSG:32647 EPSG:32648 EPSG:32649 EPSG:32650 EPSG:32651 EPSG:32652 EPSG:32653 EPSG:32654 EPSG:32655 EPSG:32656 EPSG:32657 EPSG:32658 EPSG:32659 EPSG:32660 EPSG:32701 EPSG:32702 EPSG:32703 EPSG:32704 EPSG:32705 EPSG:32706 EPSG:32707 EPSG:32708 EPSG:32709 EPSG:32710 EPSG:32711 EPSG:32712 EPSG:32713 EPSG:32714 EPSG:32715 EPSG:32716 EPSG:32717 EPSG:32718 EPSG:32719 EPSG:32720 EPSG:32721 EPSG:32722 EPSG:32723 EPSG:32724 EPSG:32725 EPSG:32726 EPSG:32727 EPSG:32728 EPSG:32729 EPSG:32730 EPSG:32731 EPSG:32732 EPSG:32733 EPSG:32734 EPSG:32735 EPSG:32736 EPSG:32737 EPSG:32738 EPSG:32739 EPSG:32740 EPSG:32741 EPSG:32742 EPSG:32743 EPSG:32744 EPSG:32745 EPSG:32746 EPSG:32747 EPSG:32748 EPSG:32749 EPSG:32750 EPSG:32751 EPSG:32752 EPSG:32753 EPSG:32754 EPSG:32755 EPSG:32756 EPSG:32757 EPSG:32758 EPSG:32759 EPSG:32760 EPSG:
 41001 EPSG:42101 EPSG:42102 EPSG:42103 EPSG:42104 EPSG:42105 EPSG:42106 EPSG:42301 EPSG:42302 EPSG:42303 EPSG:42304 EPSG:42305 EPSG:42306 EPSG:42307 EPSG:42308 EPSG:42309 EPSG:42310 EPSG:100001</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  				<Format>image/png</Format>
  				<Format>image/tiff</Format>
  				<Format>image/jpeg</Format>
  				<Format>image/ppm</Format>
  				<Format>application/x-cubestor-wkb</Format>
  				<Format>application/x-cubestor-gml.1</Format>
  				<Format>application/x-cubestor-gml.2</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  					<LegendURL width="16" height="16" format="image/gif">
  						<OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi?VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=L7O_B743%3ACEOWARE2&amp;FORMAT=image%2Fgif"/>
  					</LegendURL>    
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="0" hidden="1">
  			<Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
  			</Server>
  			<Name>drain_60m</Name>
  			<Title>Drainage (1:60 000 000)</Title>
  			<Abstract>Coastline, rivers and lake shorelines intended for display at a scale of 1:60 000 000.</Abstract>
  			<DataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
  			</DataURL>
  			<MetadataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
  			</MetadataURL>
  			<SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  				<Format>image/png</Format>
  				<Format>image/jpeg</Format>
  				<Format>image/wbmp</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="0" hidden="1">
  			<Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
  			</Server>
  			<Name>roads_15m</Name>
  			<Title>Road network (1:15 000 000)</Title>
  			<Abstract>Road network and ferry routes intended for display at the scale of 1:15 000 000.</Abstract>
  			<DataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
  			</DataURL>
  			<MetadataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
  			</MetadataURL>			
  			<SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  				<Format>image/png</Format>
  				<Format>image/jpeg</Format>
  				<Format>image/wbmp</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="0" hidden="0">
  			<Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
  			</Server>
  			<Name>can_7.5m</Name>
  			<Title>Landmass outline (1:7 500 000)</Title>
  			<Abstract>The outline of the landmass of Canada</Abstract>
  			<DataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
  			</DataURL>
  			<MetadataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
  			</MetadataURL>			
  			<SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  				<Format>image/png</Format>
  				<Format>image/jpeg</Format>
  				<Format>image/wbmp</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="0" hidden="0">
  			<Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
  			</Server>
  			<Name>nat_bounds</Name>
  			<Title>Provincial and Territorial Boundaries</Title>
  			<Abstract>Provincial and territorial boundaries</Abstract>
  			<DataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
  			</DataURL>
  			<MetadataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
  			</MetadataURL>			
  			<SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  				<Format>image/png</Format>
  				<Format>image/jpeg</Format>
  				<Format>image/wbmp</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="1">
  			<Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
  			</Server>
  			<Name>places_labels_2m</Name>
  			<Title>Populated Places (labels 1:2M)</Title>
  			<Abstract>Selection of Canadian populated places in four classes based on 1991 Census data. It is intended for display at 1:2 000 000.</Abstract>
  			<DataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
  			</DataURL>
  			<MetadataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
  			</MetadataURL>			
  			<SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  				<Format>image/png</Format>
  				<Format>image/jpeg</Format>
  				<Format>image/wbmp</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="1">
  			<Server service="OGC:WMS" version="1.1.0" title="Atlas of Canada WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/atlaswms_en"/>
  			</Server>
  			<Name>cap_labels</Name>
  			<Title>Capitals (Canada)</Title>
  			<Abstract>National, provincial and territorial capital name labels.</Abstract>
  			<DataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/nationalatlas/e_intro_g.html"/>
  			</DataURL>
  			<MetadataURL format="text/html">
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=138&amp;entryType=productCollection&amp;context=/contexts/atlas_l7o.xml&amp;keymap=outlineCanada"/>
  			</MetadataURL>			
  			<SRS>EPSG:42101 EPSG:42304 EPSG:4269 EPSG:4326 EPSG:2294 EPSG:2295 EPSG:26922 EPSG:26921 EPSG:26920 EPSG:26919 EPSG:26918 EPSG:26917 EPSG:26916 EPSG:26915 EPSG:26914 EPSG:26913 EPSG:26912 EPSG:26911 EPSG:26910 EPSG:26909 EPSG:26908 EPSG:26907 EPSG:26722 EPSG:26721 EPSG:26720 EPSG:26719 EPSG:26718 EPSG:26717 EPSG:26716 EPSG:26715 EPSG:26714 EPSG:26713 EPSG:26712 EPSG:26711 EPSG:26710 EPSG:26709 EPSG:26708 EPSG:26707 EPSG:2295 EPSG:2294</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  				<Format>image/png</Format>
  				<Format>image/jpeg</Format>
  				<Format>image/wbmp</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  	</LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/mars.xml
  
  Index: mars.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0"
               id="mars"
               xmlns="http://www.opengis.net/context"
               xmlns:xlink="http://www.w3.org/1999/xlink"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
  	<General>
  		<Window width="500" height="250"/>
  		<BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
  		<Title>Mars</Title>
  		<Abstract>This data product is a topographic map of Mars at a resolution of 0.00781 (1/128) by 0.00781 degrees, based on altimetry data acquired by the Mars Global Surveyor MOLA instrument and accumulated over the course of the primary and extended mission. The MOLA Precision Experiment Data Records (PEDRs) are the source for this data set. The map is in the form of a binary table with one row for each 0.00781-degree latitude. Map coordinates use the IAU2000 reference system, and areoid defined by the Goddard Mars potential model GMM3 (mgm1025) evaluated to degree and order 50. The binned data include all MOLA nadir observations from the Mapping Phase through the Primary and Extended missions, from the end of aerobraking in February 1999 through June 2001. Additionally, off-nadir observations of the north pole are included from 87 N latitude and northward, taken during the spring of 1998, and of both poles taken during Mapping from 87 N and S to the poles. Data are adjust
 ed using a first-order crossover solution for radial, along-track, and across-track position. Parts of orbits are excluded where solutions for these orbits are deemed to be poor. (Note: subtract 10000 from a MOLA mapping phase orbit number to determine the equivalent MGS Project orbit number.) Also excluded are shots more than 1.2 degree off-nadir (except as noted above), channel 4 returns, and any returns not classified as ground returns, e.g. clouds or noise, according to the SHOT_CLASSIFICATION_CODE. A total of nearly 600,000,000 observations are represented.</Abstract>
  	</General> 
  	<LayerList>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars"/>
  			</Server>
  			<Name>MOLA128:MARS_DATA</Name>
  			<Title>Mars Topography</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/png</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>Land%20Shade</Name>
  					<Title>Land Shade</Title>
  					<LegendURL width="16" height="16" format="image/gif">
  						<OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&amp;VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=MOLA128%3AMARS_DATA&amp;STYLE=Land Shade&amp;FORMAT=image%2Fgif"/>
  					</LegendURL>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="1">
  			<Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars"/>
  			</Server>
  						<Name>SHADEDRED:MARS_DATA</Name>
  						<Title>Shaded Red</Title>
  						<Abstract>The Red Mars map is a 24bit colour image in Plate Carée Equirectangular projection, representing the surface of Mars, as viewable from space.  The new Mars colour was built using a mass of procedural textures for a seamless and distortion free pleasing look, and the remaining details were derived from  Nasa/Jpl* imagery.</Abstract>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/png</Format>
  			</FormatList>
  			<StyleList>
  						<Style>
  							<Name>default</Name>
  							<Title>default</Title>
  							<LegendURL width="16" height="16">
  								<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&amp;SERVICE=WMS&amp;VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=SHADEDRED%3AMARS_DATA&amp;FORMAT=image%2Fpng&amp;SIMPLE=TRUE"/>
  							</LegendURL>
  						</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="1">
  			<Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars"/>
  			</Server>
  						<Name>MDIM21:MARS_DATA</Name>
  						<Title>Mars Global Digital Image Mosaic</Title>
  						<Abstract> This layer is a global image map of Mars with a resolution of 256 pixels/degree (scale approximately 231 m/pixel at the equator). The black-and-white mosaic is processed to emphasize local topographic features. This mosaic, known as Mars Digital Image Model (MDIM) 2.1, replaces two earlier mosaics produced by the USGS from the same set of approximately 4600 Viking Orbiter images. The positional accuracy of features in MDIM 2.1 is estimated to be roughly one pixel (200 m), compared to 3 km for MDIM 2.0 released in 2001 and &gt;6 km for MDIM 1.0 released in 1991. In addition to relatively imprecise geodetic control, the previous mosaics were affected by changing definitions of cartographic parameters (such as the definition of zero longitude), resulting in an overall longitude shift of as much as 0.2° between the early MDIMs and other datasets. The new mosaic uses the most recent coordinate system definitions for Mars. These definitions have been widely adop
 ted by NASA missions and other users of planetary data and are likely to remain in use for a decade or more. As a result, MDIM 2.1 not only registers precisely with data from current missions such as MGS and 2001 Mars Odyssey but will serve as an accurate basemap on which data from future missions can be plotted.</Abstract>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/png</Format>
  			</FormatList>
  			<StyleList>
  						<Style>
  							<Name>default</Name>
  							<Title>default</Title>
  							<LegendURL width="16" height="16">
  								<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&amp;SERVICE=WMS&amp;VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=OCEANIC%3AMARS_DATA&amp;FORMAT=image%2Fpng&amp;SIMPLE=TRUE"/>
  							</LegendURL>
  						</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="1">
  			<Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars"/>
  			</Server>
  						<Name>OCEANIC:MARS_DATA</Name>
  						<Title>Oceanic</Title>
  						<Abstract>The Blue Mars map is a 24bit colour image in Plate Carée Equirectangular projection, representing the surface of Mars in one possible aspect from billions of years ago, when parts of the surface where probably filled with water. A situation similar to the Earth with oceans.  BLUE MARS was completely done using Terragen and the Waterworks plugin. Topography and surface details matched with the "ieg0031t" MOLA dataset.</Abstract>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/png</Format>
  			</FormatList>
  			<StyleList>
  						<Style>
  							<Name>default</Name>
  							<Title>default</Title>
  							<LegendURL width="16" height="16">
  								<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&amp;SERVICE=WMS&amp;VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=OCEANIC%3AMARS_DATA&amp;FORMAT=image%2Fpng&amp;SIMPLE=TRUE"/>
  							</LegendURL>
  						</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
  				<OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars"/>
  			</Server>
  			<Name>MARS_LANDINGS:MARS_DATA</Name>
  			<Title>Mars Landings</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  					<LegendURL width="16" height="16" format="image/gif">
  						<OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&amp;VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=MARS_LANDINGS%3AMARS_DATA&amp;STYLE=icons&amp;FORMAT=image%2Fgif"/>
  					</LegendURL>
  				</Style>
  			</StyleList>
  		</Layer>
  	</LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/modisWorld.xml
  
  Index: modisWorld.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
  <ViewContext  version="1.0.0" 
                id="GDP-SearchMapContext-Modis" 
                xmlns="http://www.opengis.net/context" 
                xmlns:xlink="http://www.w3.org/1999/xlink" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:gdp="http://geodiscover.cgdi.ca"
                xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="500" height="250"/>
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <Title>MODIS composite</Title>
      <KeywordList>
        <Keyword>MODIS</Keyword>
      </KeywordList>
      <Abstract>background map for use in search map widget</Abstract>
      <LogoURL width="34" height="35" format="image/gif">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/hmi/common/images/ml/ES.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/about/en/9.1.4.html"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
        <ContactPerson>Michael Adair</ContactPerson>
        <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+1 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+1 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
  
    <LayerList>
        <Layer hidden="0" queryable="0">
        <Server version="1.1.0" service="OGC">
          <OnlineResource xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi" xlink:type="simple"/>
        </Server>
        <Name>COASTL_BND_1M:Foundation</Name> 
        <Title>Coastlines</Title> 
        <Abstract>info</Abstract>
        <DataURL>
          <OnlineResource xlink:href="http://www.cits.rncan.gc.ca/" xlink:type="simple"/>
        </DataURL>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
        <Extension>
          <LatLongBoundingBox xmlns="gdp" SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
        </Extension>
      </Layer>
  
      <Layer hidden="0" queryable="0">
        <Server version="1.1.0" service="OGC">
          <OnlineResource xlink:href="http://mapserv2.esrin.esa.it/cubestor/cubeserv/cubeserv.cgi" xlink:type="simple"/>
        </Server>
        <Name>WORLD_MODIS_1KM:MapAdmin</Name>
        <Title>Modis world composite</Title>
        <Abstract>info</Abstract>
        <DataURL>
          <OnlineResource xlink:href="http://www.cits.rncan.gc.ca/" xlink:type="simple"/>
        </DataURL>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/jpg</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
        <Extension>
          <LatLongBoundingBox xmlns="gdp" SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
        </Extension>
      </Layer>
  
      <Layer hidden="0" queryable="0">
        <Server version="1.1.0" service="OGC">
          <OnlineResource xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi" xlink:type="simple"/>
        </Server>
        <Name>POLBNDL_BND_1M:Foundation</Name>
        <Title>Political Boundaries</Title>
        <Abstract>info</Abstract>
        <DataURL>
          <OnlineResource xlink:href="http://www.cits.rncan.gc.ca/" xlink:type="simple"/>
        </DataURL>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
        <Extension>
          <LatLongBoundingBox xmlns="gdp" SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
        </Extension>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/context/radarsatMosaic.xml
  
  Index: radarsatMosaic.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
  <ViewContext version="1.0.0" 
        id="GDPContextServer-uniqueID" 
        xmlns="http://www.opengis.net/context" 
        xmlns:xlink="http://www.w3.org/1999/xlink" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:gdp="http://geodiscover.cgdi.ca" 
        xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="400" height="337"/>
      <BoundingBox SRS="EPSG:42101" minx="-2600000" miny="-2300000" maxx="3100000" maxy="2500000"/>
      <Title>Radarsat Mosaic of Canada</Title>
      <KeywordList>
        <Keyword>Radarsat</Keyword>
      </KeywordList>
      <Abstract>The Canada Centre for Remote Sensing (CCRS), and the Canadian 
  Space Agency (CSA) have collaborated with contributions from RADARSAT 
  International (RSI), to create an ortho-rectified RADARSAT-1 mosaic of Canada.
          
  Using CSA's RADARSAT data archive, ScanSAR Narrow B descending mode data were 
  selected. The majority of the data, south of 60 degrees was acquired during the 
  growing seasons of 1998 and 1999. The remaining data were collected during the 
  winters of 1998 and 1999.
          
  A digital national mosaic has been produced at a 250m pixel spacing, in a 
  Lambert Conformal Conic (LCC) projection. 
      </Abstract>
      <LogoURL width="228" height="200" format="image/gif">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/contexts/radarsatMosaic.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/search?action=fullMetadata&amp;entryId=9090&amp;entryType=productCollection"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Michael Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+1 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+1 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer hidden="0" queryable="0">
        <Server version="1.1.0" service="OGC">
          <OnlineResource xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi?" xlink:type="simple"/>
        </Server>
        <Name>RSAT_MOSAIC:CEOWARE2</Name>
        <Title>Radarsat Mosaic of Canada</Title>
        <Abstract>info</Abstract>
        <DataURL>
          <OnlineResource xlink:href="http://geodiscover.cgdi.ca/gdp/search?action=fullMetadata&amp;entryId=9090&amp;entryType=productCollection" xlink:type="simple"/>
        </DataURL>
        <SRS>EPSG:42101</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
        <Extension>
          <LatLongBoundingBox xmlns="gdp" SRS="EPSG:4326" minx="-180" maxx="180" miny="90" maxy="-90"/>
        </Extension>
      </Layer>
      <Layer hidden="0" queryable="0">
        <Server version="1.1.0" service="OGC">
          <OnlineResource xlink:href="http://cgns.nrcan.gc.ca/wms/cubeserv.cgi?" xlink:type="simple"/>
        </Server>
        <Name>GEONAMES:cgns</Name>
        <Title>Canadian Geographical Names</Title>
        <Abstract>info</Abstract>
        <DataURL>
          <OnlineResource xlink:href="http://cgns.nrcan.gc.ca" xlink:type="simple"/>
        </DataURL>
        <SRS>EPSG:42101</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
        <Extension>
          <LatLongBoundingBox xmlns="gdp" SRS="EPSG:4326" minx="-141.000000001" maxx=".000000003" miny="83.119999999" maxy=".000000003"/>
        </Extension>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/gml/NTSLookup.xml
  
  Index: NTSLookup.xml
  ===================================================================
  <ntslookup xmlns:xlink="http://www.w3.org/TR/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://geoservices.cgdi.ca/schemas/cgdi/nts/nts-1.1.1.xsd" xmlns:gml="http://www.opengis.net/gml" version="1.1.2">
    <!-- a chunk of GML data generated by the NTS Lookup service described at: http://geoservices.cgdi.ca/NTS/index.jsp -->
    <gml:boundedBy>
      <gml:Box srsName="EPSG:4326">
        <gml:coordinates>-76.0,45.0 -74.0,46.0</gml:coordinates>
      </gml:Box>
    </gml:boundedBy>
    <ntsResultSet scale="250000">
      <nts>
        <gml:name>031G</gml:name>
        <ntsQuadrangle>
          <gml:Polygon>
            <gml:outerBoundaryIs>
              <gml:LinearRing srsName="EPSG:4326">
                <gml:coordinates>-74.0,45.0 -76.0,45.0 -76.0,46.0 -74.0,46.0 -74.0,45.0</gml:coordinates>
              </gml:LinearRing>
            </gml:outerBoundaryIs>
          </gml:Polygon>
        </ntsQuadrangle>
        <ntsNeatline>
          <gml:Polygon>
            <gml:outerBoundaryIs>
              <gml:LinearRing srsName="EPSG:4326">
                <gml:coordinates>-74.0,45.0 -74.25,45.0 -74.5,45.0 -74.75,45.0 -75.0,45.0 -75.25,45.0 -75.5,45.0 -75.75,45.0 -76.0,45.0 -76.0,45.25 -76.0,45.5 -76.0,45.75 -76.0,46.0 -75.75,46.0 -75.5,46.0 -75.25,46.0 -75.0,46.0 -74.75,46.0 -74.5,46.0 -74.25,46.0 -74.0,46.0 -74.0,45.75 -74.0,45.5 -74.0,45.25 -74.0,45.0 </gml:coordinates>
              </gml:LinearRing>
            </gml:outerBoundaryIs>
          </gml:Polygon>
        </ntsNeatline>
      </nts>
    </ntsResultSet>
  </ntslookup>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/gml/Test.xml
  
  Index: Test.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <QuickviewPresetResultSet version="1.0.0"  xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/locations.xsd">
  
    <!-- Envelope examples -->
  	<gml:description>This is the CMB preset zoom document</gml:description>
  	<gml:name>CMB:QuickViewPreset</gml:name>
  	<gml:boundedBy>
  		<gml:Null>missing</gml:Null>
  	</gml:boundedBy>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Asia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>40,-10 180,83.5</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Australia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>111.22,-45.73 155.72,-8.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Canada</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-145.27,37.3 -48.11,87.61</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Central America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-94.1,21.8 -75.8,6.61</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Europe</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-25.1,71.3 35,34.9</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>North America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-168.5,18 -50.4,85.7</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>North America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-168.5,18 -50.4,85.7</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  
    <!-- Point examples -->
    <gml:featureMember>
      <points>
        <FID>0</FID>
        <AREA>0.0</AREA>
        <PERIMETER>0.0</PERIMETER>
        <DTM_>202240</DTM_>
        <DTM_ID>202273</DTM_ID>
        <DTM_CODE>1</DTM_CODE>
        <DTM_ELEV>8.3000001907299996</DTM_ELEV>
        <POLYGONID>0</POLYGONID>
        <SCALE>1.0</SCALE>
        <ANGLE>0</ANGLE>
        <_SHAPE_>
          <gml:MultiPoint srsName="epsg:4326">
            <gml:pointMember>
              <gml:Point>
                <gml:coordinates>-71.08641266665947,42.363115828688542 </gml:coordinates>
              </gml:Point>
            </gml:pointMember>
          </gml:MultiPoint>
        </_SHAPE_>
      </points>
    </gml:featureMember>
    <gml:featureMember>
      <points>
        <FID>1</FID>
        <AREA>0.0</AREA>
        <PERIMETER>0.0</PERIMETER>
        <DTM_>202241</DTM_>
        <DTM_ID>202274</DTM_ID>
        <DTM_CODE>1</DTM_CODE>
        <DTM_ELEV>8.3000001907299996</DTM_ELEV>
        <POLYGONID>0</POLYGONID>
        <SCALE>1.0</SCALE>
        <ANGLE>0</ANGLE>
        <_SHAPE_>
          <gml:MultiPoint srsName="epsg:4326">
            <gml:pointMember>
              <gml:Point>
                <gml:coordinates>-31.086417145399238,-31.362900543962461 </gml:coordinates>
              </gml:Point>
            </gml:pointMember>
          </gml:MultiPoint>
        </_SHAPE_>
      </points>
    </gml:featureMember>
    <gml:featureMember>
      <points>
        <FID>2</FID>
        <AREA>0.0</AREA>
        <PERIMETER>0.0</PERIMETER>
        <DTM_>202242</DTM_>
        <DTM_ID>202275</DTM_ID>
        <DTM_CODE>1</DTM_CODE>
        <DTM_ELEV>8.3000001907299996</DTM_ELEV>
        <POLYGONID>0</POLYGONID>
        <SCALE>1.0</SCALE>
        <ANGLE>0</ANGLE>
        <_SHAPE_>
          <gml:MultiPoint srsName="epsg:4326">
            <gml:pointMember>
              <gml:Point>
                <gml:coordinates>32.086420091556604,10.36269894669509 </gml:coordinates>
              </gml:Point>
            </gml:pointMember>
          </gml:MultiPoint>
        </_SHAPE_>
      </points>
    </gml:featureMember>
    <gml:featureMember>
      <points>
        <FID>3</FID>
        <AREA>0.0</AREA>
        <PERIMETER>0.0</PERIMETER>
        <DTM_>202245</DTM_>
        <DTM_ID>202278</DTM_ID>
        <DTM_CODE>1</DTM_CODE>
        <DTM_ELEV>8.3000001907299996</DTM_ELEV>
        <POLYGONID>0</POLYGONID>
        <SCALE>1.0</SCALE>
        <ANGLE>0</ANGLE>
        <_SHAPE_>
          <gml:MultiPoint srsName="epsg:4326">
            <gml:pointMember>
              <gml:Point>
                <gml:coordinates>-71.08664032020333,42.362727975037302 </gml:coordinates>
              </gml:Point>
            </gml:pointMember>
          </gml:MultiPoint>
        </_SHAPE_>
      </points>
    </gml:featureMember>
    <gml:featureMember>
      <points>
        <FID>4</FID>
        <AREA>0.0</AREA>
        <PERIMETER>0.0</PERIMETER>
        <DTM_>202246</DTM_>
        <DTM_ID>202279</DTM_ID>
        <DTM_CODE>1</DTM_CODE>
        <DTM_ELEV>8.3000001907299996</DTM_ELEV>
        <POLYGONID>0</POLYGONID>
        <SCALE>1.0</SCALE>
        <ANGLE>0</ANGLE>
        <_SHAPE_>
          <gml:MultiPoint srsName="epsg:4326">
            <gml:pointMember>
              <gml:Point>
                <gml:coordinates>150.086612484065697,12.362888184383699 </gml:coordinates>
              </gml:Point>
            </gml:pointMember>
          </gml:MultiPoint>
        </_SHAPE_>
      </points>
    </gml:featureMember>
    <gml:featureMember>
      <points>
        <FID>5</FID>
        <AREA>0.0</AREA>
        <PERIMETER>0.0</PERIMETER>
        <DTM_>202247</DTM_>
        <DTM_ID>202280</DTM_ID>
        <DTM_CODE>1</DTM_CODE>
        <DTM_ELEV>8.3000001907299996</DTM_ELEV>
        <POLYGONID>0</POLYGONID>
        <SCALE>1.0</SCALE>
        <ANGLE>0</ANGLE>
        <_SHAPE_>
          <gml:MultiPoint srsName="epsg:4326">
            <gml:pointMember>
              <gml:Point>
                <gml:coordinates>-171.086600653096667,12.363056573735747 </gml:coordinates>
              </gml:Point>
            </gml:pointMember>
          </gml:MultiPoint>
        </_SHAPE_>
      </points>
    </gml:featureMember>
  
    <!-- Lines -->
    <gml:featureMember>
      <lines>
        <FID>0</FID>
        <FNODE_>33424</FNODE_>
        <TNODE_>33425</TNODE_>
        <LPOLY_>0</LPOLY_>
        <RPOLY_>0</RPOLY_>
        <LENGTH>15.003275603900001</LENGTH>
        <MINTRANS_>30758</MINTRANS_>
        <MINTRANS_I>35207</MINTRANS_I>
        <FCODE>30</FCODE>
        <_SHAPE_>
          <gml:MultiLineString srsName="epsg:4326">
            <gml:lineStringMember>
              <gml:LineString>
                <gml:coordinates>-171.086204892704458,42.362313967208152 -71.086038515172532,62.362299983553427 -71.086038683883103,42.362289091480335 </gml:coordinates>
              </gml:LineString>
            </gml:lineStringMember>
          </gml:MultiLineString>
        </_SHAPE_>
      </lines>
    </gml:featureMember>
    <gml:featureMember>
      <lines>
        <FID>1</FID>
        <FNODE_>33415</FNODE_>
        <TNODE_>33411</TNODE_>
        <LPOLY_>0</LPOLY_>
        <RPOLY_>0</RPOLY_>
        <LENGTH>41.2014103996</LENGTH>
        <MINTRANS_>30759</MINTRANS_>
        <MINTRANS_I>35208</MINTRANS_I>
        <FCODE>30</FCODE>
        <_SHAPE_>
          <gml:MultiLineString srsName="epsg:4326">
            <gml:lineStringMember>
              <gml:LineString>
                <gml:coordinates>10.0,12.36 -10.0860,-12.36 32.08,9.36</gml:coordinates>
              </gml:LineString>
            </gml:lineStringMember>
          </gml:MultiLineString>
        </_SHAPE_>
      </lines>
    </gml:featureMember>
    <gml:featureMember>
      <lines>
        <FID>2</FID>
        <FNODE_>47628</FNODE_>
        <TNODE_>47570</TNODE_>
        <LPOLY_>0</LPOLY_>
        <RPOLY_>0</RPOLY_>
        <LENGTH>104.45658785099999</LENGTH>
        <MINTRANS_>44082</MINTRANS_>
        <MINTRANS_I>49344</MINTRANS_I>
        <FCODE>30</FCODE>
        <_SHAPE_>
          <gml:MultiLineString srsName="epsg:4326">
            <gml:lineStringMember>
              <gml:LineString>
                <gml:coordinates>171.0881,82.36 141.08,62.36 121.08,82.36</gml:coordinates>
              </gml:LineString>
            </gml:lineStringMember>
          </gml:MultiLineString>
        </_SHAPE_>
      </lines>
    </gml:featureMember>
  </QuickviewPresetResultSet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/gml/defaultAddLine.xml
  
  Index: defaultAddLine.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <gml:featureMember version="1.0.0"  xmlns:gml="http://www.opengis.net/gml">
    <lines>
      <FID>0</FID>
      <FNODE_>33424</FNODE_>
      <TNODE_>33425</TNODE_>
      <LPOLY_>0</LPOLY_>
      <RPOLY_>0</RPOLY_>
      <LENGTH>15.003275603900001</LENGTH>
      <MINTRANS_>30758</MINTRANS_>
      <MINTRANS_I>35207</MINTRANS_I>
      <FCODE>30</FCODE>
      <_SHAPE_>
        <gml:MultiLineString srsName="epsg:4326">
          <gml:lineStringMember>
            <gml:LineString>
              <gml:coordinates>-171.086204892704458,42.362313967208152 -71.086038515172532,62.362299983553427 -71.086038683883103,42.362289091480335 </gml:coordinates>
            </gml:LineString>
          </gml:lineStringMember>
        </gml:MultiLineString>
      </_SHAPE_>
    </lines>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/gml/defaultAddPoint.xml
  
  Index: defaultAddPoint.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <gml:featureMember version="1.0.0"  xmlns:gml="http://www.opengis.net/gml">
  
    <points>
      <FID>0</FID>
      <AREA>0.0</AREA>
      <PERIMETER>0.0</PERIMETER>
      <DTM_>202240</DTM_>
      <DTM_ID>202273</DTM_ID>
      <DTM_CODE>1</DTM_CODE>
      <DTM_ELEV>8.3000001907299996</DTM_ELEV>
      <POLYGONID>0</POLYGONID>
      <SCALE>1.0</SCALE>
      <ANGLE>0</ANGLE>
      <_SHAPE_>
        <gml:MultiPoint srsName="epsg:4326">
          <gml:pointMember>
            <gml:Point>
              <gml:coordinates>-71.08641266665947,42.363115828688542 </gml:coordinates>
            </gml:Point>
          </gml:pointMember>
        </gml:MultiPoint>
      </_SHAPE_>
    </points>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/gml/roads.xml
  
  Index: roads.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <gml:featureMember xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml">
    <topp:bc_roads fid="bc_roads.1">
      <topp:the_geom>
        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#27354">
          <gml:lineStringMember>
            <gml:LineString>
              <gml:coordinates decimal="." cs="," ts=" "></gml:coordinates>
            </gml:LineString>
          </gml:lineStringMember>
        </gml:MultiLineString>
      </topp:the_geom>
      <topp:LENGTH>0</topp:LENGTH>
    </topp:bc_roads>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/gml/states.xml
  
  Index: states.xml
  ===================================================================
  <?xml version="1.0"?>
  <gml:featureMember
    schemaLocation="http://www.openplans.org/topp http://localhost:8080/geoserver/wfs/DescribeFeatureType?typeName=topp:states http://www.opengis.net/wfs http://localhost:8080/geoserver/data/capabilities/wfs/1.0.0/WFS-basic.xsd"
    xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:gml="http://www.opengis.net/gml"
    topp="http://www.openplans.org/topp"
    wfs="http://www.opengis.net/wfs">
    <topp:states fid="states.2">
      <ttopp:he_geom>
        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
          <gml:polygonMember>
            <gml:Polygon>
              <gml:outerBoundaryIs>
                <gml:LinearRing>
                  <!--gml:coordinates ts=" " cs="," decimal=".">-77.008232,38.966557
  -76.911209,38.889988 -77.045448,38.78812 -77.035248,38.813915
  -77.045189,38.829365 -77.040405,38.838413 -77.039078,38.862431
  -77.067886,38.886101 -77.078949,38.9156 -77.122627,38.93206
  -77.042389,38.993431 </gml:coordinates-->
                  <gml:coordinates ts=" " cs="," decimal=".">-177.008232,38.966557
  -76.911209,38.889988 -77.045448,-38.78812
  </gml:coordinates>
                </gml:LinearRing>
              </gml:outerBoundaryIs>
            </gml:Polygon>
          </gml:polygonMember>
        </gml:MultiPolygon>
      </ttopp:he_geom>
      <topp:STATE_NAME>District of Columbia</topp:STATE_NAME>
      <topp:STATE_FIPS>11</topp:STATE_FIPS>
      <topp:SUB_REGION>S Atl</topp:SUB_REGION>
      <topp:STATE_ABBR>DC</topp:STATE_ABBR>
      <topp:LAND_KM>159.055</topp:LAND_KM>
      <topp:WATER_KM>17.991</topp:WATER_KM>
      <topp:PERSONS>606900.0</topp:PERSONS>
      <topp:FAMILIES>122087.0</topp:FAMILIES>
      <topp:HOUSHOLD>249634.0</topp:HOUSHOLD>
      <topp:MALE>282970.0</topp:MALE>
      <topp:FEMALE>323930.0</topp:FEMALE>
      <topp:WORKERS>229975.0</topp:WORKERS>
      <topp:DRVALONE>106694.0</topp:DRVALONE>
      <topp:CARPOOL>36621.0</topp:CARPOOL>
      <topp:PUBTRANS>111422.0</topp:PUBTRANS>
      <topp:EMPLOYED>303994.0</topp:EMPLOYED>
      <topp:UNEMPLOY>23442.0</topp:UNEMPLOY>
      <topp:SERVICE>65498.0</topp:SERVICE>
      <topp:MANUAL>22407.0</topp:MANUAL>
      <topp:P_MALE>0.466</topp:P_MALE>
      <topp:P_FEMALE>0.534</topp:P_FEMALE>
      <topp:SAMP_POP>72696.0</topp:SAMP_POP>
    </topp:states>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/gml/topp_cities.xml
  
  Index: topp_cities.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openplans.org/topp http://localhost:8080/geoserver/wfs/DescribeFeatureType?typeName=topp:tasmania_cities http://www.opengis.net/wfs http://localhost:8080/geoserver/data/capabilities/wfs/1.0.0/WFS-basic.xsd">
  
  	<gml:boundedBy>
  
  		<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  
  			<gml:coordinates decimal="." cs="," ts=" ">-180,-90 180,90</gml:coordinates>
  
  		</gml:Box>
  
  	</gml:boundedBy>
  
  	<gml:featureMember>
  
  		<topp:tasmania_cities fid="tasmania_cities.1">
  
  			<topp:the_geom>
  
  				<gml:MultiPoint srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  
  					<gml:pointMember>
  
  						<gml:Point>
  
  							<gml:coordinates decimal="." cs="," ts=" ">147.29100045,-42.85100182</gml:coordinates>
  
  						</gml:Point>
  
  					</gml:pointMember>
  
  				</gml:MultiPoint>
  
  			</topp:the_geom>
  
  			<topp:CITY_NAME>Hobart</topp:CITY_NAME>
  
  			<topp:ADMIN_NAME>Tasmania</topp:ADMIN_NAME>
  
  			<topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
  
  			<topp:STATUS>Provincial capital</topp:STATUS>
  
  			<topp:POP_CLASS>100,000 to 250,000</topp:POP_CLASS>
  
  		</topp:tasmania_cities>
  
  	</gml:featureMember>
  
  	<gml:featureMember>
  
  		<topp:tasmania_cities fid="tasmania_cities.2">
  
  			<topp:the_geom>
  
  				<gml:MultiPoint srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  
  					<gml:pointMember>
  
  						<gml:Point>
  
  							<gml:coordinates decimal="." cs="," ts=" ">-76,45</gml:coordinates>
  
  						</gml:Point>
  
  					</gml:pointMember>
  
  				</gml:MultiPoint>
  
  			</topp:the_geom>
  
  			<topp:CITY_NAME>Ottawa</topp:CITY_NAME>
  
  			<topp:ADMIN_NAME>Ontario</topp:ADMIN_NAME>
  
  			<topp:CNTRY_NAME>Canada</topp:CNTRY_NAME>
  
  			<topp:STATUS>National capital</topp:STATUS>
  
  			<topp:POP_CLASS> </topp:POP_CLASS>
  
  		</topp:tasmania_cities>
  
  	</gml:featureMember>
  
  	<gml:featureMember>
  
  		<topp:tasmania_cities fid="tasmania_cities.3">
  
  			<topp:the_geom>
  
  				<gml:MultiPoint srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  
  					<gml:pointMember>
  
  						<gml:Point>
  
  							<gml:coordinates decimal="." cs="," ts=" ">0,0</gml:coordinates>
  
  						</gml:Point>
  
  					</gml:pointMember>
  
  				</gml:MultiPoint>
  
  			</topp:the_geom>
  
  			<topp:CITY_NAME>In the water</topp:CITY_NAME>
  
  			<topp:ADMIN_NAME>Tasmania</topp:ADMIN_NAME>
  
  			<topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
  
  			<topp:STATUS>Provincial capital</topp:STATUS>
  
  			<topp:POP_CLASS> </topp:POP_CLASS>
  
  		</topp:tasmania_cities>
  
  	</gml:featureMember>
  
  </wfs:FeatureCollection>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/locations/Canada-42304.xml
  
  Index: Canada-42304.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <QuickviewPresetResultSet version="1.0.0"  xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../../lib/schemas/locations.xsd">
  	<gml:description>Canadian locations</gml:description>
  	<gml:name>CMB:Locations</gml:name>
  	<gml:boundedBy>
  		<gml:Null>missing</gml:Null>
  	</gml:boundedBy>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-------Canada</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-2200000,-712631 3072800,3840000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Alberta</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-1617000,131540 -731000,1506340</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------British Columbia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-2430000,222000 -1280000,2031000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Manitoba</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-555000,-207000 456400,1291278</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------New Brunswick</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>1876700,35800 2366000,404700</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Newfoundland and Labrador</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>1533000,586000 3041900,1597000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Northwest Territories</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-2423500,1223700 1450000,3830000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Nova Scotia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>2218000,-73300 2610396,327400</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Nunavut</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-474700,1109000 431500,2292700</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Ontario</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-201000,-779000 1766000,941000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Prince Edward Island</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>2261000,262700 2456000,379200</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Quebec</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>727689,-204354 2000229,1688524</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Saskatchewan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-1245000,16751 -323000,1295000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Yukon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-2392000,1542700 -1356000,2857000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  </QuickviewPresetResultSet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/locations/Canada.xml
  
  Index: Canada.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <QuickviewPresetResultSet version="1.0.0"  xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../../lib/schemas/locations.xsd">
  	<gml:description>Canadian locations</gml:description>
  	<gml:name>CMB:Locations</gml:name>
  	<gml:boundedBy>
  		<gml:Null>missing</gml:Null>
  	</gml:boundedBy>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-------Canada</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-141,42 -52,84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Alberta</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-120,49 -110,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------British Columbia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-139,48 -114,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>---------------Vancouver</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-123.224241434698,49.1981566626439 -123.022966859531,49.3168483739754</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Manitoba</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-102,49 -89,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------New Brunswick</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-69,45 -64,48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Newfoundland and Labrador</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-67.7,47 -52,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Northwest Territories</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-136.5,60 -101.5,79</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Nova Scotia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-66.3,43 -59.9,47</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Nunavut</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-121,52 -61,84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Ontario</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-95,42 -74,57</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>---------------Ottawa</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-75.8177,45.31929 -75.5897,45.46888</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>---------------Toronto</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-79.4881,43.61042 -79.2786,43.73698</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Prince Edward Island</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-64.5,45.9 -62,47</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Quebec</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-79.5,45 -57,63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>---------------Montreal</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-73.6193886688066,45.6127246118815 -73.4754304860602,45.7130175713401</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Saskatchewan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-110,49 -101.5,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Yukon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-141,60 -123.8,69.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  </QuickviewPresetResultSet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/data/locations/Global.xml
  
  Index: Global.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <QuickviewPresetResultSet version="1.0.0"  xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../../lib/schemas/locations.xsd">
  	<gml:description>This is the CMB preset zoom document</gml:description>
  	<gml:name>CMB:QuickViewPreset</gml:name>
  	<gml:boundedBy>
  		<gml:Null>missing</gml:Null>
  	</gml:boundedBy>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Afghanistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>59.9,28.66 75.65,39.11</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Africa</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-20.2,-37.6 53.4,35.75</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Albania</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>19.36,39.42 21.39,42.71</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Algeria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-9.47,17.94 13.19,38.14</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Angola</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>11.31,-18.68 24.97,-3.84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Antarctic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-90 180,-66</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Antarctica</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-90 180,-62.83</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Arctic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,66 180,90</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Argentina</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-74.97,-56.71 -51.76,-20.25</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Armenia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>43.53,38.68 47.07,41.48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Asia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>40,-10 180,83.5</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Australia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>111.22,-45.73 155.72,-8.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Austria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>9.27,45.99 17.93,49.38</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Azerbaijan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>44.58,38.04 50.96,42.2</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bangladesh</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>87.95,20.75 93.07,26.62</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Belgium</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>2.54,49.31 6.69,51.69</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Belize</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-89.18,15.78 -87.78,18.64</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Benin</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>0.74,5.97 4.34,12.66</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bhutan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>88.8,26.54 92.37,28.46</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bolivia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-70.05,-23.63 -56.72,-9.13</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bosnia and Herzegovina</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>15.76,42.38 20.02,45.45</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Botswana</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>19.57,-27.41 29.94,-17.32</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Brazil</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-75.64,-35.81 -32.74,7.12</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Brunei</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>114.22,3.96 115.42,5.09</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bulgaria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>22.19,40.86 29.02,44.59</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Burkina Faso</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-5.72,9.19 2.98,15.54</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Burma</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>91.41,9.22 102.13,29.34</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Burundi</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>28.98,-4.85 31.17,-2.35</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Byelarus</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>22.91,50.82 33.38,56.65</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Cambodia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>102.28,10.07 107.98,14.86</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Cameroon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.22,1.06 16.85,13.65</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Canada</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-145.27,37.3 -48.11,87.61</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Caribbean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-91.4,27.36 -55.4,6.48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Central African Republic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.96,1.5 28.11,11.67</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Central America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-94.1,21.8 -75.8,6.61</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Chad</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>12.88,6.67 24.97,24.19</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Chile</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-77.16,-56.79 -64.9,-15.72</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>China</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>70.83,15.06 137.97,56.58</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Colombia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-79.69,-5 -66.15,13.28</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Congo</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>10.93,-5.41 19.19,3.98</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Costa Rica</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-85.83,7.9 -82.18,11.38</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Croatia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.47,42.09 19.92,46.84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Cuba</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-85.03,19.36 -73.44,23.68</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Cyprus</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>32.23,34.44 34.78,35.78</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Czech Republic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>12.13,48.23 19.38,51.42</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Denmark</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.02,54.68 12.89,58</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Djibouti</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>41.89,10.78 43.77,12.81</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Dominican Republic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-71.87,17.54 -67.99,20.12</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>East Pacific Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,64.8 -72.7,-75.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ecuador</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-81.08,-5.35 -74.68,1.72</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Egypt</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>24.29,21.29 37.61,32.14</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>El Salvador</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-90.05,13.07 -87.41,14.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Equatorial Guinea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.39,0.76 11.59,3.82</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Eritrea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>36.31,12 43.58,18.41</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Estonia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>23.3,57.29 28.59,59.75</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ethiopia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>32.49,2.63 48.85,15.56</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Europe</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-25.1,71.3 35,34.9</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Finland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.46,59.3 32.14,70.44</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>France</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-5.29,40.65 10.4,51.82</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>French Guiana</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-54.37,1.84 -51.23,5.89</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Gabon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.71,-4.23 15.01,2.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Gambia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-16.71,13.02 -13.66,13.96</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Germany</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>5.68,46.86 15.68,55.41</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ghana</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-3.31,4.39 1.7,11.47</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Greece</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>19.99,34.62 27.19,42.01</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Greenland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-75.34,56.78 -9.36,86.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Guatemala</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-92.24,13.59 -87.87,18.06</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Guinea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-15.19,6.77 -6.87,13.02</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Guinea-Bissau</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-16.51,10.97 -13.34,12.8</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Guyana</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-61.41,0.81 -56.12,8.79</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Haiti</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-74.38,17.88 -71.34,20.1</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Honduras</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-89.47,12.75 -82.92,16.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Hungary</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>16.12,45.44 23.57,48.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Iceland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-24.55,62.81 -12.79,67.01</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>India</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>66.79,6.58 99.01,36.96</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Indian Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>22.3,-55.4 119.5,25.2</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Indonesia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>93.11,-12.65 143.45,7.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Iran</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>43.31,24.08 64.42,40.73</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Iraq</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>38.47,28.5 49.25,37.84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ireland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-10.52,51.23 -5.62,55.49</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Israel</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>34.17,29.25 36.09,33.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Italy</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>6.11,36.15 19.33,47.71</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ivory Coast</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-8.64,4.03 -2.01,10.96</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Jamaica</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-78.22,17.72 -76,18.63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Japan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>128.74,30.1 146.46,46.26</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Jordan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>34.97,28.87 39.75,33.44</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Kazakhstan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>44.73,38.62 89.65,57.49</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Kenya</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>33,-5.3 42.44,5.07</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Democratic People's Republic of Korea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>124.02,43.29 37.55,130.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Republic of Korea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>125.95,38.76 33.06,129.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Kuwait</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>46.62,28.34 48.74,30</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Kyrgyzstan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>69.01,38.7 81.03,43.77</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Laos</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>99.77,13.47 108.1,22.98</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Latvia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.76,55.32 28.76,58.44</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Lebanon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>35.09,32.84 36.79,34.63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Lesotho</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>27.16,-30.89 29.76,-28.59</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Liberia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-11.47,4.16 -6.95,8.66</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Libya</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.79,18.7 26.1,33.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Lithuania</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.86,53.6 27.25,56.73</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Luxembourg</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>5.9,49.42 6.77,50.21</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Macedonia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.62,40.62 23.27,42.48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Madagascar</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>42.83,-26.31 51.38,-11.58</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Malawi</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>32.55,-17.51 36.46,-9.26</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Malaysia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>99.4,-0.2 120.19,7.86</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mali</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-12.77,9.25 5.27,25.83</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mauritania</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-17.47,14.21 -4.04,27.81</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mexico</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-118.48,13.05 -85.18,34.17</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Middle East</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>25,10.7 59.7,36.1</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Moldova</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>26.64,45.31 30.47,48.64</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mongolia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>86.47,40 121.62,53.65</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Montenegro</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>18.56,41.77 20.67,43.64</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Morocco</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-13.52,26.96 -0.28,36.48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mozambique</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>29.67,-27.82 41.89,-9.63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Namibia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>11.32,-29.61 25.86,-16.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Nepal</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>79.9,26 88.84,30.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Netherlands</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>3.54,50.56 7.62,53.59</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>New Hampshire</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-72.68,42.57 -70.58,45.43</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>New Jersey</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-75.69,38.8 -73.78,41.47</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>New Mexico</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-109.35,31.04 -102.7,37.3</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>New Zealand</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>166.05,-47.31 179.41,-33.89</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Nicaragua</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-87.7,10.55 -82.87,15.24</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Niger</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-0.39,10.95 16.95,24.28</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Nigeria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>2.33,3.72 15.34,14.4</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>North America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-168.5,18 -50.4,85.7</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>North Atlantic Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-82,0 12,80</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Northern Temperate</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,23 180,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Norway</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>3.88,56.69 32.56,81.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Oman</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>51.53,16.19 60.52,26.73</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Pakistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>60.18,22.94 78.66,37.86</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Panama</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-83.06,6.9 -76.63,9.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Papua New Guinea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>140.37,-11.3 153.05,-2.2</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Paraguay</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-62.83,-27.85 -53.6,-18.87</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Peru</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-82.13,-19.35 -67.52,0.79</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Philippines</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>116.68,4.85 127.23,19.22</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Poland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.77,48.57 24.85,55.24</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Portugal</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-9.6,36.75 -5.65,42.36</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Qatar</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>50.97,24.33 51.89,26.17</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Romania</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.05,43.29 30.38,48.76</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Russia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>25,23.21 180,71</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Rwanda</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>28.9,-3.01 31.2,-1.03</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Saudi Arabia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>33.9,14.01 57.3,33.22</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Senegal</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-17.53,12.02 -10.89,17.14</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Serbia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>18.8,41.66 23.35,46.39</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Sierra Leone</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-13.16,6.71 -10.02,10.09</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Slovakia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>16.84,47.61 23.06,49.93</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Slovenia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.39,45.28 16.87,47.06</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Somalia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>40.53,-2.55 52.14,12.66</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>South Africa</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.68,-35.9 33.98,-21.27</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>South America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-84.9,-57.6 -32.4,13.7</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>South Atlantic Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-67,-55.4 23,0</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Southern Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-77 180,-32</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Southern Temperate</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-60 180,-23</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Spain</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-9.69,35.4 3.98,44.38</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Sri Lanka</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>79.69,5.76 82.26,9.89</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Sudan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>21.06,2.6 39.77,22.86</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Suriname</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-58.01,1.53 -53.42,6.23</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Swaziland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>30.93,-27.52 32.45,-25.72</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Sweden</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>10.56,54.63 24.84,69.68</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Switzerland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>5.92,45.66 10.84,48.02</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Syria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>35.36,31.84 43.11,37.69</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Taiwan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>119.99,21.78 122.14,25.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Tajikistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>67.34,36.34 75.59,41.46</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Tanzania United Republic of</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>,-0.54 28.96,41.23</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Thailand</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>96.83,4.8 106.42,21.22</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Togo</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-0.09,5.85 2.21,11.33</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Trinidad</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-61.88,10.01 -60.86,10.89</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Tropics</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-23 180,23</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Tunisia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>7.38,29.87 12.03,37.65</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Turkey</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>25.29,34.91 45.94,43</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Turkmenistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>52.05,34.56 67.66,43.46</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Uganda</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>29.45,-1.82 35.52,4.32</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ukraine</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>21.4,43.61 41.24,53.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>United Arab Emirates</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>51.06,21.82 56.87,26.25</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>United Kingdom</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-8.41,49.49 2.39,59.07</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>United States</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,13.71 -61.48,76.63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Uruguay</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-58.46,-35.26 -52.77,-29.97</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Uzbekistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>55.44,36.08 74.31,46.46</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Venezuela</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-73.81,-0.11 -58.91,12.92</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Vietnam</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>101.43,7.75 110.25,24.05</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Virginia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-84.1,36.12 -74.82,39.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Western Sahara</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-17.23,20.87 -8.01,28</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Yemen</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>42.45,12.12 53.74,19.51</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Zaire</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>11.45,-14.4 32.4,6.28</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Zambia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>21.55,-18.7 34.45,-7.69</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Zimbabwe</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>25.11,-22.93 33.65,15.22</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  </QuickviewPresetResultSet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/forms/forms.xml
  
  Index: forms.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="simpleTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  
  	<models>
  		<Model id="mainMap">
  			<!--defaultModelUrl>config/simpleConfig.xml</defaultModelUrl-->
  			<defaultModelUrl>../data/context/atlasWorld.xml</defaultModelUrl>
  			<widgets>
  				<XmlForm id="xmlForm"/>
  			</widgets>
  		</Model>
  		<Model id="schema">
  			<defaultModelUrl>../../lib/schemas/context.xsd</defaultModelUrl>
  			<widgets>
  				<XmlForm id="xmlSchemaForm">
  					<stylesheet>../../lib/widget/XmlSchemaForm.xsl</stylesheet>
  				</XmlForm>
  			</XmlForm>
  		</Model>
  	</models>
  	<skinDir>../../lib/skin/default</skinDir>
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/forms/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Mapbuilder Demo</title>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='forms.xml';
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <div id="xmlForm"></div>
      <hr/>
      <div id="xmlSchemaForm"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/GeoRSSListing.xsl
  
  Index: GeoRSSListing.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: presents the list of events in a GeoRSS
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:rss="http://purl.org/rss/1.0/" 
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="targetModelId"/>
    <xsl:param name="widgetId"/>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/rdf:RDF ">
      <table>
        <th><xsl:value-of select="rss:channel/rss:title"/></th>
        <xsl:apply-templates select="rss:item"/>
      </table>
    </xsl:template>
  
    <xsl:template match="rss:item">
      <xsl:variable name="fid"><xsl:value-of select="@id"/></xsl:variable>
      <xsl:variable name="x"><xsl:value-of select="geo:long"/></xsl:variable>
      <xsl:variable name="y"><xsl:value-of select="geo:lat"/></xsl:variable>
      <xsl:variable name="link"><xsl:value-of select="rss:link"/></xsl:variable>
      <xsl:variable name="time"><xsl:value-of select="dc:date"/></xsl:variable>
   
      <tr onmouseover="config.objects.{$modelId}.setParam('highlightFeature','{$fid}')" onmouseout="config.objects.{$modelId}.setParam('dehighlightFeature','{$fid}')">
        <td><xsl:value-of select="dc:date"/></td>
        <td>
          <a href="{$link}"><xsl:value-of select="rss:title"/></a>
          - <xsl:value-of select="rss:description"/>
        </td>
      </tr>
    </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/GeoRSSListing2.xsl
  
  Index: GeoRSSListing2.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: presents the list of events in a GeoRSS
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:georss="http://georss.org/rss" 
    xmlns:gml="http://www.opengis.net/gml/3.1.1" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:rss="http://purl.org/rss/1.0/" 
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="ISO-8859-1" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="targetModelId"/>
    <xsl:param name="widgetId"/>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/atom:feed">
  <table border="0" cellpadding="0" cellspacing="0" width="100%">	
  	<tbody><tr><td colspan="2"><img src="spacer.gif" border="0" height="30" width="1"/></td></tr>
  
  <tr>
  	<td colspan="2" class="calHeader">
  		<xsl:value-of select="/atom:feed/atom:title"/>:
  		<br/>
      <br/>
  	</td>
  </tr>
  
  <xsl:apply-templates select="atom:entry"/>
      </tbody></table>
    </xsl:template>
  
    <xsl:template match="atom:entry">
      <xsl:variable name="fid"><xsl:value-of select="@id"/></xsl:variable>
      <xsl:variable name="coords"><xsl:value-of select="georss:where/gml:Point/gml:pos"/></xsl:variable>
      <xsl:variable name="link"><xsl:value-of select="atom:link/@href"/></xsl:variable>
      <xsl:variable name="time"><xsl:value-of select="atom:updated"/></xsl:variable>
      <xsl:variable name="source"><xsl:value-of select="atom:source"/></xsl:variable>
  <tr>
  	<td class="caldate" nowrap="nowrap" valign="top" width="33%"> <img src="../../lib/skin/blue/images/yellow_bullet.gif" alt="" border="0"/>&#160;<a name="June13"><xsl:value-of select="$time"/></a>&#160;&#160;&#160;&#160;</td>
  	<td class="caleventtitle" valign="top" onmouseover="config.objects.{$modelId}.setParam('highlightFeature','{$fid}')" onmouseout="config.objects.{$modelId}.setParam('dehighlightFeature','{$fid}')">
  		<xsl:value-of select="atom:title"/>
  	</td>
  </tr>
  <tr>
  	<td>&#160;</td>
  	<td class="caltime" onmouseover="config.objects.{$modelId}.setParam('highlightFeature','{$fid}')" onmouseout="config.objects.{$modelId}.setParam('dehighlightFeature','{$fid}')">
       <i>
   	     Address - see marker on map
  		</i>
  		</td>
  	</tr>
  <tr>
  	<td>&#160;</td>
  </tr>
  <tr>
  	<td>&#160;</td>
  	<td class="caldescription">
  	<p><xsl:value-of select="atom:content"/></p>
  	</td>
  </tr>
  <tr onmouseover="config.objects.{$modelId}.setParam('highlightFeature','{$fid}')" onmouseout="config.objects.{$modelId}.setParam('dehighlightFeature','{$fid}')">
  	<td>&#160;</td>
  	<td class="caldescription">
    	<p><a href="{$link}" class="caldescription">Learn more></a></p><br/>
  	</td>
  </tr>
  
  </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/build.xml
  
  Index: build.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!--*************************************************************************
  Filename        :   build.xml
  Project         :   mapbuilder
  Document Type   :   XML
  Purpose         :   build file for ant tool
  
  Author     Date            Description
  M.Adair    17-Dec-2001     initial version copied from quicklook
  
  $Id$
  ***************************************************************************--><!--
       General purpose build script for web applications and web services,
       including enhanced support for deploying directly to a Tomcat 5
       based server.
  
       This build script assumes that the source code of your web application
       is organized into the following subdirectories underneath the source
       code directory from which you execute the build script:
  
          docs                 Static documentation files to be copied to
                               the "docs" subdirectory of your distribution.
  
          src                  Java source code (and associated resource files)
                               to be compiled to the "WEB-INF/classes"
                               subdirectory of your web applicaiton.
  
          web                  Static HTML, JSP, and other content (such as
                               image files), including the WEB-INF subdirectory
                               and its configuration file contents.
  
  -->
  <!-- A "project" describes a set of targets that may be requested
       when Ant is executed.  The "default" attribute defines the
       target which is executed if no specific target is requested,
       and the "basedir" attribute defines the current working directory
       from which Ant executes the requested task.  This is normally
       set to the current working directory.
  -->
    <project basedir=".." default="deploy-tomcat" name="mapbuilder">
  
  <!-- ===================== Property Definitions =========================== -->
  <!--
    Each of the following properties are used in the build script.
    Values for these properties are set by the first place they are
    defined, from the following list:
  
    * Definitions on the "ant" command line (ant -Dfoo=bar compile).
  
    * Definitions from a "build.properties" file in the top level
      source directory of this application.
  
    * Definitions from a "build.properties" file in the developer's
      home directory.
  
    * Default definitions in this build.xml file.
  
    You will note below that property values can be composed based on the
    contents of previously defined properties.  This is a powerful technique
    that helps you minimize the number of changes required when your development
    environment is modified.  Note that property composition is allowed within
    "build.properties" files as well as in the "build.xml" script.
  -->
    <property file="build.properties"/>
    <property file="${user.home}/build.properties"/>
  
  <!-- ==================== File and Directory Names ======================== -->
  <!--
  
    These properties generally define file and directory names (or paths) that
    affect where the build process stores its outputs.
  
    app.name             Base name of this application, used to
                         construct filenames and directories.
                         Defaults to "myapp".
  
    app.path             Context path to which this application should be
                         deployed (defaults to "/" plus the value of the
                         "app.name" property).
  
    app.version          Version number of this iteration of the application.
  
    build.home           The directory into which the "prepare" and
                         "compile" targets will generate their output.
                         Defaults to "build".
  
    catalina.home        The directory in which you have installed
                         a binary distribution of Tomcat 5.  This will
                         be used by the "deploy" target.
  
    dist.home            The name of the base directory in which
                         distribution files are created.
                         Defaults to "dist".
  
    manager.password     The login password of a user that is assigned the
                         "manager" role (so that he or she can execute
                         commands via the "/manager" web application)
  
    manager.url          The URL of the "/manager" web application on the
                         Tomcat installation to which we will deploy web
                         applications and web services.
  
    manager.username     The login username of a user that is assigned the
                         "manager" role (so that he or she can execute
                         commands via the "/manager" web application)
  
  -->
  
    <property environment="env"/>
    <property name="app.name" value="mapbuilder"/>
    <property name="pack.name" value="mapbuilder-lib"/>
    <property name="app.path" value="/${app.name}"/>
    <property name="app.version" value="0.4-alpha"/>
    <property name="catalina.home" value="${env.CATALINA_HOME}"/> <!-- ensure you have this environment var set -->
    <property name="build.home" value="${basedir}/build"/>
    <property name="compress.home" value="${basedir}/compressBuild"/>
    <property name="deploy.home" value="${catalina.home}/webapps/${app.name}"/>
    <property name="dist.home" value="${basedir}/dist"/>
    <property name="docs.home" value="${build.home}/docs"/>
    <property name="dev.home" value="${basedir}/."/>
    <property name="context.home" value="${dev.home}/server/java"/>
    <property name="src.home" value="${context.home}/src"/>
  
  
  <!-- ==================== External Dependencies =========================== -->
  
  <!--
    Use property values to define the locations of external JAR files on which
    your application will depend.  In general, these values will be used for
    two purposes:
    * Inclusion on the classpath that is passed to the Javac compiler
    * Being copied into the "/WEB-INF/lib" directory during execution
      of the "deploy" target.
  
    Because we will automatically include all of the Java classes that Tomcat 5
    exposes to web applications, we will not need to explicitly list any of those
    dependencies.  You only need to worry about external dependencies for JAR
    files that you are going to include inside your "/WEB-INF/lib" directory.
  -->
  
  <!--
    <property name="foo.jar"  value="$/lib/foo.jar"/>
  -->
    <property name="httpClient.jar"  value="${context.home}/lib/commons-httpclient-2.0.1.jar"/>
    <property name="logging.jar"  value="${context.home}/lib/commons-logging.jar"/>
    <property name="log4j.jar"  value="${context.home}/lib/log4j-1.2.8.jar"/>
    <property name="jstl.jar"  value="${context.home}/lib/jstl.jar"/>
    <property name="standard.jar"  value="${context.home}/lib/standard.jar"/>
  
  
  <!-- ==================== Prepare Target ================================== -->
  
  <!--
  
    The "prepare" target is used to create the "build" destination directory,
    and copy the static contents of your web application to it.  If you need
    to copy static files from external dependencies, you can customize the
    contents of this task.
  
    Normally, this task is executed indirectly when needed.
  
  -->
  
    <target name="prepare">
  
      <!-- Create build directories as needed -->
      <mkdir dir="${build.home}"/>
  
      <!-- Copy static content of the mapbuilder project  -->
      <copy todir="${build.home}">
        <fileset dir="${basedir}"
          includes="demo/** lib/** docs/** server/php/** CHANGES LICENSE LGPL README index.html"/>
      </copy>
      <copy file="${basedir}/server/php/mapbuilderConfig.xml" todir="${build.home}/lib" overwrite="true"/>
      
    </target>
  
    <target name="prepare-tomcat" depends="prepare">
  
      <!-- Create build directories as needed -->
      <mkdir dir="${build.home}"/>
      <mkdir  dir="${build.home}/WEB-INF"/>
      <mkdir  dir="${build.home}/WEB-INF/classes"/>
  
      <!-- Copy static content of this web application -->
      <copy todir="${build.home}">
        <fileset dir="${context.home}/web"/>
      </copy>
      <copy file="${context.home}/web/lib/mapbuilderConfig.xml" todir="${build.home}/lib" overwrite="true"/>
  
      <!-- set the global server config file to the JSP version -->   
      <echo message="setting mbServerConfig URL to JSP version"/>
      <delete file="${build.home}/lib/Mapbuilder.js.temp" quiet="true"/>
      <copy file="${basedir}/lib/Mapbuilder.js" todir="${build.home}/lib" overwrite="true"/>
      <replace file="${build.home}/lib/Mapbuilder.js" token="mapbuilderConfig.xml" value="mapbuilderConfig.jsp"/>
          
      <!-- copy all files from etc to WEB-INF; includes tld files and scaf tokens-->   
      <copy todir="${build.home}/WEB-INF">
      	<fileset dir="${context.home}/etc">
        </fileset>
      </copy>
  
      <!-- Copy external dependencies as required -->
      <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
      <mkdir  dir="${build.home}/WEB-INF/lib"/>
  <!--
      <copy todir="${build.home}/WEB-INF/lib" file="${foo.jar}"/>
  -->
      <copy todir="${build.home}/WEB-INF/lib" file="${httpClient.jar}"/>
      <copy todir="${build.home}/WEB-INF/lib" file="${logging.jar}"/>
      <copy todir="${build.home}/WEB-INF/lib" file="${log4j.jar}"/>
      <copy todir="${build.home}/WEB-INF/lib" file="${jstl.jar}"/>
      <copy todir="${build.home}/WEB-INF/lib" file="${standard.jar}"/>
      
    </target>
  
  
  <!-- ==================== All Target ====================================== -->
  
  <!--
  
    The "all" target is a shortcut for running the "clean" target followed
    by the "compile" target, to force a complete recompile.
  
  -->
  
    <target depends="clean,compile" description="Clean build and dist directories, then compile" name="all"/>
  
  
  
  <!-- ==================== Clean Target ==================================== -->
  
  <!--
  
    The "clean" target deletes any previous "build" and "dist" directory,
    so that you can be ensured the application can be built from scratch.
  
  -->
  
    <target description="Delete old build and dist directories" name="clean">
      <delete dir="${build.home}"/>
      <delete dir="${dist.home}"/>
      <delete dir="${compress.home}"/>
    </target>
  
  
  
  <!-- ==================== Clean Tomcat ==================================== -->
  
    <target description="Delete old build and dist directories" name="clean-tomcat">
      <delete dir="${deploy.home}"/>
    </target>
  
  
  
  <!-- ==================== Documentation =================================== -->
  
    <target description="Create documentation" name="docs">
    
      <mkdir dir="${build.home}/docs"/>
      
      <!-- style the design docs from the XBook document -->
      <!--style in="${basedir}/design/mapbuilder-lib.xml" style="/usr/share/sgml/docbook/xsl-stylesheets/html/docbook.xsl" out="${build.home}/docs/design/index.html"/-->
      
      <echo message="os name=${os.name}"/>
      <exec executable="${basedir}/bin/publish.sh" os="linux">
      </exec>
    </target>
  
  <!--  ==================== Compilation Control Options ==================== -->
  
  <!--
    These properties control option settings on the Javac compiler when it
    is invoked using the <javac> task.
  
    compile.debug        Should compilation include the debug option?
    compile.deprecation  Should compilation include the deprecation option?
    compile.optimize     Should compilation include the optimize option?
  -->
    <property name="compile.debug"       value="false"/>
    <property name="compile.deprecation" value="false"/>
    <property name="compile.optimize"    value="true"/>
  
  
  <!-- ==================== External Dependencies =========================== -->
  <!--
    Use property values to define the locations of external JAR files on which
    your application will depend.  In general, these values will be used for
    two purposes:
    * Inclusion on the classpath that is passed to the Javac compiler
    * Being copied into the "/WEB-INF/lib" directory during execution
      of the "deploy" target.
  
    Because we will automatically include all of the Java classes that Tomcat 5
    exposes to web applications, we will not need to explicitly list any of those
    dependencies.  You only need to worry about external dependencies for JAR
    files that you are going to include inside your "/WEB-INF/lib" directory.
  -->
  
  <!--
    <property name="foo.jar"     value="${context.home}/lib/foo.jar"/>
  -->
  
  <!-- ==================== Compilation Classpath =========================== -->
  <!--
    Rather than relying on the CLASSPATH environment variable, Ant includes
    features that makes it easy to dynamically construct the classpath you
    need for each compilation.  The example below constructs the compile
    classpath to include the servlet.jar file, as well as the other components
    that Tomcat makes available to web applications automatically, plus anything
    that you explicitly added.
  -->
  
    <path id="compile.classpath">
  
      <!-- Include all JAR files that will be included in /WEB-INF/lib -->
      <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
  <!--
      <pathelement location="${foo.jar}"/>
  -->
      <pathelement location="${httpClient.jar}"/>
      <pathelement location="${logging.jar}"/>
      <pathelement location="${log4j.jar}"/>
  
      <!-- Include all elements that Tomcat exposes to applications -->
      <pathelement location="${catalina.home}/common/classes"/>
      <fileset dir="${catalina.home}/common/endorsed">
        <include name="*.jar"/>
      </fileset>
      <fileset dir="${catalina.home}/common/lib">
        <include name="*.jar"/>
      </fileset>
      <pathelement location="${catalina.home}/shared/classes"/>
      <fileset dir="${catalina.home}/shared/lib">
        <include name="*.jar"/>
      </fileset>
  
    </path>
  
  <!-- ==================== Compile Target ================================== -->
  <!--
    The "compile" target transforms source files (from your "src" directory)
    into object files in the appropriate location in the build directory.
    This example assumes that you will be including your classes in an
    unpacked directory hierarchy under "/WEB-INF/classes".
  -->
  
    <target name="compile" depends="prepare-tomcat" description="Compile Java sources">
  
      <!-- Compile Java classes as necessary -->
      <mkdir    dir="${build.home}/WEB-INF/classes"/>
      <javac srcdir="${src.home}"
            destdir="${build.home}/WEB-INF/classes"
              debug="${compile.debug}"
        deprecation="${compile.deprecation}"
           optimize="${compile.optimize}">
          <classpath refid="compile.classpath"/>
      </javac>
  
      <!-- Copy application resources -->
      <copy  todir="${build.home}/WEB-INF/classes">
        <fileset dir="${src.home}" excludes="**/*.java"/>
      </copy>
  
    </target>
  
  
  <!-- =================== Compress Target ================================== -->
  
    <target description="Compress JS and XSL files" name="compress" depends="prepare">
      <copy todir="${compress.home}">
        <fileset dir="${build.home}"/>
      </copy>
  
      <exec executable="${basedir}/bin/compress.sh" os="linux"/>
    </target>
  
  
  <!-- ==================== Deploy ========================================== -->
  <!--
    The "deploy" target synchronizes the build directory with the Java Servlet
    container directory.  This could also be done by copying in the war file.
  -->
    <target name="deploy-tomcat"
      description="Copy build directory to $CATALINA_HOME"
      depends="compile">
      <mkdir dir="${deploy.home}"/>
      <copy todir="${deploy.home}">
        <fileset dir="${build.home}">
        </fileset>
      </copy>
    </target>
  
  
  
  <!-- ==================== Dist Target ===================================== -->
  <!--
  
    The "dist" target creates a binary distribution of your application
    in a directory structure ready to be archived in a tar.gz or zip file.
    Note that this target depends on two others:
  
    * "compile" so that the entire web application (including external
      dependencies) will have been assembled
  -->
  
    <target
      name="dist"
      description="Create binary distribution"
      depends="clean,docs">
      
      <!-- first do the apache distribution -->
      <antcall target="dist-apache"/>
      
      <!-- remove the compress directory, recreated in tomcat distribution -->
      <delete dir="${compress.home}"/>
      
      <!-- do the tomcat distribution -->
      <antcall target="dist-tomcat"/>
  
    </target>
  
  <!--
    The "dist-tomcat" target creates the war file distribution of your application
    only without creating all docs, zips, etc.  This is to be used for deploying
    your application to a produciton server.
  -->
    <target
      name="dist-tomcat"
      description="Create binary distribution"
      depends="compile,compress"
      >
      
      <mkdir dir="${dist.home}"/>
      
      <!-- Create source WAR file -->
      <jar jarfile="${dist.home}/${app.name}.war" basedir="${compress.home}"/>
  
      <!-- zip up the application WAR file -->
      <zip destfile="${dist.home}/${pack.name}-${app.version}-war.zip" update="true">
        <zipfileset file="${dist.home}/${app.name}.war"/>
      </zip>
    </target>
  
  <!--
    The "dist-apache" target creates the zip file distribution for the Apache/PHP
    environment.
  -->
    <target
      name="dist-apache"
      description="Create binary distribution"
      depends="prepare,compress"
      >
  
      <mkdir dir="${dist.home}"/>
  
      <!-- Create source zip file -->
      <zip destfile="${dist.home}/${pack.name}-src-${app.version}.zip" update="true">
        <zipfileset dir="${basedir}" excludes="build/** dist/** compressBuild/** client/** design/**" prefix="mapbuilder"/>
      </zip>
      
      <!-- Create application zip file -->
      <zip destfile="${dist.home}/${pack.name}-${app.version}.zip" update="true">
        <zipfileset dir="${compress.home}" prefix="mapbuilder"/>
      </zip>
  
    </target>
  
  </project>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/cambridge.xml
  
  Index: cambridge.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  
  <ViewContext xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:wmc="http://www.opengis.net/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd" id="eos_data_gateways" version="1.0.0">
  
  <General>
  
  <Window height="400" width="400"/>
  
  <Title>GEORSS</Title>
  
  <BoundingBox SRS="EPSG:4326" minx="-71.1606" miny="42.3517" maxx="-71.069" maxy="42.4045" />
  
  <!--BoundingBox SRS="EPSG:26986" minx="228000" miny="899000" maxx="236000" maxy="907000" /-->
  
  </General>
  
  <!--http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map&VERSION=1.1.0&REQUEST=getmap&SRS=EPSG:26986&WIDTH=500&HEIGHT=500&LAYERS=towns&BBOX=228000,899000,236000,907000&EXCEPTIONS=application/vnd.ogc.se_inimage&TRANSPARENT=TRUE&FORMAT=image/png-->
  
  <LayerList>
  
    <Layer queryable="0" hidden="0">
  
     <Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
  
      <OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/ows1/cubeserv/cubeserv.cgi"/>
  
     </Server>
  
     <Name>DOQ:TerraService</Name>
  
     <Title>USGS Digital Ortho-Quadrangles</Title>
  
     <SRS>EPSG:4326</SRS>
  
     <FormatList>
  
      <Format current="1">image/gif</Format>
  
     </FormatList>
  
     <StyleList>
  
     <Style current="1">
  
      <Name>default</Name>
  
      <Title>default</Title>
  
     </Style>
  
     </StyleList>
  
    </Layer>
  
  <Layer queryable="0" hidden="1">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>towns</Name>
  
  <Title>MA Town Boundaries</Title>
  
  <Abstract>MA Town Boundaries</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>townsoutline</Name>
  
  <Title>MA Town Boundary Outlines</Title>
  
  <Abstract>MA Town Boundary Outlines</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>hydro</Name>
  
  <Title>Rivers and Streams</Title>
  
  <Abstract>Lakes and Ponds, 1:2,000,000 USGS</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>ocean</Name>
  
  <Title>Ocean</Title>
  
  <Abstract>Ocean clipping area from MassGIS</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>roads</Name>
  
  <Title>Cambridge roads</Title>
  
  <Abstract>Cambridge roads</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>MHDRoads</Name>
  
  <Title>MHDRoads</Title>
  
  <Abstract/>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  <Layer queryable="0" hidden="1">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>events</Name>
  
  <Title>Events</Title>
  
  <Abstract>Cambridge events from cambridgema.gov</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  </LayerList>
  
  </ViewContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="simpleTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>cambridge.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<Loading id="loading">
          </Loading>
          <Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
          </Loading2>
  				<AoiBoxDHTML id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/Null.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  			</tools>
  		</Context>
  		<GeoRSS id="geoRSS">
  			<defaultModelUrl>http://crcp-blogger.mit.edu/geoblogger/rss.php</defaultModelUrl>
  			<!--scriptFile>/geoRSS/GeoRSS.js</scriptFile-->
  			<!-- defaultModelUrl>geoRSS.xml</defaultModelUrl -->
  
  			<widgets>
  				<Widget id="eventsListing">
  					<targetModel>mainMap</targetModel>
  					<stylesheet>GeoRSSListing.xsl</stylesheet>
  				</Widget>
  				<GmlPointRenderer id="pointRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<normalImage>/images/MarkerA.gif</normalImage>
  					<highlightImage>/images/MarkerB.gif</highlightImage>
  				</GmlPointRenderer>
  			</widgets>
  			<!--tools>
          <ZoomToAoi id="locationsZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools-->
  			<namespace>xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:rss='http://purl.org/rss/1.0/' xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:syn='http://purl.org/rss/1.0/modules/syndication/' xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'</namespace>
  			<nodeSelectXpath>/rdf:RDF/rss:item</nodeSelectXpath>
  
  		</GeoRSS>
  	</models>
  	<widgets>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/config2.xml
  
  Index: config2.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="simpleTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>cambridge.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<!-- fixedWidth>216</fixedWidth-->
  				</MapPane>
  				<Loading id="loading">
          </Loading>
          <Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
          </Loading2>
  				<AoiBoxDHTML id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>/mapbuilder/lib/widget/Null.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  			</tools>
  		</Context>
  		<GeoRSS id="geoRSS">
        <defaultModelUrl>http://georss.mit.edu/cambridgeevents.php</defaultModelUrl>
        <!-- defaultModelUrl>http://crcp-blogger.mit.edu/geoblogger/rss.php</defaultModelUrl -->
  			<!--defaultModelUrl>geoRSS.xml</defaultModelUrl-->
  			<widgets>
  				<Widget id="eventsListing">
  					<stylesheet>GeoRSSListing2.xsl</stylesheet>
  				</Widget>
  				<GmlPointRenderer id="testGmlRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<normalImage>/images/MarkerA.gif</normalImage>
  					<highlightImage>/images/MarkerB.gif</highlightImage>
  				</GmlPointRenderer>
  			</widgets>
  			<!--tools>
          <ZoomToAoi id="locationsZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools-->
  			<namespace>xmlns:atom='http://www.w3.org/2005/Atom' xmlns:georss='http://georss.org/rss' xmlns:gml='http://www.opengis.net/gml/3.1.1' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:rss='http://purl.org/rss/1.0/' xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:syn='http://purl.org/rss/1.0/modules/syndication/' xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'</namespace>
  			<nodeSelectXpath>atom:feed/atom:entry</nodeSelectXpath>
  		</GeoRSS>
  	</models>
  	<widgets>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.gif</enabledSrc>
  			<disabledSrc>/images/PanDisable.gif</disabledSrc>
  		</DragPan>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
  		</Reset>
  	</widgets>
  	<skinDir>/mapbuilder/lib/skin/default</skinDir>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/geoRSS.xml
  
  Index: geoRSS.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns="http://purl.org/rss/1.0/" 
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel rdf:about="http://crcp-blogger.mit.edu/geoblogger">
  <title>Cambridge events</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/</link>
  <syn:updatePeriod>daily</syn:updatePeriod>
  <syn:updateFrequency>1</syn:updateFrequency>
  <items>
  <rdf:Seq>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2034"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2079"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2068"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2047"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1783"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2036"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2071"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2078"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2088"/>
  </rdf:Seq>
  </items>
  </channel>
  <item rdf:about="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805">
  <title>Avon Hill Neighborhood Conservation District Commission meeting</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805</link>
  <description>Avon Hill NCD Commission meeting</description>
  <dc:date>2005-05-16T17:30:00-05</dc:date>
  <dc:subject>geo:lat=42.366813 geo:long=-71.106217</dc:subject>
  <geo:long>-71.106217</geo:long>
  <geo:lat>42.366813</geo:lat>
  </item>
  <item rdf:about="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805">
  <title>Regular City Council Meeting</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805</link>
  <description>Regular City Council Meeting</description>
  <dc:date>2005-05-16T12:30:00-05</dc:date>
  <dc:subject>geo:lat=42.365813 geo:long=-71.105217</dc:subject>
  <geo:long>-71.105217</geo:long>
  <geo:lat>42.365813</geo:lat>
  </item>
  <item rdf:about="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2068">
  <title>Planning Board Meeting</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2068</link>
  <description>For the Planning Board Agenda go to: http://www.cambridgema.gov/~CDD/cp/zng/agenda/index.html</description>
  <dc:date>2005-05-17T12:30:00-05</dc:date>
  <dc:subject>geo:lat=42.370097 geo:long=-71.103096</dc:subject>
  <geo:long>-71.103096</geo:long>
  <geo:lat>42.370097</geo:lat>
  </item>
  <item rdf:about="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2047">
  <title>Minding Your Own Business POSTPONED</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2047</link>
  <description>Four week facilitated business strategy forum. $20.00 registration fee</description>
  <dc:date>2005-05-18T12:00:00-05</dc:date>
  <dc:subject>geo:lat=42.365397 geo:long=-71.103796</dc:subject>
  <geo:long>-71.103796</geo:long>
  <geo:lat>42.365397</geo:lat>
  </item>
  </rdf:RDF>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Mapbuilder GeoRSS Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config.xml';
  
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> GeoRSS Demo</h1>
      <p>This demo is intended to show how to extend Mapbuilder to handle new model types 
      (ie. new XML document flavours) and new widgets for existing models and the new model.
      This was used as a demonstration at the 
      <a href="http://mapserver.gis.umn.edu/mum/mtg2005.html">OSG'05</a> conference in Minneapolis in June 2005.
      
      <p>This version was shown embedded in the City of Cambridge, MA, 
      <a href="http://www.cambridgema.gov/Calendar.cfm">events calendar.</a></p>
      <p>RSS feed with georss extension <a href="http://crcp-blogger.mit.edu/geoblogger/rss.php">here</a> </p>
   
      
      
      </p>
      <div id="mainMapPane">
          <noscript>
              this page requires Javascript to be enabled
          </noscript>
      </div>
      <div id="mainButtonBar">
      </div>
      <div id="loading">
        <p>Loading Program<br/>
        <img src="../../lib/skin/default/images/Loading.gif"/>
        </p>
      </div>
      <div id="eventsListing">
      </div>
    </body>
  </html>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSS/index2.html
  
  Index: index2.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Mapbuilder GeoRSS Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config2.xml';
  
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> GeoRSS Demo</h1>
      <p>This demo is intended to show how to extend Mapbuilder to handle new model types 
      (ie. new XML document flavours) and new widgets for existing models and the new model.
      This was used as a demonstration at the 
      <a href="http://mapserver.gis.umn.edu/mum/mtg2005.html">OSG'05</a> conference in Minneapolis in June 2005.
      </p>
      <p>This version was shown embedded in the City of Cambridge, MA, 
        <a href="http://www.cambridgema.gov/Calendar.cfm">events calendar.</a></p>
      <p>Atom feed with georss extension <a href="http://georss.mit.edu/cambridgeevents.php">here</a> </p>
      <div id="mainMapPane">
          <noscript>
              this page requires Javascript to be enabled
          </noscript>
      </div>
      <div id="mainButtonBar">
      </div>
      <div id="loading">
        <p>Loading Program<br/>
        <img src="../../lib/skin/default/images/Loading.gif"/>
        </p>
      </div>
      <div id="eventsListing">
      </div>
    </body>
  </html>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/FeatureFactory.js
  
  Index: FeatureFactory.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  mapbuilder.loadScript(baseDir+"/widget/Popup.js");
  mapbuilder.loadScript(baseDir+"/widget/FeaturePointFactory.js");
  
  /**
    * Feature Facctoty constructor
    * @param widgetNode  The widget's XML object node from the configuration document.
    * @param model       The model object that this widget belongs to.
    */
  function FeatureFactory(widgetNode, model) {
    // initialize popu capability
    this.popup = new Popup( widgetNode, model );
   
    // init the derived factories
    this.featurePointFactory = new FeaturePointFactory( widgetNode, model );
  }
  
  /**
    * clear all created features
    */
  FeatureFactory.prototype.clearFeatures = function( ) {
    // that's all we have  implemented so far
    this.featurePointFactory.clearPointFeatures();
  }
  
  /**
    * Feature Factory that will create a feature of proper type
    * @param objRef a pointer to this widget object
    * @param type Feature type to render: POINT, LINE, CURVE, POLY
    * @param geometry array of necessary coordinates for that type of geometry
    * @param itemId feature Id
    * @param title title of feature
    * @param papupStr popup to display on mouseover
    */
  FeatureFactory.prototype.createFeature = function( objRef, type, geometry, itemId, title, popupStr ) {
    if( type == 'POINT' ) {
      this.featurePointFactory.createPointFeature( objRef, geometry, itemId, title, popupStr );
    } else if( type == 'LINE' ) {
      // this will probably require a round trip to server to generate the line
    } else if( type == 'CURVE' ) {
     // this will probably require a round trip to server to generate the bezier curve  
    } else if( type == 'POLY' ) {
     // this will probably require a round trip to server to generate the poly
    } else {
      alert( 'feature:'+type+' is not supported');
    }
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/FeaturePointFactory.js
  
  Index: FeaturePointFactory.js
  ===================================================================
  /*
  Author:  Patrice G. Cappelaere patATcappelaere.com
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
   
  
  /**
    * Point Feature Factory
    * @param widgetNode  The widget's XML object node from the configuration document.
    * @param model       The model object that this widget belongs to.
    */
  function FeaturePointFactory(widgetNode, model) {
    // initialize from model
    this.normalImage = widgetNode.selectSingleNode("mb:normalImage").firstChild.nodeValue; 
    this.highlightImage = widgetNode.selectSingleNode("mb:highlightImage").firstChild.nodeValue;
  }
  
  /**
    * Clear all created features
    */
  FeaturePointFactory.prototype.clearPointFeatures = function( ) {
    // we need to clear all the div's first
    var divs = document.getElementsByTagName("div");
    for (var i= divs.length-1; i>= 0; i--) {
      var div = divs[i];
      if( div.id.indexOf("RSS_Item") > -1 ) {
          var img = divs[i].firstChild;
          img.onmouseover = null;
          img.onmouseout = null;
          divs[i].parentNode.removeChild( divs[i] );
      }
    }
  }
  
  /**
    * Create Point Feature
    * 
    * @param objRef a pointer to this widget object
    * @param geometry array of necessary coordinates for that type of geometry
    * @param itemId feature Id
    * @param title title of feature
    * @param papupStr popup to display on mouseover
    */
  FeaturePointFactory.prototype.createPointFeature = function( objRef, geometry, itemId, title, popupStr ) {
    //add in the normalImage
    var normalImageDiv = document.createElement("DIV");
    normalImageDiv.setAttribute("id",itemId+"_normal");
    normalImageDiv.style.position = "absolute";
    normalImageDiv.style.visibility = "visible";
    normalImageDiv.style.zIndex = 300;
            
    var newImage = document.createElement("IMG");
    newImage.src = config.skinDir+ this.normalImage;
    newImage.title = title;
   
    normalImageDiv.appendChild(newImage);
    objRef.node.appendChild( normalImageDiv );
   
    // install handlers
    this.install( newImage, itemId, popupStr );
                       
    //add in the highlightImage
    var highlightImageDiv = document.createElement("DIV");
    highlightImageDiv.setAttribute("id",itemId+"_highlight");
    highlightImageDiv.style.position = "absolute";
    highlightImageDiv.style.visibility = "hidden";
    highlightImageDiv.style.zIndex = 301;   //all highlight images are on top of others
    var newImage = document.createElement("IMG");
    newImage.src = config.skinDir+ this.highlightImage;
    newImage.title = title;
    highlightImageDiv.appendChild(newImage);
    objRef.node.appendChild( highlightImageDiv );
    
    normalImageDiv.style.left = geometry[0];
    normalImageDiv.style.top = geometry[1];
    highlightImageDiv.style.left = geometry[0];
    highlightImageDiv.style.top = geometry[1];
  }
  
  /**
    * MouseOver Handler
    *
    * Note: "This" points to the feature
    */
  FeaturePointFactory.prototype.mouseOverHandler = function(ev) {    
    // get the enclosing div to get the current position
    var normalImageDiv = document.getElementById(this.itemId+"_normal");
    var topPx = new String(normalImageDiv.style.top);
    var leftPx = new String(normalImageDiv.style.left);
    var offx = normalImageDiv.offsetParent.offsetLeft;
    var offy = normalImageDiv.offsetParent.offsetTop;
    var top = parseInt(topPx.replace("px","")) + 20 + offy;
    var left = parseInt(leftPx.replace("px","")) + 20 + offx;
  
        
    // hilite the marker
    normalImageDiv.style.visibility = "hidden";
    var highlightImageDiv = document.getElementById(this.itemId+"_highlight");
    highlightImageDiv.style.visibility = "visible";
      
    // set the popup text with stylesheet output
    var popupStr = this.overlib;
    if( popupStr == undefined ) {
      popupStr = "Feature under construction.  Stay tuned!";
    }
  
    overlib( popupStr, WIDTH, 50, STICKY, FIXX, left, FIXY, top, CAPTION, 'Caption');
    return true;
  }
    
  /*
   * Mouseout handler
   */
  FeaturePointFactory.prototype.mouseOutHandler = function(ev) {
    var highlightImageDiv = document.getElementById(this.itemId+"_highlight");
    highlightImageDiv.style.visibility = "hidden";
    var normalImageDiv = document.getElementById(this.itemId+"_normal");
    normalImageDiv.style.visibility = "visible";
    return nd();
  }
  
  /**
    * install mouse handlers and params in div element
    * 
    */
  FeaturePointFactory.prototype.install = function( feature, itemId, popupStr ) {
    feature.itemId = itemId;
    feature.overlib = popupStr;
        
    feature.onmouseover = this.mouseOverHandler; 
    feature.onmouseout  = this.mouseOutHandler;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/GeoRSSListing.xsl
  
  Index: GeoRSSListing.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: presents the list of events in a GeoRSS
  
  Author:      adair
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  
    xmlns:rss="http://purl.org/rss/1.0/" 
  
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
  
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
  
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
  
    xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  
  
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
  
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
  
    <xsl:param name="modelId"/>
  
    <xsl:param name="targetModelId"/>
  
    <xsl:param name="widgetId"/>
  
    
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="/rdf:RDF ">
  
      <table>
  
        <tr>
  
          <th>
  
            GeoRSS feed: <xsl:value-of select="rss:channel/rss:title"/>
  
          </th>
  
        </tr>
  
        <xsl:apply-templates select="rss:item"/>
  
      </table>
  
    </xsl:template>
  
  
  
    <xsl:template match="rss:item">
  
      <xsl:variable name="fid"><xsl:value-of select="@id"/></xsl:variable>
  
      <xsl:variable name="x"><xsl:value-of select="geo:long"/></xsl:variable>
  
      <xsl:variable name="y"><xsl:value-of select="geo:lat"/></xsl:variable>
  
      <xsl:variable name="link"><xsl:value-of select="rss:link"/></xsl:variable>
  
      <tr onmouseover="config.objects.{$modelId}.setParam('highlightFeature','{$fid}')" onmouseout="config.objects.{$modelId}.setParam('dehighlightFeature','{$fid}')">
  
        <td>
  
          <a href="{$link}"><xsl:value-of select="rss:title"/></a>
  
          - <xsl:value-of select="rss:description"/>
  
        </td>
  
      </tr>
  
    </xsl:template>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/GeoRSSListing2.xsl
  
  Index: GeoRSSListing2.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: presents the list of events in a GeoRSS
  
  Author:      adair
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  
    xmlns:rss="http://purl.org/rss/1.0/" 
  
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
  
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
  
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
  
    xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  
  
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="ISO-8859-1" indent="yes"/>
  
  
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
  
    <xsl:param name="modelId"/>
  
    <xsl:param name="targetModelId"/>
  
    <xsl:param name="widgetId"/>
  
    
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="/rdf:RDF">
  
  <table border="0" cellpadding="0" cellspacing="0" width="100%">	
  
  	<tbody><tr><td colspan="2"><img src="Calendar_files/spacer.gif" border="0" height="30" width="1"/></td></tr>
  
  
  
  <tr>
  
  	<td colspan="2" class="calHeader">
  
  			All Events
  
  		<br/>
  
  		for GeoRSS feed: <xsl:value-of select="rss:channel/rss:title"/>
  
  		<br/>
  
  	</td>
  
  </tr>
  
  
  
        <xsl:apply-templates select="rss:item"/>
  
      </tbody></table>
  
    </xsl:template>
  
  
  
    <xsl:template match="rss:item">
  
      <xsl:variable name="fid"><xsl:value-of select="@id"/></xsl:variable>
  
      <xsl:variable name="x"><xsl:value-of select="geo:long"/></xsl:variable>
  
      <xsl:variable name="y"><xsl:value-of select="geo:lat"/></xsl:variable>
  
      <xsl:variable name="link"><xsl:value-of select="rss:link"/></xsl:variable>
  
      <xsl:variable name="time"><xsl:value-of select="dc:date"/></xsl:variable>
  
  <tr>
  
  	<td class="caldate" nowrap="nowrap" valign="top" width="33%"> <img src="Calendar_files/yellow_bullet.gif" alt="" border="0"/>&#160;<a name="June13">June 13</a>&#160;&#160;&#160;&#160;</td>
  
  	<td class="caleventtitle" valign="top" onmouseover="config.objects.{$modelId}.setParam('highlightFeature','{$fid}')" onmouseout="config.objects.{$modelId}.setParam('dehighlightFeature','{$fid}')">
  
  		<xsl:value-of select="rss:title"/>
  
  	</td>
  
  </tr>
  
  <tr>
  
  	<td>&#160;</td>
  
  	<td class="caltime" onmouseover="config.objects.{$modelId}.setParam('highlightFeature','{$fid}')" onmouseout="config.objects.{$modelId}.setParam('dehighlightFeature','{$fid}')">
  
  			<i>
  
  				Address - see marker on map
  
  			</i>
  
  		</td>
  
  	</tr>
  
  <tr>
  
  	<td>&#160;</td>
  
  	<td class="caltime"><i><xsl:value-of select="$time"/></i></td>
  
  </tr>
  
  <tr>
  
  	<td>&#160;</td>
  
  	<td class="caldescription">
  
  	<p><xsl:value-of select="rss:description"/></p>
  
  	</td>
  
  </tr>
  
  <tr onmouseover="config.objects.{$modelId}.setParam('highlightFeature','{$fid}')" onmouseout="config.objects.{$modelId}.setParam('dehighlightFeature','{$fid}')">
  
  	<td>&#160;</td>
  
  	<td class="caldescription">
  
    	<p><a href="{$link}" class="caldescription">Learn more></a></p>
  
  	</td>
  
  </tr>
  
  
  
  </xsl:template>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/GmlPointRenderer.js
  
  Index: GmlPointRenderer.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  mapbuilder.loadScript(baseDir+"/widget/Popup.js");
  mapbuilder.loadScript(baseDir+"/widget/FeatureFactory.js");
  
  // Resource: http://www.bazon.net/mishoo/articles.epl?art_id=824
  
  /**
   * Render GML point geometery into HTML.  This is a MapContainer widget.
   * Other Geometries could be handled if there was some way to get a point 
   * out of it (e.g. polygon centroid).
   * This widget places an image at the specified point on the map.
   * It also places a highlight image at the same spot and registers a 
   * hihglightFeature event on the model, where the featureId is set as the model param.
   * Models using this widget must implement getFeatureNodes(), 
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  
  function GmlPointRenderer(widgetNode, model) {
  
    //this.normalImage = widgetNode.selectSingleNode("mb:normalImage").firstChild.nodeValue; 
    	//this.highlightImage = widgetNode.selectSingleNode("mb:highlightImage").firstChild.nodeValue;
    this.popup = new Popup( widgetNode, model );
    this.featureFactory = new FeatureFactory(widgetNode, model);
    
    /**
      * Clear all markers
      */
    this.clearWidget = function(objRef) {
      // call feature factory since we do not know the implementation
      this.featureFactory.clearFeatures();
    }
    
    /** draw the points by putting the image at the point
      * @param objRef a pointer to this widget object
      */
    this.paint = function(objRef) {
      
      // cleanup first
      objRef.clearWidget(objRef );
         	
      if (objRef.model.doc && objRef.node) {
        var containerProj = new Proj(objRef.containerModel.getSRS());
        var features = objRef.model.getFeatureNodes();
        for (var i=0; i<features.length; ++i) {
          var feature = features[i];
          var title = objRef.model.getFeatureName(feature);
          var itemId = objRef.model.getFeatureId(feature);   //or feature id's for feature collections?
          var point = objRef.model.getFeaturePoint(feature);
          
          if( (point[0] == 0) && (point[1] == 0 )) {
          		return;
          	}
          	
          point = containerProj.Forward(point);
          point = objRef.containerModel.extent.getPL(point);
  
          // get the popup info from stylesheet
          var popupStr = objRef.popup.transform( objRef.popup, feature );
          
          // create a point feature
          objRef.featureFactory.createFeature( objRef, 'POINT', point, itemId, title, popupStr );
        }
      }
    }
      
    this.stylesheet = new XslProcessor(baseDir+"/widget/Null.xsl");
    var base = new MapContainerBase(this,widgetNode,model);
   
    /** highlights the selected feature by switching to the highlight image
      * @param objRef a pointer to this widget object
      */
    this.highlight = function(objRef, featureId) {
      var normalImageDiv = document.getElementById(featureId+"_normal");
      normalImageDiv.style.visibility = "hidden";
      var highlightImageDiv = document.getElementById(featureId+"_highlight");
      highlightImageDiv.style.visibility = "visible";
    }
    this.model.addListener("highlightFeature",this.highlight, this);
  
    /** highlights the selected feature by switching to the highlight image
      * @param objRef a pointer to this widget object
      */
    this.dehighlight = function(objRef, featureId) {
      var normalImageDiv = document.getElementById(featureId+"_normal");
      normalImageDiv.style.visibility = "visible";
      var highlightImageDiv = document.getElementById(featureId+"_highlight");
      highlightImageDiv.style.visibility = "hidden";
    }
    this.model.addListener("dehighlightFeature",this.dehighlight, this);
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/Mapbuilder.js
  
  Index: Mapbuilder.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /** get a time stamp at start of the page load */
  var mbTimerStart = new Date();
  
  /** the global config object */
  var config;
  
  /** URL of Mapbuilder's lib/ directory. */
  var baseDir;
  
  /** mapbuilder environement settings, defaults to a .xml extension but is 
    auto-configured by the ant build script to .jsp for tomcat environment 
    the URL to this file will be pre-pended with the baseDir value.
  */
  var mbServerConfig = "mapbuilderConfig.xml";
  var mbNsUrl = "http://mapbuilder.sourceforge.net/mapbuilder";
  
  // LoadState Constants
  var MB_UNLOADED=0;    // Scripts not loaded yet
  var MB_LOAD_CORE=1;   // Loading scripts loaded defined in Mapbuilder
  var MB_LOAD_CONFIG=2; // Loading scripts loaded defined in Config
  var MB_LOADED=3;      // All scripts loaded
  
  /**
   * This Object bootstraps the Mapbuilder libraries by loading the core
   * script files.
   * When Config.js is loaded, the script files for objects described in the
   * Mapbuilder config file are loaded.
   * Objects which have dependencies will trigger the dependancies to load
   * when they are loaded.
   *
   * @constructor
   * @author Cameron Shorter
   * @requires Config
   * @requires Listener
   * @requires ModelBase
   * @requires Sarissa
   * @requires Util
   */
  function Mapbuilder() {
  
    /**
     * Determines which Mapbuilder scripts are loading.
     * TBD: Is it possible to use enumerated types in JS?
     */
    this.loadState=MB_UNLOADED;
  
    /** Array of objects that are loading.  Don't continue initialisation until
     * all objects have loaded. */
    this.loadingScripts=new Array();
  
    /** Timer to periodically check if scripts have loaded. */
    this.scriptsTimer=null;
  
    /**
     * Called periodically and moves onto the next loadState when this round of
     * scripts have loaded.
     * For IE clients, object.readyState is used to check if scripts are loaded.
     * Mozilla works fine without this function - I think it is single threaded.
     */
    this.checkScriptsLoaded=function() {
      if (document.readyState!=null){
        // IE client
  
        // Scripts are removed from array when they have loaded
        while(this.loadingScripts.length>0
          &&(this.loadingScripts[0].readyState=="loaded"
            ||this.loadingScripts[0].readyState=="complete"
            ||this.loadingScripts[0].readyState==null))
        {
          this.loadingScripts.shift();
        }
        if (this.loadingScripts.length==0){
          this.setLoadState(this.loadState+1);
        }
      }
      else{
        // Mozilla client
        if(this.loadState==MB_LOAD_CORE && config!=null){
          // Config has finished loading
          this.setLoadState(MB_LOAD_CONFIG);
        }
      }
    }
  
    /**
     * Move onto loading the next set of scripts.
     * @param newState The new loading state.
     */
    this.setLoadState=function(newState){
      this.loadState=newState;
      switch (newState){
        case MB_LOAD_CORE:
          this.loadScript(baseDir+"/util/overlib/overlib.js");
          this.loadScript(baseDir+"/util/sarissa/Sarissa.js");
          this.loadScript(baseDir+"/util/sarissa/sarissa_ieemu_xpath.js");
          //this.loadScript(baseDir+"/util/sarissa/sarissa_dhtml.js");
          //this.loadScript(baseDir+"/util/sarissa/sarissa_ieemu_xslt.js");//all deprecated
          this.loadScript(baseDir+"/util/Util.js");
          this.loadScript(baseDir+"/util/Listener.js");
          this.loadScript(baseDir+"/model/ModelBase.js");
          this.loadScript(baseDir+"/model/Config.js");
          break;
        case MB_LOAD_CONFIG:
           if(document.readyState){
            // IE
            config=new Config(mbConfigUrl);
            config.loadConfigScripts();
          }else{
            // Mozilla
            this.setLoadState(MB_LOADED);
          }
          break;
        case MB_LOADED:
          clearInterval(this.scriptsTimer);
          break;
      }
    }
  
    /**
     * Dynamically load a script file if it has not already been loaded.
     * @param url The url of the script.
     */
    this.loadScript=function(url){
      if(!document.getElementById(url)){
        var script = document.createElement('script');
        script.defer = false;   //not sure of effect of this?
        script.type = "text/javascript";
        script.src = url;
        script.id = url;
        document.getElementsByTagName('head')[0].appendChild(script);
        this.loadingScripts.push(script);
      }
    }
  
    /**
     * Internal function to load scripts for components that don't have <scriptfile>
     * specified in the config file.
     * @param xPath Xpath match of components from the Config file.
     * @param dir The directory the script is located in.
     */
    this.loadScriptsFromXpath=function(nodes,dir) {
      //var nodes = this.doc.selectNodes(xPath);
      for (var i=0; i<nodes.length; i++) {
        if (nodes[i].selectSingleNode("mb:scriptFile")==null){
          scriptFile = baseDir+"/"+dir+nodes[i].nodeName+".js";
          this.loadScript(scriptFile);
        }
      }
    }
  
    //derive the baseDir value by looking for the script tag that loaded this file
    var head = document.getElementsByTagName('head')[0];
    var nodes = head.childNodes;
    for (var i=0; i<nodes.length; ++i ){
      var src = nodes.item(i).src;
      if (src) {
        var index = src.indexOf("/Mapbuilder.js");
        if (index>=0) {
          baseDir = src.substring(0, index);
        }
      }
    }
  
    // Start loading core scripts.
    this.setLoadState(MB_LOAD_CORE);
  
    // Start a timer which periodically calls checkScriptsLoaded().
    this.scriptsTimer=setInterval('mapbuilder.checkScriptsLoaded()',100);
  }
  
  /**
   * copied from sarissa, a function to check browser security setting in IE, 
   * opens a help page if ActiveX objects are disabled.
   */
  function checkIESecurity()
  {
    var testPrefixes = ["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];
    // found progID flag
    var bFound = false;
    for(var i=0; i < testPrefixes.length && !bFound; i++) {
      try {
        var oDoc = new ActiveXObject(testPrefixes[i]);
        bFound = true;
      }
      catch (e) {
        //trap; try next progID
      }
    }
    if (!bFound) window.open("/mapbuilder/docs/help/IESetup.html");  //TBD: set this URL in config
  }
  
  if (navigator.userAgent.toLowerCase().indexOf("msie") > -1) checkIESecurity();
  var mapbuilder=new Mapbuilder();
  
  /**
   * Initialise Mapbuilder if script has been loaded, else wait to be called
   * again.
   */
  function mapbuilderInit(){
    if(mapbuilder && mapbuilder.loadState==MB_LOADED){
      clearInterval(mbTimerId);
      config.init(config);
      config.callListeners("init");
      var mbTimerStop = new Date();
      //alert("load time:"+(mbTimerStop.getTime()-mbTimerStart.getTime()) );
      if (window.mbInit) window.mbInit();
      config.callListeners("loadModel");
    }
  }
  
  /** Timer used when checking if scripts have loaded. */
  var mbTimerId;
  
  /**
   * Mapbuilder's main initialisation script.
   * This should be called from the main html file using:
   *   <body onload="mbDoLoad()">
   * @param initFunction Optional - A function reference that will be called after 
   * config.init() has been called.  This is to give application code a chance to
   * do initialization and be guaranteed that all objects exist (inlcuding config).
   */
  function mbDoLoad(initFunction) {
    // See if scripts have been loaded every 100msecs, then call config.init().
    mbTimerId=setInterval('mapbuilderInit()',100);
    if (initFunction) window.mbInit = initFunction;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/Popup.js
  
  Index: Popup.js
  ===================================================================
  /*
  Author:       Patrice G Cappelaere patATcappelaere.com
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  // References: http://www.bosrup.com/web/overlib/?Command_Reference
  // Plugins: 
  //		http://overlib.boughner.us/plugins/bubble_commands.html
  //		http://www.bosrup.com/web/overlib/?Unofficial_Plugins
  
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  mapbuilder.loadScript(baseDir+"/util/overlib/overlib.js");
  // does not work with IE mapbuilder.loadScript(baseDir+"/util/overlib/overlib_shadow.js");
  //mapbuilder.loadScript(baseDir+"/util/overlib/overlib_bubble/overlib_bubble.js");
  
  /**
   * Popup uses overlib http://www.bosrup.com/web/overlib/
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function Popup( widgetNode, model) {
  
    // get configuration options   
    var styleNode = widgetNode.selectSingleNode("mb:stylesheet");
    if (styleNode ) {
    	  var xslt = styleNode.firstChild.nodeValue;
        this.stylesheet = new XslProcessor(xslt, model.namespace);
    } 
    
    // apply stylesheet transform to the entry and return results
    this.transform = function( objRef, entry ) {
     	if( objRef.stylesheet != null ) {
    		var resultNode = objRef.stylesheet.transformNodeToObject( entry );
          var result = Sarissa.serialize(resultNode.documentElement);
      		//alert("transforming:"+result);
    		return result;
    	}
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/build.xml
  
  Index: build.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!--*************************************************************************
  Filename        :   build.xml
  Project         :   mapbuilder
  Document Type   :   XML
  Purpose         :   build file for ant tool
  
  Author     Date            Description
  M.Adair    17-Dec-2001     initial version copied from quicklook
  
  $Id$
  ***************************************************************************--><!--
       General purpose build script for web applications and web services,
       including enhanced support for deploying directly to a Tomcat 5
       based server.
  
       This build script assumes that the source code of your web application
       is organized into the following subdirectories underneath the source
       code directory from which you execute the build script:
  
          docs                 Static documentation files to be copied to
                               the "docs" subdirectory of your distribution.
  
          src                  Java source code (and associated resource files)
                               to be compiled to the "WEB-INF/classes"
                               subdirectory of your web applicaiton.
  
          web                  Static HTML, JSP, and other content (such as
                               image files), including the WEB-INF subdirectory
                               and its configuration file contents.
  
  -->
  <!-- A "project" describes a set of targets that may be requested
       when Ant is executed.  The "default" attribute defines the
       target which is executed if no specific target is requested,
       and the "basedir" attribute defines the current working directory
       from which Ant executes the requested task.  This is normally
       set to the current working directory.
  -->
    <project basedir=".." default="deploy-tomcat" name="mapbuilder">
  
  <!-- ===================== Property Definitions =========================== -->
  <!--
    Each of the following properties are used in the build script.
    Values for these properties are set by the first place they are
    defined, from the following list:
  
    * Definitions on the "ant" command line (ant -Dfoo=bar compile).
  
    * Definitions from a "build.properties" file in the top level
      source directory of this application.
  
    * Definitions from a "build.properties" file in the developer's
      home directory.
  
    * Default definitions in this build.xml file.
  
    You will note below that property values can be composed based on the
    contents of previously defined properties.  This is a powerful technique
    that helps you minimize the number of changes required when your development
    environment is modified.  Note that property composition is allowed within
    "build.properties" files as well as in the "build.xml" script.
  -->
    <property file="build.properties"/>
    <property file="${user.home}/build.properties"/>
  
  <!-- ==================== File and Directory Names ======================== -->
  <!--
  
    These properties generally define file and directory names (or paths) that
    affect where the build process stores its outputs.
  
    app.name             Base name of this application, used to
                         construct filenames and directories.
                         Defaults to "myapp".
  
    app.path             Context path to which this application should be
                         deployed (defaults to "/" plus the value of the
                         "app.name" property).
  
    app.version          Version number of this iteration of the application.
  
    build.home           The directory into which the "prepare" and
                         "compile" targets will generate their output.
                         Defaults to "build".
  
    catalina.home        The directory in which you have installed
                         a binary distribution of Tomcat 5.  This will
                         be used by the "deploy" target.
  
    dist.home            The name of the base directory in which
                         distribution files are created.
                         Defaults to "dist".
  
    manager.password     The login password of a user that is assigned the
                         "manager" role (so that he or she can execute
                         commands via the "/manager" web application)
  
    manager.url          The URL of the "/manager" web application on the
                         Tomcat installation to which we will deploy web
                         applications and web services.
  
    manager.username     The login username of a user that is assigned the
                         "manager" role (so that he or she can execute
                         commands via the "/manager" web application)
  
  -->
  
    <property environment="env"/>
    <property name="app.name" value="mapbuilder"/>
    <property name="pack.name" value="mapbuilder-lib"/>
    <property name="app.path" value="/${app.name}"/>
    <property name="app.version" value="0.4-alpha"/>
    <property name="catalina.home" value="${env.CATALINA_HOME}"/> <!-- ensure you have this environment var set -->
    <property name="build.home" value="${basedir}/build"/>
    <property name="compress.home" value="${basedir}/compressBuild"/>
    <property name="deploy.home" value="${catalina.home}/webapps/${app.name}"/>
    <property name="dist.home" value="${basedir}/dist"/>
    <property name="docs.home" value="${build.home}/docs"/>
    <property name="dev.home" value="${basedir}/."/>
    <property name="context.home" value="${dev.home}/server/java"/>
    <property name="src.home" value="${context.home}/src"/>
  
  
  <!-- ==================== External Dependencies =========================== -->
  
  <!--
    Use property values to define the locations of external JAR files on which
    your application will depend.  In general, these values will be used for
    two purposes:
    * Inclusion on the classpath that is passed to the Javac compiler
    * Being copied into the "/WEB-INF/lib" directory during execution
      of the "deploy" target.
  
    Because we will automatically include all of the Java classes that Tomcat 5
    exposes to web applications, we will not need to explicitly list any of those
    dependencies.  You only need to worry about external dependencies for JAR
    files that you are going to include inside your "/WEB-INF/lib" directory.
  -->
  
  <!--
    <property name="foo.jar"  value="$/lib/foo.jar"/>
  -->
    <property name="httpClient.jar"  value="${context.home}/lib/commons-httpclient-2.0.1.jar"/>
    <property name="logging.jar"  value="${context.home}/lib/commons-logging.jar"/>
    <property name="log4j.jar"  value="${context.home}/lib/log4j-1.2.8.jar"/>
    <property name="jstl.jar"  value="${context.home}/lib/jstl.jar"/>
    <property name="standard.jar"  value="${context.home}/lib/standard.jar"/>
  
  
  <!-- ==================== Prepare Target ================================== -->
  
  <!--
  
    The "prepare" target is used to create the "build" destination directory,
    and copy the static contents of your web application to it.  If you need
    to copy static files from external dependencies, you can customize the
    contents of this task.
  
    Normally, this task is executed indirectly when needed.
  
  -->
  
    <target name="prepare">
  
      <!-- Create build directories as needed -->
      <mkdir dir="${build.home}"/>
  
      <!-- Copy static content of the mapbuilder project  -->
      <copy todir="${build.home}">
        <fileset dir="${basedir}"
          includes="demo/** lib/** docs/** server/php/** CHANGES LICENSE LGPL README index.html"/>
      </copy>
      <copy file="${basedir}/server/php/mapbuilderConfig.xml" todir="${build.home}/lib" overwrite="true"/>
      
    </target>
  
    <target name="prepare-tomcat" depends="prepare">
  
      <!-- Create build directories as needed -->
      <mkdir dir="${build.home}"/>
      <mkdir  dir="${build.home}/WEB-INF"/>
      <mkdir  dir="${build.home}/WEB-INF/classes"/>
  
      <!-- Copy static content of this web application -->
      <copy todir="${build.home}">
        <fileset dir="${context.home}/web"/>
      </copy>
      <copy file="${context.home}/web/lib/mapbuilderConfig.xml" todir="${build.home}/lib" overwrite="true"/>
  
      <!-- set the global server config file to the JSP version -->   
      <echo message="setting mbServerConfig URL to JSP version"/>
      <delete file="${build.home}/lib/Mapbuilder.js.temp" quiet="true"/>
      <copy file="${basedir}/lib/Mapbuilder.js" todir="${build.home}/lib" overwrite="true"/>
      <replace file="${build.home}/lib/Mapbuilder.js" token="mapbuilderConfig.xml" value="mapbuilderConfig.jsp"/>
          
      <!-- copy all files from etc to WEB-INF; includes tld files and scaf tokens-->   
      <copy todir="${build.home}/WEB-INF">
      	<fileset dir="${context.home}/etc">
        </fileset>
      </copy>
  
      <!-- Copy external dependencies as required -->
      <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
      <mkdir  dir="${build.home}/WEB-INF/lib"/>
  <!--
      <copy todir="${build.home}/WEB-INF/lib" file="${foo.jar}"/>
  -->
      <copy todir="${build.home}/WEB-INF/lib" file="${httpClient.jar}"/>
      <copy todir="${build.home}/WEB-INF/lib" file="${logging.jar}"/>
      <copy todir="${build.home}/WEB-INF/lib" file="${log4j.jar}"/>
      <copy todir="${build.home}/WEB-INF/lib" file="${jstl.jar}"/>
      <copy todir="${build.home}/WEB-INF/lib" file="${standard.jar}"/>
      
    </target>
  
  
  <!-- ==================== All Target ====================================== -->
  
  <!--
  
    The "all" target is a shortcut for running the "clean" target followed
    by the "compile" target, to force a complete recompile.
  
  -->
  
    <target depends="clean,compile" description="Clean build and dist directories, then compile" name="all"/>
  
  
  
  <!-- ==================== Clean Target ==================================== -->
  
  <!--
  
    The "clean" target deletes any previous "build" and "dist" directory,
    so that you can be ensured the application can be built from scratch.
  
  -->
  
    <target description="Delete old build and dist directories" name="clean">
      <delete dir="${build.home}"/>
      <delete dir="${dist.home}"/>
      <delete dir="${compress.home}"/>
    </target>
  
  
  
  <!-- ==================== Clean Tomcat ==================================== -->
  
    <target description="Delete old build and dist directories" name="clean-tomcat">
      <delete dir="${deploy.home}"/>
    </target>
  
  
  
  <!-- ==================== Documentation =================================== -->
  
    <target description="Create documentation" name="docs">
    
      <mkdir dir="${build.home}/docs"/>
      
      <!-- style the design docs from the XBook document -->
      <!--style in="${basedir}/design/mapbuilder-lib.xml" style="/usr/share/sgml/docbook/xsl-stylesheets/html/docbook.xsl" out="${build.home}/docs/design/index.html"/-->
      
      <echo message="os name=${os.name}"/>
      <exec executable="${basedir}/bin/publish.sh" os="linux">
      </exec>
    </target>
  
  <!--  ==================== Compilation Control Options ==================== -->
  
  <!--
    These properties control option settings on the Javac compiler when it
    is invoked using the <javac> task.
  
    compile.debug        Should compilation include the debug option?
    compile.deprecation  Should compilation include the deprecation option?
    compile.optimize     Should compilation include the optimize option?
  -->
    <property name="compile.debug"       value="false"/>
    <property name="compile.deprecation" value="false"/>
    <property name="compile.optimize"    value="true"/>
  
  
  <!-- ==================== External Dependencies =========================== -->
  <!--
    Use property values to define the locations of external JAR files on which
    your application will depend.  In general, these values will be used for
    two purposes:
    * Inclusion on the classpath that is passed to the Javac compiler
    * Being copied into the "/WEB-INF/lib" directory during execution
      of the "deploy" target.
  
    Because we will automatically include all of the Java classes that Tomcat 5
    exposes to web applications, we will not need to explicitly list any of those
    dependencies.  You only need to worry about external dependencies for JAR
    files that you are going to include inside your "/WEB-INF/lib" directory.
  -->
  
  <!--
    <property name="foo.jar"     value="${context.home}/lib/foo.jar"/>
  -->
  
  <!-- ==================== Compilation Classpath =========================== -->
  <!--
    Rather than relying on the CLASSPATH environment variable, Ant includes
    features that makes it easy to dynamically construct the classpath you
    need for each compilation.  The example below constructs the compile
    classpath to include the servlet.jar file, as well as the other components
    that Tomcat makes available to web applications automatically, plus anything
    that you explicitly added.
  -->
  
    <path id="compile.classpath">
  
      <!-- Include all JAR files that will be included in /WEB-INF/lib -->
      <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** -->
  <!--
      <pathelement location="${foo.jar}"/>
  -->
      <pathelement location="${httpClient.jar}"/>
      <pathelement location="${logging.jar}"/>
      <pathelement location="${log4j.jar}"/>
  
      <!-- Include all elements that Tomcat exposes to applications -->
      <pathelement location="${catalina.home}/common/classes"/>
      <fileset dir="${catalina.home}/common/endorsed">
        <include name="*.jar"/>
      </fileset>
      <fileset dir="${catalina.home}/common/lib">
        <include name="*.jar"/>
      </fileset>
      <pathelement location="${catalina.home}/shared/classes"/>
      <fileset dir="${catalina.home}/shared/lib">
        <include name="*.jar"/>
      </fileset>
  
    </path>
  
  <!-- ==================== Compile Target ================================== -->
  <!--
    The "compile" target transforms source files (from your "src" directory)
    into object files in the appropriate location in the build directory.
    This example assumes that you will be including your classes in an
    unpacked directory hierarchy under "/WEB-INF/classes".
  -->
  
    <target name="compile" depends="prepare-tomcat" description="Compile Java sources">
  
      <!-- Compile Java classes as necessary -->
      <mkdir    dir="${build.home}/WEB-INF/classes"/>
      <javac srcdir="${src.home}"
            destdir="${build.home}/WEB-INF/classes"
              debug="${compile.debug}"
        deprecation="${compile.deprecation}"
           optimize="${compile.optimize}">
          <classpath refid="compile.classpath"/>
      </javac>
  
      <!-- Copy application resources -->
      <copy  todir="${build.home}/WEB-INF/classes">
        <fileset dir="${src.home}" excludes="**/*.java"/>
      </copy>
  
    </target>
  
  
  <!-- =================== Compress Target ================================== -->
  
    <target description="Compress JS and XSL files" name="compress" depends="prepare">
      <copy todir="${compress.home}">
        <fileset dir="${build.home}"/>
      </copy>
  
      <exec executable="${basedir}/bin/compress.sh" os="linux"/>
    </target>
  
  
  <!-- ==================== Deploy ========================================== -->
  <!--
    The "deploy" target synchronizes the build directory with the Java Servlet
    container directory.  This could also be done by copying in the war file.
  -->
    <target name="deploy-tomcat"
      description="Copy build directory to $CATALINA_HOME"
      depends="compile">
      <mkdir dir="${deploy.home}"/>
      <copy todir="${deploy.home}">
        <fileset dir="${build.home}">
        </fileset>
      </copy>
    </target>
  
  
  
  <!-- ==================== Dist Target ===================================== -->
  <!--
  
    The "dist" target creates a binary distribution of your application
    in a directory structure ready to be archived in a tar.gz or zip file.
    Note that this target depends on two others:
  
    * "compile" so that the entire web application (including external
      dependencies) will have been assembled
  -->
  
    <target
      name="dist"
      description="Create binary distribution"
      depends="clean,docs">
      
      <!-- first do the apache distribution -->
      <antcall target="dist-apache"/>
      
      <!-- remove the compress directory, recreated in tomcat distribution -->
      <delete dir="${compress.home}"/>
      
      <!-- do the tomcat distribution -->
      <antcall target="dist-tomcat"/>
  
    </target>
  
  <!--
    The "dist-tomcat" target creates the war file distribution of your application
    only without creating all docs, zips, etc.  This is to be used for deploying
    your application to a produciton server.
  -->
    <target
      name="dist-tomcat"
      description="Create binary distribution"
      depends="compile,compress"
      >
      
      <mkdir dir="${dist.home}"/>
      
      <!-- Create source WAR file -->
      <jar jarfile="${dist.home}/${app.name}.war" basedir="${compress.home}"/>
  
      <!-- zip up the application WAR file -->
      <zip destfile="${dist.home}/${pack.name}-${app.version}-war.zip" update="true">
        <zipfileset file="${dist.home}/${app.name}.war"/>
      </zip>
    </target>
  
  <!--
    The "dist-apache" target creates the zip file distribution for the Apache/PHP
    environment.
  -->
    <target
      name="dist-apache"
      description="Create binary distribution"
      depends="prepare,compress"
      >
  
      <mkdir dir="${dist.home}"/>
  
      <!-- Create source zip file -->
      <zip destfile="${dist.home}/${pack.name}-src-${app.version}.zip" update="true">
        <zipfileset dir="${basedir}" excludes="build/** dist/** compressBuild/** client/** design/**" prefix="mapbuilder"/>
      </zip>
      
      <!-- Create application zip file -->
      <zip destfile="${dist.home}/${pack.name}-${app.version}.zip" update="true">
        <zipfileset dir="${compress.home}" prefix="mapbuilder"/>
      </zip>
  
    </target>
  
  </project>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/cambridge.xml
  
  Index: cambridge.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  
  <ViewContext xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:wmc="http://www.opengis.net/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd" id="eos_data_gateways" version="1.0.0">
  
  <General>
  
  <Window height="400" width="400"/>
  
  <Title>GEORSS</Title>
  
  <BoundingBox SRS="EPSG:4326" minx="-71.1606" miny="42.3517" maxx="-71.069" maxy="42.4045" />
  
  <!--BoundingBox SRS="EPSG:26986" minx="228000" miny="899000" maxx="236000" maxy="907000" /-->
  
  </General>
  
  <!--http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map&VERSION=1.1.0&REQUEST=getmap&SRS=EPSG:26986&WIDTH=500&HEIGHT=500&LAYERS=towns&BBOX=228000,899000,236000,907000&EXCEPTIONS=application/vnd.ogc.se_inimage&TRANSPARENT=TRUE&FORMAT=image/png-->
  
  <LayerList>
  
    <Layer queryable="0" hidden="0">
  
     <Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
  
      <OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/ows1/cubeserv/cubeserv.cgi"/>
  
     </Server>
  
     <Name>DOQ:TerraService</Name>
  
     <Title>USGS Digital Ortho-Quadrangles</Title>
  
     <SRS>EPSG:4326</SRS>
  
     <FormatList>
  
      <Format current="1">image/gif</Format>
  
     </FormatList>
  
     <StyleList>
  
     <Style current="1">
  
      <Name>default</Name>
  
      <Title>default</Title>
  
     </Style>
  
     </StyleList>
  
    </Layer>
  
  <Layer queryable="0" hidden="1">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>towns</Name>
  
  <Title>MA Town Boundaries</Title>
  
  <Abstract>MA Town Boundaries</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>townsoutline</Name>
  
  <Title>MA Town Boundary Outlines</Title>
  
  <Abstract>MA Town Boundary Outlines</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>hydro</Name>
  
  <Title>Rivers and Streams</Title>
  
  <Abstract>Lakes and Ponds, 1:2,000,000 USGS</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>ocean</Name>
  
  <Title>Ocean</Title>
  
  <Abstract>Ocean clipping area from MassGIS</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>roads</Name>
  
  <Title>Cambridge roads</Title>
  
  <Abstract>Cambridge roads</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  <Layer queryable="0" hidden="0">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>MHDRoads</Name>
  
  <Title>MHDRoads</Title>
  
  <Abstract/>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  <Layer queryable="0" hidden="1">
  
  <Server service="OGC:WMS" version="1.1.0" title="GEORSS">
  
  <OnlineResource type="simple" xlink:href="http://crcp-blogger.mit.edu/cgi-bin/mapserv?map=/var/apps/georss/geoblog.map"/>
  
  </Server>
  
  <Name>events</Name>
  
  <Title>Events</Title>
  
  <Abstract>Cambridge events from cambridgema.gov</Abstract>
  
  <SRS>EPSG:26986 EPSG:4326</SRS>
  
  <FormatList>
  
  <Format current="1">image/png</Format>
  
  </FormatList>
  
  <StyleList>
  
  <Style current="1"/>
  
  </StyleList>
  
  </Layer>
  
  </LayerList>
  
  </ViewContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="geoRSSConfig" 
  	xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
  	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  	xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>cambridge.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<Loading id="loading" />
  				<AoiBoxDHTML id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/Null.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  			</tools>
  		</Context>
  		
  		<GeoRSS id="geoRSS">
  			<!--defaultModelUrl>http://crcp-blogger.mit.edu/geoblogger/rss.php</defaultModelUrl-->
  			<!--scriptFile>/geoRSS/GeoRSS.js</scriptFile-->
  			<defaultModelUrl>geoRSS.xml</defaultModelUrl>
  
  			<widgets>
  				<Widget id="eventsListing">
  					<targetModel>mainMap</targetModel>
  					<stylesheet>GeoRSSListing.xsl</stylesheet>
  				</Widget>
  				<GmlPointRenderer id="pointRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>popup.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<normalImage>/images/MarkerA.gif</normalImage>
  					<highlightImage>/images/MarkerB.gif</highlightImage>
  				</GmlPointRenderer>
  			</widgets>
  			<namespace>xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:rss='http://purl.org/rss/1.0/' xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:syn='http://purl.org/rss/1.0/modules/syndication/' xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'</namespace>
  			<nodeSelectXpath>/rdf:RDF/rss:item</nodeSelectXpath>
  		</GeoRSS>
  	</models>
  	
  	<widgets>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<GetMarkerInfo id="getMarkerInfo">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<context>mainMap</context>
  			<!-- mouseHandler>mainAoi</mouseHandler -->
  			<class>RadioButton</class>
  			<enabledSrc>/images/QueryEnable.png</enabledSrc>
  			<disabledSrc>/images/QueryDisable.png</disabledSrc>
  			<cursor>help</cursor>
  		</GetMarkerInfo>
  		
  	</widgets>
  	
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/config2.xml
  
  Index: config2.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="simpleTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>cambridge.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<fixedWidth>216</fixedWidth>
  				</MapPane>
  				<Loading id="loading" />
  				<AoiBoxDHTML id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/Null.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  			</tools>
  		</Context>
  		<GeoRSS id="geoRSS">
  			<defaultModelUrl>http://crcp-blogger.mit.edu/geoblogger/rss.php</defaultModelUrl>
  			<!--defaultModelUrl>geoRSS.xml</defaultModelUrl-->
  			<widgets>
  				<Widget id="eventsListing">
  					<stylesheet>GeoRSSListing2.xsl</stylesheet>
  				</Widget>
  				<GmlPointRenderer id="testGmlRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<normalImage>/images/MarkerA.gif</normalImage>
  					<highlightImage>/images/MarkerB.gif</highlightImage>
  				</GmlPointRenderer>
  			</widgets>
  			<!--tools>
          <ZoomToAoi id="locationsZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools-->
  			<namespace>xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:rss='http://purl.org/rss/1.0/' xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:syn='http://purl.org/rss/1.0/modules/syndication/' xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'</namespace>
  			<nodeSelectXpath>/rdf:RDF/rss:item</nodeSelectXpath>
  		</GeoRSS>
  	</models>
  	<widgets>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.gif</enabledSrc>
  			<disabledSrc>/images/PanDisable.gif</disabledSrc>
  		</DragPan>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
  		</Reset>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/geoRSS.xml
  
  Index: geoRSS.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns="http://purl.org/rss/1.0/" 
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel rdf:about="http://crcp-blogger.mit.edu/geoblogger">
  <title>Cambridge events</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/</link>
  <syn:updatePeriod>daily</syn:updatePeriod>
  <syn:updateFrequency>1</syn:updateFrequency>
  <items>
  <rdf:Seq>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2034"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2079"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2068"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2047"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1783"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2036"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2071"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2078"/>
  <rdf:li rdf:resource="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2088"/>
  </rdf:Seq>
  </items>
  </channel>
  <item rdf:about="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805">
  <title>Avon Hill Neighborhood Conservation District Commission meeting</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805</link>
  <description>Avon Hill NCD Commission meeting</description>
  <dc:date>2005-05-16T17:30:00-05</dc:date>
  <dc:subject>geo:lat=42.366813 geo:long=-71.106217</dc:subject>
  <geo:long>-71.106217</geo:long>
  <geo:lat>42.366813</geo:lat>
  </item>
  <item rdf:about="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805">
  <title>Regular City Council Meeting</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event1805</link>
  <description>Regular City Council Meeting</description>
  <dc:date>2005-05-16T12:30:00-05</dc:date>
  <dc:subject>geo:lat=42.365813 geo:long=-71.105217</dc:subject>
  <geo:long>-71.105217</geo:long>
  <geo:lat>42.365813</geo:lat>
  </item>
  <item rdf:about="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2068">
  <title>Planning Board Meeting</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2068</link>
  <description>For the Planning Board Agenda go to: http://www.cambridgema.gov/~CDD/cp/zng/agenda/index.html</description>
  <dc:date>2005-05-17T12:30:00-05</dc:date>
  <dc:subject>geo:lat=42.370097 geo:long=-71.103096</dc:subject>
  <geo:long>-71.103096</geo:long>
  <geo:lat>42.370097</geo:lat>
  </item>
  <item rdf:about="http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2047">
  <title>Minding Your Own Business POSTPONED</title>
  <link>http://crcp-blogger.mit.edu/geoblogger/rssitem.php?event_id=Event2047</link>
  <description>Four week facilitated business strategy forum. $20.00 registration fee</description>
  <dc:date>2005-05-18T12:00:00-05</dc:date>
  <dc:subject>geo:lat=42.365397 geo:long=-71.103796</dc:subject>
  <geo:long>-71.103796</geo:long>
  <geo:lat>42.365397</geo:lat>
  </item>
  </rdf:RDF>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Mapbuilder GeoRSS Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config.xml';
  
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> GeoRSS Demo</h1>
      <p>This demo is intended to show how to extend Mapbuilder to handle new model types 
      (ie. new XML document flavours) and new widgets for existing models and the new model.
      This was used as a demonstration at the 
      <a href="http://mapserver.gis.umn.edu/mum/mtg2005.html">OSG'05</a> conference in Minneapolis in June 2005.
      </p>
  
      <div id="mainMapPane">
          <noscript>
              this page requires Javascript to be enabled
          </noscript>
      </div>
      <div id="mainButtonBar">
      </div>
      <div id="loading">
        <p>Loading Program<br/>
        <img src="../../lib/skin/default/images/Loading.gif"/>
        </p>
      </div>
      <div id="eventsListing">
      </div>
    </body>
  </html>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/index2.html
  
  Index: index2.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Mapbuilder GeoRSS Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config2.xml';
  
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> GeoRSS Demo</h1>
      <p>This demo is intended to show how to extend Mapbuilder to handle new model types 
      (ie. new XML document flavours) and new widgets for existing models and the new model.
      This was used as a demonstration at the 
      <a href="http://mapserver.gis.umn.edu/mum/mtg2005.html">OSG'05</a> conference in Minneapolis in June 2005.
      </p>
      <p>This version was shown embedded in the City of Cambridge, MA, 
        <a href="http://www.cambridgema.gov/Calendar.cfm">events calendar.</a></p>
      <div id="mainMapPane">
          <noscript>
              this page requires Javascript to be enabled
          </noscript>
      </div>
      <div id="mainButtonBar">
      </div>
      <div id="loading">
        <p>Loading Program<br/>
        <img src="../../lib/skin/default/images/Loading.gif"/>
        </p>
      </div>
      <div id="eventsListing">
      </div>
    </body>
  </html>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/geoRSSPlus/popup.xsl
  
  Index: popup.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  
  
  <!--
  
  Description: presents the list of events in a GeoRSS
  
  Author:      adair
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  
    xmlns:rss="http://purl.org/rss/1.0/" 
  
    xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
  
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
  
    xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
  
    xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  
  
  
     <xsl:output method="xml" indent="yes" />
  
  
  
    <xsl:template match="rss:item">
      <results> 
    	<b>title:</b><xsl:value-of select="rss:title"/><br/>
    	<b>description:</b><xsl:value-of select="rss:description"/><br/>
    	<b>date:</b><xsl:value-of select="rss:date"/><br/>
  
      <b>long:</b><xsl:value-of select="geo:long"/><br/>
  
      <b>lat:</b><xsl:value-of select="geo:lat"/><br/>
  
      <b>link:</b><xsl:element name="a">
       <xsl:attribute name="href"><xsl:value-of select="rss:link"/></xsl:attribute>click here for more information!
      </xsl:element><br/>
      </results>
  
    </xsl:template>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/index.jsp
  
  Index: index.jsp
  ===================================================================
  <%@page contentType="text/html"%>
  <%
  
  	/* Get the requested Web Map Context Doc
  	 * If not specified, use the default
  	 */
  	 String wmc = request.getParameter("map");
           if (wmc == null) 
           {
  		 wmc = "demisWorldMap";
  	 }
           String wmcUrl = "./wmc/" + wmc + ".xml"; 
  
  	 
  	/* Get the requested Template 
  	 * This will be the mapbuilder html body
  	 * If not specified, use the default
  	 */
  	 String template = request.getParameter("template");
           if (template == null) 
           {
  		 template = "default";
  	 }
  	 String templateFile = "./templates/" + template + ".html";
  	 String configUrl = "./templates/" + template + ".xml";
  
  %>	
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Metacat Mapbuilder Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/button.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/scalebar-fat.css'>
  
      <script>
      // URL of Mapbuilder configuration file. Required.
      var mbConfigUrl='<%=configUrl%>';
      
      function wmcInit() {
        config.loadModel('mainMap','<%=wmcUrl%>');
      }
      </script>
      
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
      <style type="text/css">
         body {margin:0px; padding:0px;}
      </style>
    </head>
    <body onload="mbDoLoad(wmcInit)">
    <% pageContext.include(templateFile); %>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/locations/Canada-42304.xml
  
  Index: Canada-42304.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <QuickviewPresetResultSet version="1.0.0"  xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../../lib/schemas/locations.xsd">
  	<gml:description>Canadian locations</gml:description>
  	<gml:name>CMB:Locations</gml:name>
  	<gml:boundedBy>
  		<gml:Null>missing</gml:Null>
  	</gml:boundedBy>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-------Canada</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-2200000,-712631 3072800,3840000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Alberta</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-1617000,131540 -731000,1506340</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------British Columbia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-2430000,222000 -1280000,2031000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Manitoba</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-555000,-207000 456400,1291278</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------New Brunswick</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>1876700,35800 2366000,404700</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Newfoundland and Labrador</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>1533000,586000 3041900,1597000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Northwest Territories</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-2423500,1223700 1450000,3830000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Nova Scotia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>2218000,-73300 2610396,327400</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Nunavut</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-474700,1109000 431500,2292700</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Ontario</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-201000,-779000 1766000,941000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Prince Edward Island</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>2261000,262700 2456000,379200</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Quebec</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>727689,-204354 2000229,1688524</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Saskatchewan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-1245000,16751 -323000,1295000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Yukon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#42304">
  						<gml:coordinates>-2392000,1542700 -1356000,2857000</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  </QuickviewPresetResultSet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/locations/Canada.xml
  
  Index: Canada.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <QuickviewPresetResultSet version="1.0.0"  xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../../lib/schemas/locations.xsd">
  	<gml:description>Canadian locations</gml:description>
  	<gml:name>CMB:Locations</gml:name>
  	<gml:boundedBy>
  		<gml:Null>missing</gml:Null>
  	</gml:boundedBy>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-------Canada</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-141,42 -52,84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Alberta</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-120,49 -110,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------British Columbia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-139,48 -114,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>---------------Vancouver</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-123.224241434698,49.1981566626439 -123.022966859531,49.3168483739754</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Manitoba</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-102,49 -89,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------New Brunswick</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-69,45 -64,48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Newfoundland and Labrador</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-67.7,47 -52,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Northwest Territories</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-136.5,60 -101.5,79</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Nova Scotia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-66.3,43 -59.9,47</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Nunavut</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-121,52 -61,84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Ontario</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-95,42 -74,57</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>---------------Ottawa</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-75.8177,45.31929 -75.5897,45.46888</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>---------------Toronto</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-79.4881,43.61042 -79.2786,43.73698</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Prince Edward Island</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-64.5,45.9 -62,47</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Quebec</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-79.5,45 -57,63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>---------------Montreal</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-73.6193886688066,45.6127246118815 -73.4754304860602,45.7130175713401</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Saskatchewan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-110,49 -101.5,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>-----------Yukon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-141,60 -123.8,69.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  </QuickviewPresetResultSet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/locations/Global.xml
  
  Index: Global.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <QuickviewPresetResultSet version="1.0.0"  xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../../lib/schemas/locations.xsd">
  	<gml:description>This is the CMB preset zoom document</gml:description>
  	<gml:name>CMB:QuickViewPreset</gml:name>
  	<gml:boundedBy>
  		<gml:Null>missing</gml:Null>
  	</gml:boundedBy>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Afghanistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>59.9,28.66 75.65,39.11</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Africa</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-20.2,-37.6 53.4,35.75</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Albania</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>19.36,39.42 21.39,42.71</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Algeria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-9.47,17.94 13.19,38.14</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Angola</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>11.31,-18.68 24.97,-3.84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Antarctic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-90 180,-66</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Antarctica</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-90 180,-62.83</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Arctic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,66 180,90</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Argentina</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-74.97,-56.71 -51.76,-20.25</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Armenia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>43.53,38.68 47.07,41.48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Asia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>40,-10 180,83.5</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Australia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>111.22,-45.73 155.72,-8.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Austria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>9.27,45.99 17.93,49.38</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Azerbaijan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>44.58,38.04 50.96,42.2</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bangladesh</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>87.95,20.75 93.07,26.62</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Belgium</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>2.54,49.31 6.69,51.69</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Belize</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-89.18,15.78 -87.78,18.64</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Benin</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>0.74,5.97 4.34,12.66</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bhutan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>88.8,26.54 92.37,28.46</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bolivia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-70.05,-23.63 -56.72,-9.13</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bosnia and Herzegovina</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>15.76,42.38 20.02,45.45</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Botswana</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>19.57,-27.41 29.94,-17.32</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Brazil</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-75.64,-35.81 -32.74,7.12</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Brunei</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>114.22,3.96 115.42,5.09</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Bulgaria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>22.19,40.86 29.02,44.59</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Burkina Faso</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-5.72,9.19 2.98,15.54</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Burma</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>91.41,9.22 102.13,29.34</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Burundi</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>28.98,-4.85 31.17,-2.35</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Byelarus</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>22.91,50.82 33.38,56.65</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Cambodia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>102.28,10.07 107.98,14.86</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Cameroon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.22,1.06 16.85,13.65</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Canada</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-145.27,37.3 -48.11,87.61</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Caribbean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-91.4,27.36 -55.4,6.48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Central African Republic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.96,1.5 28.11,11.67</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Central America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-94.1,21.8 -75.8,6.61</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Chad</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>12.88,6.67 24.97,24.19</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Chile</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-77.16,-56.79 -64.9,-15.72</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>China</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>70.83,15.06 137.97,56.58</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Colombia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-79.69,-5 -66.15,13.28</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Congo</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>10.93,-5.41 19.19,3.98</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Costa Rica</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-85.83,7.9 -82.18,11.38</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Croatia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.47,42.09 19.92,46.84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Cuba</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-85.03,19.36 -73.44,23.68</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Cyprus</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>32.23,34.44 34.78,35.78</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Czech Republic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>12.13,48.23 19.38,51.42</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Denmark</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.02,54.68 12.89,58</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Djibouti</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>41.89,10.78 43.77,12.81</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Dominican Republic</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-71.87,17.54 -67.99,20.12</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>East Pacific Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,64.8 -72.7,-75.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ecuador</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-81.08,-5.35 -74.68,1.72</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Egypt</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>24.29,21.29 37.61,32.14</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>El Salvador</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-90.05,13.07 -87.41,14.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Equatorial Guinea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.39,0.76 11.59,3.82</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Eritrea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>36.31,12 43.58,18.41</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Estonia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>23.3,57.29 28.59,59.75</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ethiopia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>32.49,2.63 48.85,15.56</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Europe</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-25.1,71.3 35,34.9</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Finland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.46,59.3 32.14,70.44</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>France</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-5.29,40.65 10.4,51.82</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>French Guiana</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-54.37,1.84 -51.23,5.89</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Gabon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.71,-4.23 15.01,2.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Gambia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-16.71,13.02 -13.66,13.96</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Germany</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>5.68,46.86 15.68,55.41</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ghana</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-3.31,4.39 1.7,11.47</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Greece</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>19.99,34.62 27.19,42.01</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Greenland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-75.34,56.78 -9.36,86.6</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Guatemala</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-92.24,13.59 -87.87,18.06</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Guinea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-15.19,6.77 -6.87,13.02</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Guinea-Bissau</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-16.51,10.97 -13.34,12.8</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Guyana</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-61.41,0.81 -56.12,8.79</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Haiti</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-74.38,17.88 -71.34,20.1</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Honduras</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-89.47,12.75 -82.92,16.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Hungary</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>16.12,45.44 23.57,48.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Iceland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-24.55,62.81 -12.79,67.01</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>India</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>66.79,6.58 99.01,36.96</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Indian Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>22.3,-55.4 119.5,25.2</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Indonesia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>93.11,-12.65 143.45,7.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Iran</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>43.31,24.08 64.42,40.73</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Iraq</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>38.47,28.5 49.25,37.84</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ireland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-10.52,51.23 -5.62,55.49</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Israel</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>34.17,29.25 36.09,33.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Italy</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>6.11,36.15 19.33,47.71</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ivory Coast</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-8.64,4.03 -2.01,10.96</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Jamaica</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-78.22,17.72 -76,18.63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Japan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>128.74,30.1 146.46,46.26</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Jordan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>34.97,28.87 39.75,33.44</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Kazakhstan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>44.73,38.62 89.65,57.49</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Kenya</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>33,-5.3 42.44,5.07</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Democratic People's Republic of Korea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>124.02,43.29 37.55,130.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Republic of Korea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>125.95,38.76 33.06,129.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Kuwait</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>46.62,28.34 48.74,30</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Kyrgyzstan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>69.01,38.7 81.03,43.77</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Laos</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>99.77,13.47 108.1,22.98</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Latvia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.76,55.32 28.76,58.44</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Lebanon</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>35.09,32.84 36.79,34.63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Lesotho</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>27.16,-30.89 29.76,-28.59</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Liberia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-11.47,4.16 -6.95,8.66</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Libya</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>8.79,18.7 26.1,33.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Lithuania</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.86,53.6 27.25,56.73</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Luxembourg</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>5.9,49.42 6.77,50.21</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Macedonia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.62,40.62 23.27,42.48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Madagascar</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>42.83,-26.31 51.38,-11.58</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Malawi</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>32.55,-17.51 36.46,-9.26</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Malaysia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>99.4,-0.2 120.19,7.86</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mali</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-12.77,9.25 5.27,25.83</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mauritania</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-17.47,14.21 -4.04,27.81</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mexico</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-118.48,13.05 -85.18,34.17</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Middle East</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>25,10.7 59.7,36.1</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Moldova</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>26.64,45.31 30.47,48.64</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mongolia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>86.47,40 121.62,53.65</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Montenegro</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>18.56,41.77 20.67,43.64</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Morocco</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-13.52,26.96 -0.28,36.48</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Mozambique</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>29.67,-27.82 41.89,-9.63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Namibia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>11.32,-29.61 25.86,-16.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Nepal</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>79.9,26 88.84,30.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Netherlands</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>3.54,50.56 7.62,53.59</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>New Hampshire</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-72.68,42.57 -70.58,45.43</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>New Jersey</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-75.69,38.8 -73.78,41.47</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>New Mexico</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-109.35,31.04 -102.7,37.3</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>New Zealand</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>166.05,-47.31 179.41,-33.89</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Nicaragua</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-87.7,10.55 -82.87,15.24</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Niger</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-0.39,10.95 16.95,24.28</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Nigeria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>2.33,3.72 15.34,14.4</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>North America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-168.5,18 -50.4,85.7</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>North Atlantic Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-82,0 12,80</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Northern Temperate</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,23 180,60</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Norway</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>3.88,56.69 32.56,81.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Oman</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>51.53,16.19 60.52,26.73</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Pakistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>60.18,22.94 78.66,37.86</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Panama</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-83.06,6.9 -76.63,9.95</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Papua New Guinea</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>140.37,-11.3 153.05,-2.2</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Paraguay</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-62.83,-27.85 -53.6,-18.87</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Peru</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-82.13,-19.35 -67.52,0.79</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Philippines</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>116.68,4.85 127.23,19.22</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Poland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.77,48.57 24.85,55.24</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Portugal</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-9.6,36.75 -5.65,42.36</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Qatar</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>50.97,24.33 51.89,26.17</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Romania</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>20.05,43.29 30.38,48.76</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Russia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>25,23.21 180,71</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Rwanda</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>28.9,-3.01 31.2,-1.03</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Saudi Arabia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>33.9,14.01 57.3,33.22</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Senegal</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-17.53,12.02 -10.89,17.14</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Serbia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>18.8,41.66 23.35,46.39</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Sierra Leone</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-13.16,6.71 -10.02,10.09</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Slovakia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>16.84,47.61 23.06,49.93</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Slovenia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.39,45.28 16.87,47.06</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Somalia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>40.53,-2.55 52.14,12.66</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>South Africa</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>13.68,-35.9 33.98,-21.27</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>South America</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-84.9,-57.6 -32.4,13.7</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>South Atlantic Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-67,-55.4 23,0</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Southern Ocean</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-77 180,-32</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Southern Temperate</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-60 180,-23</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Spain</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-9.69,35.4 3.98,44.38</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Sri Lanka</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>79.69,5.76 82.26,9.89</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Sudan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>21.06,2.6 39.77,22.86</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Suriname</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-58.01,1.53 -53.42,6.23</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Swaziland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>30.93,-27.52 32.45,-25.72</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Sweden</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>10.56,54.63 24.84,69.68</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Switzerland</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>5.92,45.66 10.84,48.02</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Syria</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>35.36,31.84 43.11,37.69</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Taiwan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>119.99,21.78 122.14,25.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Tajikistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>67.34,36.34 75.59,41.46</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Tanzania United Republic of</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>,-0.54 28.96,41.23</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Thailand</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>96.83,4.8 106.42,21.22</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Togo</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-0.09,5.85 2.21,11.33</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Trinidad</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-61.88,10.01 -60.86,10.89</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Tropics</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,-23 180,23</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Tunisia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>7.38,29.87 12.03,37.65</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Turkey</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>25.29,34.91 45.94,43</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Turkmenistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>52.05,34.56 67.66,43.46</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Uganda</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>29.45,-1.82 35.52,4.32</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Ukraine</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>21.4,43.61 41.24,53.31</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>United Arab Emirates</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>51.06,21.82 56.87,26.25</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>United Kingdom</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-8.41,49.49 2.39,59.07</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>United States</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-180,13.71 -61.48,76.63</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Uruguay</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-58.46,-35.26 -52.77,-29.97</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Uzbekistan</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>55.44,36.08 74.31,46.46</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Venezuela</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-73.81,-0.11 -58.91,12.92</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Vietnam</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>101.43,7.75 110.25,24.05</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Virginia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-84.1,36.12 -74.82,39.88</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Western Sahara</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>-17.23,20.87 -8.01,28</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Yemen</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>42.45,12.12 53.74,19.51</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Zaire</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>11.45,-14.4 32.4,6.28</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Zambia</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>21.55,-18.7 34.45,-7.69</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  	<gml:featureMember>
  		<locationDef>
  			<gml:name>Zimbabwe</gml:name>
  			<spatialKeyword>
  				<gml:location>
  					<gml:Envelope srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  						<gml:coordinates>25.11,-22.93 33.65,15.22</gml:coordinates>
  					</gml:Envelope>
  				</gml:location>
  			</spatialKeyword>
  		</locationDef>
  	</gml:featureMember>
  </QuickviewPresetResultSet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/templates/basic.html
  
  Index: basic.html
  ===================================================================
       <table>
        <tr>
          <!--
          <td valign="top" style="padding:0px;width:180;">
           <table>
             <tr><td><div id="locatorMap"></div></td></tr>
             <tr><td style="padding-top:15px;padding-bottom:15px;"> <div id="legend"></div> </td></tr>
             <tr><td id="mapScaleText"></td> </tr>
             <tr><td id="cursorTrack"></td> </tr> 
           </table>
          </td>
          -->
   
          <td>
            <table>
             <tr>
              <td>
                <div id="mainMapPane"/>
                <div id="loading">
                 <p>Loading Program<br/>
                 <img src="../../lib/skin/default/images/Loading.gif"/>
                </p>
               </div>
              </td>
             </tr>
            </table>
          </td>
        </tr>
  
        <tr>
          <td valign="top">
  
            <table>
              <tr>
                <td align="left" id="mainButtonBar"/>
               </tr>
               <tr>
                <td align="left" id="scalebar"/>
              </tr>
            </table>
  
          </td>
        </tr>
        </table>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/templates/basic.xml
  
  Index: basic.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: hhttp://www.gnu.org/copyleft/lesser.html
  
      $Id$
    -->
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
  	<models>
  		<!--Logger id="eventLogDoc">
        <serializeUrl>../../writeXml</serializeUrl>
        <widgets>
          <Widget id="eventLog">
            <stylesheet>../../lib/widget/EventLog.xsl</stylesheet>
          </Widget>
        </widgets>
      </Logger-->
  		<Context id="mainMap">
  			<defaultModelUrl>./wmc/demisWorldMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<MapScaleBar id="scalebar">
          	<!--all of these properties are optional--> 
          	<!--displaySystem>english</displaySystem--> 
          	<displaySystem>metric</displaySystem> 
            <minWidth>100</minWidth>
            <maxWidth>300</maxWidth>
          	<divisions>4</divisions>
            <subdivisions>2</subdivisions>
          	<showMinorMeasures>false</showMinorMeasures>
            <abbreviateLabel>true</abbreviateLabel>
            <singleLine>false</singleLine>
            <align>left</align>  <!-- left, center, or right -->
          </MapScaleBar>
  				<Loading id="loading"/>
          <Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
          </Loading2>
  				<AoiBoxDHTML id="aoiBoxMain">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  					<showXY>false</showXY>
  				</CursorTrack>
  				<Legend id="legend"/>
  				<Widget id="abstract">
  					<stylesheet>../../lib/widget/Abstract.xsl</stylesheet>
  				</Widget>
  				<Widget id="mapTitle">
  					<stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
  				</Widget>
  				<!--AoiForm id="aoiForm"/-->
  				<MapScaleText id="mapScaleText"/>
  				<SaveModel id="saveModelWidget">
  					<htmlTagId>saveModel</htmlTagId>
  				</SaveModel>
  				<LayerControl id="layerControl">
            <moveUpImage>/images/LayerMoveUpDisable.png</moveUpImage>
            <moveDownImage>/images/LayerMoveDownDisable.png</moveDownImage>
            <deleteImage>/images/LayerRemoveDisable.png</deleteImage>
  				</LayerControl>
  				<!--
          <SearchForm id="searchForm">
          </SearchForm>
          -->
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<MouseClickHandler id="mainMouseClick"/>
          <History id="extentHistory">
            <targetModel>mainMap</targetModel>
          </History>
  			</tools>
  		</Context>
  
  <!--
  		<Context id="locator">
  			<defaultModelUrl>./wmc/modisWorld.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="locatorWidget">
  					<htmlTagId>locatorMap</htmlTagId>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<fixedWidth>180</fixedWidth>
  					<extraAttributes>false</extraAttributes>
  				</MapPane>
  				<AoiBoxDHTML id="aoiBoxLocator">
  					<htmlTagId>locatorMap</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<ModelUrlInput id="urlInput">
  					<defaultUrl>../data/context/modisWorld.xml</defaultUrl>
  				</ModelUrlInput>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="locatorAoi"/>
  				<ZoomToAoi id="locatorZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Context>
                  -->
  
  		<ContextCollection id="collectionGroup">
  			<defaultModelUrl>../data/context/demoCollection.xml</defaultModelUrl>
  			<widgets>
  				<CollectionList id="collectionList">
  					<targetModel>mainMap</targetModel>
  				</CollectionList>
  			</widgets>
  		</ContextCollection>
  		<Model id="locations">
  			<defaultModelUrl>./locations/Global.xml</defaultModelUrl>
  			<widgets>
  				<Locations id="locationsSelect">
  					<targetModel>mainMap</targetModel>
  				</Locations>
  			</widgets>
  			<tools>
  				<ZoomToAoi id="locationsZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Model>
  		<Transaction id="transaction">
  			<widgets>
  				<TransactionResponse id="transactionResponse">
          </TransactionResponse>
  			</widgets>
  		</Transaction>
      <Model id="featureInfoResponse" template="true">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <FeatureInfo id="features">
            <htmlTagId>featureInfo</htmlTagId>
          </FeatureInfo>
        </widgets>
      </Model>
  		<FeatureCollection id="featureCollection">
  			<widgets>
  				<GmlRendererWZ id="testGmlRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			
  			</widgets>
  			<namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
  		</FeatureCollection>
  		<FeatureCollection id="ntsGml" template="true">
  			<!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
  			<widgets>
  				<GmlRendererWZ id="testNTSRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF00FF</lineColor>
  					<lineWidth>2</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			</widgets>
  		</FeatureCollection>
  		<FeatureCollection id="watershedGml">
  			<!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
  			<widgets>
  				<GmlRendererWZ id="watershedRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#0000FF</lineColor>
  					<lineWidth>1</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			</widgets>
  		</FeatureCollection>
  		<!-- example of the point feature renderer
      <FeatureCollection id="pointFeatures">
        <defaultModelUrl>../data/gml/topp_cities.xml</defaultModelUrl>
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <nodeSelectXpath>/wfs:FeatureCollection/gml:featureMember/topp:tasmania_cities</nodeSelectXpath>
        <widgets>
          <GmlPointRenderer id="pointRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
            <normalImage>/images/MarkerA.gif</normalImage>
            <highlightImage>/images/MarkerB.gif</highlightImage>
          </GmlPointRenderer>
        </widgets>
      </FeatureCollection>
      -->
  		<WmsCapabilities id="wmsCapTemplate">
  			<widgets>
  				<Widget id="loadAllLayers">
  					<stylesheet>../../lib/widget/SelectAllMapLayers.xsl</stylesheet>
  				</Widget>
  				<ModelStatus id="wmsLoadStatus">
  					<htmlTagId>layerList</htmlTagId>
  					<outputNodeId>layerListCanvas</outputNodeId>
  				</ModelStatus>
  				<Widget id="layerListWidget">
  					<htmlTagId>layerList</htmlTagId>
  					<outputNodeId>layerListCanvas</outputNodeId>
  					<stylesheet>../../lib/widget/SelectMapLayers.xsl</stylesheet>
  				</Widget>
  			</widgets>
  			<tools>
  				<Caps2Context id="convertCaps">
  					<targetModel>mainMap</targetModel>
  				</Caps2Context>
          <EditContext id="editContext">
            <targetModel>mainMap</targetModel>
          </EditContext>
  			</tools>
  			<nodeSelectXpath>//Layer</nodeSelectXpath>
  		</WmsCapabilities>
  	</models>
  	<widgets>
  		<ModelUrlInput id="wmsCapsUrlInput">
  			<targetModel>wmsCapTemplate</targetModel>
  			<defaultUrl>http://localhost:8080/geoserver/wms/GetCapabilities</defaultUrl>
  		</ModelUrlInput>
  		<WebServiceForm id="ntsLookupForm">
  			<targetModel>ntsGml</targetModel>
  			<stylesheet>../../lib/widget/NtsForm.xsl</stylesheet>
  			<webServiceUrl>http://geoservices.cgdi.ca/NTS/NTSLookup</webServiceUrl>
  		</WebServiceForm>
  		<WebServiceForm id="watershedLookupForm">
  			<htmlTagId>ntsLookupForm</htmlTagId>
  			<targetModel>watershedGml</targetModel>
  			<stylesheet>../../lib/widget/CdnWatershedForm.xsl</stylesheet>
  			<webServiceUrl>http://devgeo.cciw.ca:8080/WatershedLookupServlet/WatershedLookupServlet</webServiceUrl>
  		</WebServiceForm>
      <Back id="back">
        <buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/UndoDisable.png</disabledSrc>
      </Back>
      <Forward id="forward">
        <buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/RedoDisable.png</disabledSrc>
      </Forward>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<SetAoi id="setAoi">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/SetAoiEnable.png</enabledSrc>
  			<disabledSrc>/images/SetAoiDisable.png</disabledSrc>
  		</SetAoi>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<GetFeatureInfo id="getFeatureInfo">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureInfoResponse</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/QueryEnable.png</enabledSrc>
  			<disabledSrc>/images/QueryDisable.png</disabledSrc>
  			<context>mainMap</context>
  		</GetFeatureInfo>
  		<!--EditPoint id="editPoint">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditPointEnable.png</enabledSrc>
  			<disabledSrc>/images/EditPointDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>http://localhost:8080/geoserver/wfs</webServiceUrl>
  			<featureXpath>/gml:featureMember/points/_SHAPE_/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
  			<defaultModelUrl>../data/gml/defaultAddPoint.xml</defaultModelUrl>
  			<targetContext>mainMap</targetContext>
  		</EditPoint-->
  		<!--EditLine id="editLine">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditLineEnable.png</enabledSrc>
  			<disabledSrc>/images/EditLineDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>http://localhost:8080/geoserver/wfs</webServiceUrl>
  			<featureXpath>/gml:featureMember/topp:bc_roads/topp:the_geom/gml:MultiLineString/gml:lineStringMember/gml:LineString/gml:coordinates</featureXpath>
  			<defaultModelUrl>../data/gml/roads.xml</defaultModelUrl>
  			<targetContext>mainMap</targetContext>
  		</EditLine-->
  		<!-- <Save id="save">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/SaveDisable.png</disabledSrc>
  			<popupWindowName>modelXML</popupWindowName>
  		</Save> -->
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<languages>en,fr,fr-CA</languages>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skinDir + language subdir -->
  	<!-- example of overriding the server config values -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/templates/basic_layers.html
  
  Index: basic_layers.html
  ===================================================================
  
       <table>
        <tr>
          <td>
            <table>
             <tr>
              <td>
                <div id="mainMapPane"/>
                <div id="loading">
                 <p>Loading Program<br/>
                 <img src="../../lib/skin/default/images/Loading.gif"/>
                </p>
               </div>
              </td>
             </tr>
            </table>
          </td>
        </tr>
  
        <tr>
          <td valign="top">
  
            <table>
              <tr>
                <td align="left" id="mainButtonBar"/>
               </tr>
        <tr> 
          <td style="padding-top:5px;padding-bottom:5px;">
            <div id="legend"></div> 
          </td>
        </tr>
            </table>
  
          </td>
        </tr>
  
        </table>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/templates/basic_layers.xml
  
  Index: basic_layers.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: hhttp://www.gnu.org/copyleft/lesser.html
  
      $Id$
    -->
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
  	<models>
  		<!--Logger id="eventLogDoc">
        <serializeUrl>../../writeXml</serializeUrl>
        <widgets>
          <Widget id="eventLog">
            <stylesheet>../../lib/widget/EventLog.xsl</stylesheet>
          </Widget>
        </widgets>
      </Logger-->
  		<Context id="mainMap">
  			<defaultModelUrl>./wmc/demisWorldMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<Loading id="loading"/>
                  <Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
                  </Loading2>
  				<AoiBoxDHTML id="aoiBoxMain">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<!-- <CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  					<showXY>false</showXY>
  				</CursorTrack> -->
  				<Legend id="legend"/>
  				<Widget id="abstract">
  					<stylesheet>../../lib/widget/Abstract.xsl</stylesheet>
  				</Widget>
  				<Widget id="mapTitle">
  					<stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
  				</Widget>
  				<MapScaleText id="mapScaleText"/>
  				<SaveModel id="saveModelWidget">
  					<htmlTagId>saveModel</htmlTagId>
  				</SaveModel>
  				<LayerControl id="layerControl">
            <moveUpImage>/images/LayerMoveUpDisable.png</moveUpImage>
            <moveDownImage>/images/LayerMoveDownDisable.png</moveDownImage>
            <deleteImage>/images/LayerRemoveDisable.png</deleteImage>
  				</LayerControl>
  
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<MouseClickHandler id="mainMouseClick"/>
          <History id="extentHistory">
            <targetModel>mainMap</targetModel>
          </History>
  			</tools>
  		</Context>
  
  		<ContextCollection id="collectionGroup">
  			<defaultModelUrl>../data/context/demoCollection.xml</defaultModelUrl>
  			<widgets>
  				<CollectionList id="collectionList">
  					<targetModel>mainMap</targetModel>
  				</CollectionList>
  			</widgets>
  		</ContextCollection>
  		<Model id="locations">
  			<defaultModelUrl>./locations/Global.xml</defaultModelUrl>
  			<widgets>
  				<Locations id="locationsSelect">
  					<targetModel>mainMap</targetModel>
  				</Locations>
  			</widgets>
  			<tools>
  				<ZoomToAoi id="locationsZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Model>
  		<Transaction id="transaction">
  			<widgets>
  				<TransactionResponse id="transactionResponse">
          </TransactionResponse>
  			</widgets>
  		</Transaction>
      <Model id="featureInfoResponse" template="true">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <FeatureInfo id="features">
            <htmlTagId>featureInfo</htmlTagId>
          </FeatureInfo>
        </widgets>
      </Model>
  		<FeatureCollection id="featureCollection">
  			<widgets>
  				<GmlRendererWZ id="testGmlRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			
  			</widgets>
  			<namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
  		</FeatureCollection>
  		<FeatureCollection id="ntsGml" template="true">
  			<!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
  			<widgets>
  				<GmlRendererWZ id="testNTSRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF00FF</lineColor>
  					<lineWidth>2</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			</widgets>
  		</FeatureCollection>
  		<FeatureCollection id="watershedGml">
  			<!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
  			<widgets>
  				<GmlRendererWZ id="watershedRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#0000FF</lineColor>
  					<lineWidth>1</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			</widgets>
  		</FeatureCollection>
  		<!-- example of the point feature renderer
      <FeatureCollection id="pointFeatures">
        <defaultModelUrl>../data/gml/topp_cities.xml</defaultModelUrl>
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <nodeSelectXpath>/wfs:FeatureCollection/gml:featureMember/topp:tasmania_cities</nodeSelectXpath>
        <widgets>
          <GmlPointRenderer id="pointRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
            <normalImage>/images/MarkerA.gif</normalImage>
            <highlightImage>/images/MarkerB.gif</highlightImage>
          </GmlPointRenderer>
        </widgets>
      </FeatureCollection>
      -->
  		<WmsCapabilities id="wmsCapTemplate">
  			<widgets>
  				<Widget id="loadAllLayers">
  					<stylesheet>../../lib/widget/SelectAllMapLayers.xsl</stylesheet>
  				</Widget>
  				<ModelStatus id="wmsLoadStatus">
  					<htmlTagId>layerList</htmlTagId>
  					<outputNodeId>layerListCanvas</outputNodeId>
  				</ModelStatus>
  				<Widget id="layerListWidget">
  					<htmlTagId>layerList</htmlTagId>
  					<outputNodeId>layerListCanvas</outputNodeId>
  					<stylesheet>../../lib/widget/SelectMapLayers.xsl</stylesheet>
  				</Widget>
  			</widgets>
  			<tools>
  				<Caps2Context id="convertCaps">
  					<targetModel>mainMap</targetModel>
  				</Caps2Context>
          <EditContext id="editContext">
            <targetModel>mainMap</targetModel>
          </EditContext>
  			</tools>
  			<nodeSelectXpath>//Layer</nodeSelectXpath>
  		</WmsCapabilities>
  	</models>
  	<widgets>
  		<ModelUrlInput id="wmsCapsUrlInput">
  			<targetModel>wmsCapTemplate</targetModel>
  			<defaultUrl>http://localhost:8080/geoserver/wms/GetCapabilities</defaultUrl>
  		</ModelUrlInput>
  		<WebServiceForm id="ntsLookupForm">
  			<targetModel>ntsGml</targetModel>
  			<stylesheet>../../lib/widget/NtsForm.xsl</stylesheet>
  			<webServiceUrl>http://geoservices.cgdi.ca/NTS/NTSLookup</webServiceUrl>
  		</WebServiceForm>
  		<WebServiceForm id="watershedLookupForm">
  			<htmlTagId>ntsLookupForm</htmlTagId>
  			<targetModel>watershedGml</targetModel>
  			<stylesheet>../../lib/widget/CdnWatershedForm.xsl</stylesheet>
  			<webServiceUrl>http://devgeo.cciw.ca:8080/WatershedLookupServlet/WatershedLookupServlet</webServiceUrl>
  		</WebServiceForm>
      <Back id="back">
        <buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/UndoDisable.png</disabledSrc>
      </Back>
      <Forward id="forward">
        <buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/RedoDisable.png</disabledSrc>
      </Forward>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<SetAoi id="setAoi">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/SetAoiEnable.png</enabledSrc>
  			<disabledSrc>/images/SetAoiDisable.png</disabledSrc>
  		</SetAoi>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<GetFeatureInfo id="getFeatureInfo">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureInfoResponse</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/QueryEnable.png</enabledSrc>
  			<disabledSrc>/images/QueryDisable.png</disabledSrc>
  			<context>mainMap</context>
  		</GetFeatureInfo>
  		<!--EditPoint id="editPoint">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditPointEnable.png</enabledSrc>
  			<disabledSrc>/images/EditPointDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>http://localhost:8080/geoserver/wfs</webServiceUrl>
  			<featureXpath>/gml:featureMember/points/_SHAPE_/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
  			<defaultModelUrl>../data/gml/defaultAddPoint.xml</defaultModelUrl>
  			<targetContext>mainMap</targetContext>
  		</EditPoint-->
  		<!--EditLine id="editLine">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditLineEnable.png</enabledSrc>
  			<disabledSrc>/images/EditLineDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>http://localhost:8080/geoserver/wfs</webServiceUrl>
  			<featureXpath>/gml:featureMember/topp:bc_roads/topp:the_geom/gml:MultiLineString/gml:lineStringMember/gml:LineString/gml:coordinates</featureXpath>
  			<defaultModelUrl>../data/gml/roads.xml</defaultModelUrl>
  			<targetContext>mainMap</targetContext>
  		</EditLine-->
  		<!-- <Save id="save">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/SaveDisable.png</disabledSrc>
  			<popupWindowName>modelXML</popupWindowName>
  		</Save> -->
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<languages>en,fr,fr-CA</languages>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skinDir + language subdir -->
  	<!-- example of overriding the server config values -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/templates/default.html
  
  Index: default.html
  ===================================================================
       <table>
        <tr>
          <td valign="top" style="padding:0px;width:180;">
           <table>
             <tr><td><div id="locatorMap"></div></td></tr>
             <tr><td style="padding-top:15px;padding-bottom:15px;"> <div id="legend"></div> </td></tr>
             <tr><td id="mapScaleText"></td> </tr>
             <tr><td id="cursorTrack"></td> </tr>
           </table>
          </td>
          
          <td>
            <table>
             <tr>
              <td style="padding-left:45px; width:300px"> <h2 id="mapTitle"></h2> </td>
              <td id="locationsSelect"> </td>
             </tr>
             <tr>
              <td colspan="2">
                <div id="mainMapPane"/>
                <div id="loading">
                 <p>Loading Program<br/>
                 <img src="../../lib/skin/default/images/Loading.gif"/>
                </p>
               </div>
              </td>
             </tr>
            </table>
          </td>
        </tr>
  
        <tr>
          <td/>
          <td valign="top">
  
            <table>
              <tr>
                <td align="left">
                  <div id="mainButtonBar"/>
                </td>
                <td colspan="1" align="left" id="scalebar"/>
              </tr>
            </table>
  
          </td>
        </tr>
        </table>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/templates/default.xml
  
  Index: default.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: hhttp://www.gnu.org/copyleft/lesser.html
  
      $Id$
    -->
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
  	<models>
  		<!--Logger id="eventLogDoc">
        <serializeUrl>../../writeXml</serializeUrl>
        <widgets>
          <Widget id="eventLog">
            <stylesheet>../../lib/widget/EventLog.xsl</stylesheet>
          </Widget>
        </widgets>
      </Logger-->
  		<Context id="mainMap">
  			<defaultModelUrl>./wmc/demisWorldMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<MapScaleBar id="scalebar">
          	<!--all of these properties are optional--> 
          	<!--displaySystem>english</displaySystem--> 
          	<displaySystem>metric</displaySystem> 
            <minWidth>100</minWidth>
            <maxWidth>300</maxWidth>
          	<divisions>4</divisions>
            <subdivisions>2</subdivisions>
          	<showMinorMeasures>false</showMinorMeasures>
            <abbreviateLabel>true</abbreviateLabel>
            <singleLine>false</singleLine>
            <align>left</align>  <!-- left, center, or right -->
          </MapScaleBar>
  				<Loading id="loading"/>
          <Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
          </Loading2>
  				<AoiBoxDHTML id="aoiBoxMain">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  					<showXY>false</showXY>
  				</CursorTrack>
  				<Legend id="legend"/>
  				<Widget id="abstract">
  					<stylesheet>../../lib/widget/Abstract.xsl</stylesheet>
  				</Widget>
  				<Widget id="mapTitle">
  					<stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
  				</Widget>
  				<!--AoiForm id="aoiForm"/-->
  				<MapScaleText id="mapScaleText"/>
  				<SaveModel id="saveModelWidget">
  					<htmlTagId>saveModel</htmlTagId>
  				</SaveModel>
  				<LayerControl id="layerControl">
            <moveUpImage>/images/LayerMoveUpDisable.png</moveUpImage>
            <moveDownImage>/images/LayerMoveDownDisable.png</moveDownImage>
            <deleteImage>/images/LayerRemoveDisable.png</deleteImage>
  				</LayerControl>
  				<!--
          <SearchForm id="searchForm">
          </SearchForm>
          -->
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<MouseClickHandler id="mainMouseClick"/>
          <History id="extentHistory">
            <targetModel>mainMap</targetModel>
          </History>
  			</tools>
  		</Context>
  		<Context id="locator">
  			<defaultModelUrl>./wmc/modisWorld.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="locatorWidget">
  					<htmlTagId>locatorMap</htmlTagId>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<fixedWidth>180</fixedWidth>
  					<extraAttributes>false</extraAttributes>
  				</MapPane>
  				<AoiBoxDHTML id="aoiBoxLocator">
  					<htmlTagId>locatorMap</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<ModelUrlInput id="urlInput">
  					<defaultUrl>../data/context/modisWorld.xml</defaultUrl>
  				</ModelUrlInput>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="locatorAoi"/>
  				<ZoomToAoi id="locatorZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Context>
  		<ContextCollection id="collectionGroup">
  			<defaultModelUrl>../data/context/demoCollection.xml</defaultModelUrl>
  			<widgets>
  				<CollectionList id="collectionList">
  					<targetModel>mainMap</targetModel>
  				</CollectionList>
  			</widgets>
  		</ContextCollection>
  		<Model id="locations">
  			<defaultModelUrl>./locations/Global.xml</defaultModelUrl>
  			<widgets>
  				<Locations id="locationsSelect">
  					<targetModel>mainMap</targetModel>
  				</Locations>
  			</widgets>
  			<tools>
  				<ZoomToAoi id="locationsZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Model>
  		<Transaction id="transaction">
  			<widgets>
  				<TransactionResponse id="transactionResponse">
          </TransactionResponse>
  			</widgets>
  		</Transaction>
      <Model id="featureInfoResponse" template="true">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <FeatureInfo id="features">
            <htmlTagId>featureInfo</htmlTagId>
          </FeatureInfo>
        </widgets>
      </Model>
  		<FeatureCollection id="featureCollection">
  			<widgets>
  				<GmlRendererWZ id="testGmlRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			
  			</widgets>
  			<namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
  		</FeatureCollection>
  		<FeatureCollection id="ntsGml" template="true">
  			<!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
  			<widgets>
  				<GmlRendererWZ id="testNTSRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF00FF</lineColor>
  					<lineWidth>2</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			</widgets>
  		</FeatureCollection>
  		<FeatureCollection id="watershedGml">
  			<!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
  			<widgets>
  				<GmlRendererWZ id="watershedRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#0000FF</lineColor>
  					<lineWidth>1</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  			</widgets>
  		</FeatureCollection>
  		<!-- example of the point feature renderer
      <FeatureCollection id="pointFeatures">
        <defaultModelUrl>../data/gml/topp_cities.xml</defaultModelUrl>
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <nodeSelectXpath>/wfs:FeatureCollection/gml:featureMember/topp:tasmania_cities</nodeSelectXpath>
        <widgets>
          <GmlPointRenderer id="pointRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
            <normalImage>/images/MarkerA.gif</normalImage>
            <highlightImage>/images/MarkerB.gif</highlightImage>
          </GmlPointRenderer>
        </widgets>
      </FeatureCollection>
      -->
  		<WmsCapabilities id="wmsCapTemplate">
  			<widgets>
  				<Widget id="loadAllLayers">
  					<stylesheet>../../lib/widget/SelectAllMapLayers.xsl</stylesheet>
  				</Widget>
  				<ModelStatus id="wmsLoadStatus">
  					<htmlTagId>layerList</htmlTagId>
  					<outputNodeId>layerListCanvas</outputNodeId>
  				</ModelStatus>
  				<Widget id="layerListWidget">
  					<htmlTagId>layerList</htmlTagId>
  					<outputNodeId>layerListCanvas</outputNodeId>
  					<stylesheet>../../lib/widget/SelectMapLayers.xsl</stylesheet>
  				</Widget>
  			</widgets>
  			<tools>
  				<Caps2Context id="convertCaps">
  					<targetModel>mainMap</targetModel>
  				</Caps2Context>
          <EditContext id="editContext">
            <targetModel>mainMap</targetModel>
          </EditContext>
  			</tools>
  			<nodeSelectXpath>//Layer</nodeSelectXpath>
  		</WmsCapabilities>
  	</models>
  	<widgets>
  		<ModelUrlInput id="wmsCapsUrlInput">
  			<targetModel>wmsCapTemplate</targetModel>
  			<defaultUrl>http://localhost:8080/geoserver/wms/GetCapabilities</defaultUrl>
  		</ModelUrlInput>
  		<WebServiceForm id="ntsLookupForm">
  			<targetModel>ntsGml</targetModel>
  			<stylesheet>../../lib/widget/NtsForm.xsl</stylesheet>
  			<webServiceUrl>http://geoservices.cgdi.ca/NTS/NTSLookup</webServiceUrl>
  		</WebServiceForm>
  		<WebServiceForm id="watershedLookupForm">
  			<htmlTagId>ntsLookupForm</htmlTagId>
  			<targetModel>watershedGml</targetModel>
  			<stylesheet>../../lib/widget/CdnWatershedForm.xsl</stylesheet>
  			<webServiceUrl>http://devgeo.cciw.ca:8080/WatershedLookupServlet/WatershedLookupServlet</webServiceUrl>
  		</WebServiceForm>
      <Back id="back">
        <buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/UndoDisable.png</disabledSrc>
      </Back>
      <Forward id="forward">
        <buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/RedoDisable.png</disabledSrc>
      </Forward>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<SetAoi id="setAoi">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/SetAoiEnable.png</enabledSrc>
  			<disabledSrc>/images/SetAoiDisable.png</disabledSrc>
  		</SetAoi>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<GetFeatureInfo id="getFeatureInfo">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureInfoResponse</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/QueryEnable.png</enabledSrc>
  			<disabledSrc>/images/QueryDisable.png</disabledSrc>
  			<context>mainMap</context>
  		</GetFeatureInfo>
  		<!--EditPoint id="editPoint">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditPointEnable.png</enabledSrc>
  			<disabledSrc>/images/EditPointDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>http://localhost:8080/geoserver/wfs</webServiceUrl>
  			<featureXpath>/gml:featureMember/points/_SHAPE_/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
  			<defaultModelUrl>../data/gml/defaultAddPoint.xml</defaultModelUrl>
  			<targetContext>mainMap</targetContext>
  		</EditPoint-->
  		<!--EditLine id="editLine">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditLineEnable.png</enabledSrc>
  			<disabledSrc>/images/EditLineDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>http://localhost:8080/geoserver/wfs</webServiceUrl>
  			<featureXpath>/gml:featureMember/topp:bc_roads/topp:the_geom/gml:MultiLineString/gml:lineStringMember/gml:LineString/gml:coordinates</featureXpath>
  			<defaultModelUrl>../data/gml/roads.xml</defaultModelUrl>
  			<targetContext>mainMap</targetContext>
  		</EditLine-->
  		<!-- <Save id="save">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/SaveDisable.png</disabledSrc>
  			<popupWindowName>modelXML</popupWindowName>
  		</Save> -->
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<languages>en,fr,fr-CA</languages>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skinDir + language subdir -->
  	<!-- example of overriding the server config values -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/wmc/demisWorldMap.xml
  
  Index: demisWorldMap.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  	<General>
      <Title>Metacat Map</Title>
  		<Window width="600" height="300"/>
  		<BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <KeywordList>
        <Keyword>OGC WMS</Keyword>
        <Keyword>Web Map Service</Keyword>
        <Keyword>VMap0</Keyword>
        <Keyword>DCW</Keyword>
        <Keyword>SRTM</Keyword>
        <Keyword>ETOPO2</Keyword>
      </KeywordList>
      <Abstract>Digital chart of the World, 1:1000,000 scale basemap from various public domain data sources</Abstract>
      <LogoURL width="198" height="83" format="image/jpg">
        <OnlineResource xlink:type="simple" xlink:href="http://www.demis.nl/home/images/OGCCompliant.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://www.demis.nl/home/pages/wms/demiswms.htm"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Bart Adriaanse</ContactPerson>
          <ContactOrganization>Demis bv. The Netherlands</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>GIS &amp; Software Engineer</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>Rotterdamseweg 183C</Address>
          <City>Delft</City>
          <StateOrProvince>ZH</StateOrProvince>
          <PostCode>2629HD</PostCode>
          <Country>Netherlands</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+31152682510</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+31152682507</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>contact at demis.nl</ContactElectronicMailAddress>
      </ContactInformation>
  	</General>
  	<LayerList>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  			</Server>
  			<Name>Bathymetry,Countries,Topography,Hillshading</Name>
  			<Title>Topography</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  			</Server>
  			<Name>Coastlines,Waterbodies,Inundated,Rivers,Streams</Name>
  			<Title>Landscape features</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  			</Server>
  			<Name>Builtup+areas,Railroads,Highways,Roads,Trails,Borders,Cities,Settlements,Airports</Name>
  			<Title>Man-made features</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
                  <!--
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
  			</Server>
  			<Name>Spot+elevations,Ocean+features</Name>
  			<Title>Misc. features</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
                  -->
  	</LayerList>
  </ViewContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/wmc/knp.xml
  
  Index: knp.xml
  ===================================================================
  <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world"
  xmlns="http://www.opengis.net/context"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="250" height="375" />
      <BoundingBox SRS="EPSG:4326" minx="30" miny="-26.5" maxx="33" maxy="-21.5" />
      <Title>Krueger National Park</Title>
      <KeywordList>
        <Keyword>metacat</Keyword>
        <Keyword>EML</Keyword>
      </KeywordList>
      <Abstract>Low resolution.</Abstract>
    </General>
    <LayerList>
      
      <Layer queryable="0" hidden="1">
      <Server service="wms" version="1.1.0" title="wms">
      <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"  xlink:type="simple" xlink:href="http://wms.jpl.nasa.gov/wms.cgi?"/>
      </Server>
      <Name>global_mosaic</Name> 
      <!-- <Name>BMNG</Name> -->
      <Title>satellite imagery</Title>
      <SRS>EPSG:4326</SRS>
      <FormatList>
      <Format current="1">image/jpeg</Format>
      </FormatList>
      </Layer>
     
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="/knb/wms" />
        </Server>
        <Name>knb:SOILS_VENTER</Name>
        <Title>Kruger soils</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
  
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="/knb/wms" />
        </Server>
        <Name>knb:INFRA_ROADSPUBLIC_VIEW</Name>
        <Title>Kruger Park roads</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
  	
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="/knb/wms" />
        </Server>
        <Name>knb:BNDRY_BUSINESSUNITS</Name>
        <Title>Kruger Park business units</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
     
      
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="/knb/wms" />
        </Server>
        <Name>knb:BNDRY_KRUGERNP</Name>
        <Title>Kruger Park boundaries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
  
  
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="Datasets">
          <OnlineResource xlink:type="simple" xlink:href="/knb/wms" />
        </Server>
        <Name>knb:metacat_testdata</Name>
        <Title>Datasets</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/wmc/modisWorld.xml
  
  Index: modisWorld.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
  <ViewContext  version="1.0.0" 
                id="GDP-SearchMapContext-Modis" 
                xmlns="http://www.opengis.net/context" 
                xmlns:xlink="http://www.w3.org/1999/xlink" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:gdp="http://geodiscover.cgdi.ca"
                xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengeospatial.net/context/1.0.0/context.xsd">
    <General>
      <Window width="500" height="250"/>
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <Title>MODIS composite</Title>
      <KeywordList>
        <Keyword>MODIS</Keyword>
      </KeywordList>
      <Abstract>background map for use in search map widget</Abstract>
      <LogoURL width="34" height="35" format="image/gif">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/hmi/common/images/ml/ES.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/gdp/about/en/9.1.4.html"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
        <ContactPerson>Michael Adair</ContactPerson>
        <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+1 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+1 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
  
    <LayerList>
      <!-- 
        <Layer hidden="0" queryable="0">
        <Server version="1.1.0" service="OGC">
          <OnlineResource xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi" xlink:type="simple"/>
        </Server>
        <Name>COASTL_BND_1M:Foundation</Name> 
        <Title>Coastlines</Title> 
        <Abstract>info</Abstract>
        <DataURL>
          <OnlineResource xlink:href="http://www.cits.rncan.gc.ca/" xlink:type="simple"/>
        </DataURL>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
        <Extension>
          <LatLongBoundingBox xmlns="gdp" SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
        </Extension>
      </Layer>
      -->
  
      <!--
        <Layer hidden="0" queryable="0">
        <Server version="1.1.0" service="OGC">
          <OnlineResource xlink:href="http://mapserv2.esrin.esa.it/cubestor/cubeserv/cubeserv.cgi" xlink:type="simple"/>
        </Server>
        <Name>WORLD_MODIS_1KM:MapAdmin</Name>
        <Title>Modis world composite</Title>
        <Abstract>info</Abstract>
        <DataURL>
          <OnlineResource xlink:href="http://www.cits.rncan.gc.ca/" xlink:type="simple"/>
        </DataURL>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/jpg</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
        <Extension>
          <LatLongBoundingBox xmlns="gdp" SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
        </Extension>
      </Layer>
  
      <Layer hidden="0" queryable="0">
        <Server version="1.1.0" service="OGC">
          <OnlineResource xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi" xlink:type="simple"/>
        </Server>
        <Name>POLBNDL_BND_1M:Foundation</Name>
        <Title>Political Boundaries</Title>
        <Abstract>info</Abstract>
        <DataURL>
          <OnlineResource xlink:href="http://www.cits.rncan.gc.ca/" xlink:type="simple"/>
        </DataURL>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>default</Name>
            <Title>default</Title>
          </Style>
        </StyleList>
        <Extension>
          <LatLongBoundingBox xmlns="gdp" SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
        </Extension>
      </Layer>
      -->
  
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://wms.jpl.nasa.gov/wms.cgi?"/>
        </Server>
        <Name>modis</Name>
        <Title>Blue Marble</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/jpeg</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat/wmc/world.xml
  
  Index: world.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  	<General>
      <Title>World Map</Title>
  		<Window width="600" height="300"/>
  		<BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <KeywordList>
        <Keyword>OGC WMS</Keyword>
        <Keyword>Web Map Service</Keyword>
        <Keyword>VMap0</Keyword>
        <Keyword>DCW</Keyword>
        <Keyword>SRTM</Keyword>
        <Keyword>ETOPO2</Keyword>
      </KeywordList>
      <Abstract>Digital chart of the World, 1:1000,000 scale basemap from various public domain data sources</Abstract>
      <LogoURL width="198" height="83" format="image/jpg">
        <OnlineResource xlink:type="simple" xlink:href="http://www.demis.nl/home/images/OGCCompliant.gif"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://www.demis.nl/home/pages/wms/demiswms.htm"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Bart Adriaanse</ContactPerson>
          <ContactOrganization>Demis bv. The Netherlands</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>GIS &amp; Software Engineer</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>Rotterdamseweg 183C</Address>
          <City>Delft</City>
          <StateOrProvince>ZH</StateOrProvince>
          <PostCode>2629HD</PostCode>
          <Country>Netherlands</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+31152682510</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+31152682507</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>contact at demis.nl</ContactElectronicMailAddress>
      </ContactInformation>
  	</General>
  	<LayerList>
  
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://pmark.msi.ucsb.edu/fcgi-bin/wms"/>
  			</Server>
  			<Name>land,borders</Name>
  			<Title>World</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/jpeg</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>,</Name>
  					<Title>,</Title>
  				</Style>
  			</StyleList>
  		</Layer>
  
  	</LayerList>
  </ViewContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/africa_frame.html
  
  Index: africa_frame.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css">
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css">
  <!--
  <link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet">
  <script src="./knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script>
  <script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script><script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script>
  -->
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='africa_frame_config.xml';
      </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  </head>
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  
  <table border="0">
  	<tr>
      <td rowspan="2" valign="top" />
  		<table border="0">
  			<tr> 
  			</tr>
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="left">
  
          <table border="0">
            <tr>
              <!-- <td align="center" id="mapScaleText"/>
  				    <td colspan="1"></td>
              <td align="center" id="cursorTrack" /> -->
            </tr>
        			<tr> <td id="locatorMap" style="display:none"/> </tr>
        			<tr> <td id="mainButtonBar" />  </tr>
        			<tr> <td id="legend" valign="top"/> </tr> 
        			<tr> <td colspan="3" id="featureList" /> </tr>
          </table>
  			</tr>
        
        
  		</table>
  		</td>
  	</tr>
  </table>
  
  <div id="debug"></div>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/africa_frame_config.xml
  
  Index: africa_frame_config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>africa_frame_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
      
      <Context id="locator">
        <defaultModelUrl>africa_frame_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
  
      <Transaction id="transaction">
        <widgets>
          <TransactionResponse id="transactionResponse">
          </TransactionResponse>
        </widgets>
      </Transaction>
      <FeatureCollection id="featureCollection">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <GmlRendererWZ id="testGmlRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
          </GmlRendererWZ>
          <FeatureList id="featureList">
          </FeatureList>
        </widgets>
      </FeatureCollection>
    </models>
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click map or drag to zoom in</tooltip>
        <!--tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip-->
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click map to zoom out</tooltip>
        <!--tooltip xml:lang="fr">cliquer pour rée</tooltip-->
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to pan</tooltip>
        <!--tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip-->
      </DragPan>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
        <tooltip xml:lang="en">reset the map to full extent</tooltip>
        <!--tooltip xml:lang="fr">redonner la carte ses dimensions complèts</tooltip-->
      </Reset>
  
  	<!--
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:the_geom/gml:Point/gml:coordinates</featureXpath>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:ID</featureXpath>
        <defaultModelUrl>template_metacat.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditPoint>
      -->
  
      <GetFeatureInfo id="getFeatureInfo">
        <buttonBar>mainButtonBar</buttonBar>
         <targetModel>mainMap</targetModel>
       <!-- <targetModel>featureCollection</targetModel> -->
        <context>mainMap</context>
        <!-- <mouseHandler>mainMouseClick</mouseHandler> -->
         <mouseHandler>mainAoi</mouseHandler>
        <!-- <mouseHandler>mainAoi</mouseHandler> -->
        <class>RadioButton</class>
      <enabledSrc>/images/QueryEnable.gif</enabledSrc>
      <disabledSrc>/images/QueryDisable.gif</disabledSrc>
  	  <tooltip xml:lang="en">select single dataset</tooltip>
      </GetFeatureInfo>
    <!--SetAoi id="setAoi">
    <buttonBar>mainButtonBar</buttonBar>
    <targetModel>mainMap</targetModel>
    <mouseHandler>mainAoi</mouseHandler>
    <class>RadioButton</class>
    <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
    <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
    </SetAoi-->
  
    <AoiMetacatQuery id="aoiMetacatQuery">
  	  <buttonBar>mainButtonBar</buttonBar>
  	  <targetModel>mainMap</targetModel>
  	  <mouseHandler>mainAoi</mouseHandler>
  	  <class>RadioButton</class>
  	  <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
  	  <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
  	  <tooltip xml:lang="en">select multiple datasets</tooltip>
    </AoiMetacatQuery>
    
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <proxyUrl>../../proxy.jsp</proxyUrl>
    <!-- 
    <serializeUrl>../../writeXml</serializeUrl>
     -->
  </MapbuilderConfig>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/africa_frame_model.xml
  
  Index: africa_frame_model.xml
  ===================================================================
  <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world"
  xmlns="http://www.opengis.net/context"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="250" height="375" />
      <BoundingBox SRS="EPSG:4326" minx="30" miny="-26.5" maxx="33" maxy="-21.5" />
      <Title>metacat data</Title>
      <KeywordList>
        <Keyword>metacat</Keyword>
        <Keyword>EML</Keyword>
      </KeywordList>
      <Abstract>Low resolution.</Abstract>
    </General>
    <LayerList>
      
      <Layer queryable="0" hidden="1">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="1">
      <Server service="wms" version="1.1.0" title="wms">
      <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
      </Server>
      <Name>land</Name>
      <Title>land area</Title>
      <SRS>EPSG:4326</SRS>
      <FormatList>
      <Format current="1">image/gif</Format>
      </FormatList>
      </Layer>
  
      <Layer queryable="0" hidden="1">
      <Server service="wms" version="1.1.0" title="wms">
      <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"  xlink:type="simple" xlink:href="http://wms.jpl.nasa.gov/wms.cgi?"/>
      </Server>
      <Name>global_mosaic</Name> 
      <!-- <Name>BMNG</Name> -->
      <Title>satellite imagery</Title>
      <SRS>EPSG:4326</SRS>
      <FormatList>
      <Format current="1">image/jpeg</Format>
      </FormatList>
      </Layer>
      
  	<Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="Datasets">
          <OnlineResource xlink:type="simple"
          xlink:href="../../../../wms" />
        </Server>
        <Name>topp:metacat_testdata</Name>
        <Title>datasets</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
        
  
        <!--
     
      <StyleList>
              <Style current="1">
                        <Name>0xb8d8f6</Name>
                                  <Title>0xb8d8f6</Title>
                                            <LegendURL width="16" height="16" format="image/gif">
                                                       <OnlineResource xlink:type="simple" xlink:href="../../../../wms?VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=topp:metacat_testdata&SPATIAL_TYPE=POLYGON&STYLE=0xb8d8f6&FORMAT=image%2Fgif&SIMPLE=TRUE"/>
         
         </LegendURL>
           </Style>
         </StyleList>
      -->
      
      </Layer>
     
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:SOILS_VENTER</Name>
        <Title>Kruger soils</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
  
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:INFRA_ROADSPUBLIC_VIEW</Name>
        <Title>Kruger Park roads</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
  	
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:BNDRY_BUSINESSUNITS</Name>
        <Title>Kruger Park business units</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
     
      
      <Layer queryable="0" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:BNDRY_KRUGERNP</Name>
        <Title>Kruger Park boundaries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
     <!-- 
      <Layer queryable="0" hidden="1">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:RIVERS</Name>
        <Title>rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      -->
      
      <Layer queryable="0" hidden="1">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:country</Name>
        <Title>country borders</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:places</Name>
        <Title>esri usa places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:CITIES</Name>
        <Title>esri world cities places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:latlong</Name>
        <Title>esri world latlong</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/available_layers.html
  
  Index: available_layers.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css">
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css">
  
  <link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet">
  <script src="./knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script>
  <script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script><script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script>
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='available_layers_config.xml';
      </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  </head>
  
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  <!-- Layout mapbuilder widgets and HTML -->
  <h1>Metacat Spatial Option Demo </h1>
  
  <table border="0">
  	<tr>
  		<td  valign="top">
      <table border="0">
        <tr> <td id="locatorMap"/> </tr>
        <tr> <td id="mainButtonBar" />  </tr>
        <tr> <td id="legend" valign="top"/> </tr> 
        <tr> <td colspan="3" id="featureList" /> </tr>
      </table>
  		</td>
      <td rowspan="2" valign="top" />
  		<table border="0">
  			<tr> <!--
  				<td align="left" id="mainButtonBar" />
  				<td align="right" id="cursorTrack" />
  			--> </tr>
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="right">
  
          <table border="0">
            <tr>
              <td align="left" id="mapScaleText"/>
  				    <td colspan="1"></td>
              <td align="right" id="cursorTrack" />
            </tr>
          </table>
          <!-- description and use documentation -->
          <table width="600">
            <tr><td> This is a demonstration of the Metacat Spatial Option (MSO) 
            that shows the ability to select Ecological Markup Language (EML) 
            documents stored in the Metacat server: (metacat.nceas.ucsb.edu).  
            Additionally, the user may choose to select information for other layers - for 
            a qualitative sense of where (spatially) the EML documents exist. 
            <br><br>
            1] to select information for layers: zoom in, press the blue info 'i' button,  press the 'circled i' (next to desired layer) and point at the feature.
            <br><br>
            * Make sure to position the mouse directly over the feature while selecting it.
            <br><br>
            * EML documents are represented as red dots -- the center of the dot is the geometric center of that EML data package. (a dataset comprising a global 
            study will lie at the intersection of the equator and the prime meridian).
            
            </td> </tr> </table>
  			</tr>
        
        
  		</table>
  		</td>
  	</tr>
  </table>
  
  <div id="debug"></div>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/available_layers_config.xml
  
  Index: available_layers_config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>available_layers_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
      
      <Context id="locator">
        <defaultModelUrl>available_layers_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
  
      <Transaction id="transaction">
        <widgets>
          <TransactionResponse id="transactionResponse">
          </TransactionResponse>
        </widgets>
      </Transaction>
      <FeatureCollection id="featureCollection">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <GmlRendererWZ id="testGmlRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
          </GmlRendererWZ>
          <FeatureList id="featureList">
          </FeatureList>
        </widgets>
      </FeatureCollection>
    </models>
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to zoom in</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to zoom out</tooltip>
        <tooltip xml:lang="fr">cliquer pour rée</tooltip>
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to pan</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
      </DragPan>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
        <tooltip xml:lang="en">reset the map to full extent</tooltip>
        <tooltip xml:lang="fr">redonner la carte ses dimensions complèts</tooltip>
      </Reset>
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:the_geom/gml:Point/gml:coordinates</featureXpath>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:ID</featureXpath>
        <defaultModelUrl>template_metacat.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditPoint>
      
      <GetFeatureInfo id="getFeatureInfo">
        <buttonBar>mainButtonBar</buttonBar>
         <targetModel>mainMap</targetModel>
       <!-- <targetModel>featureCollection</targetModel> -->
        <context>mainMap</context>
        <!-- <mouseHandler>mainMouseClick</mouseHandler> -->
         <mouseHandler>mainAoi</mouseHandler>
        <!-- <mouseHandler>mainAoi</mouseHandler> -->
        <class>RadioButton</class>
      <enabledSrc>/images/QueryEnable.gif</enabledSrc>
      <disabledSrc>/images/QueryDisable.gif</disabledSrc>
      </GetFeatureInfo>
    <!--SetAoi id="setAoi">
    <buttonBar>mainButtonBar</buttonBar>
    <targetModel>mainMap</targetModel>
    <mouseHandler>mainAoi</mouseHandler>
    <class>RadioButton</class>
    <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
    <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
    </SetAoi-->
  
    <AoiMetacatQuery id="aoiMetacatQuery">
  	  <buttonBar>mainButtonBar</buttonBar>
  	  <targetModel>mainMap</targetModel>
  	  <mouseHandler>mainAoi</mouseHandler>
  	  <class>RadioButton</class>
  	  <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
  	  <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
  	  <tooltip xml:lang="en">Metacat spatial query</tooltip>
    </AoiMetacatQuery>
    
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <proxyUrl>../../proxy.jsp</proxyUrl>
    <!-- 
    <serializeUrl>../../writeXml</serializeUrl>
     -->
  </MapbuilderConfig>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/available_layers_model.xml
  
  Index: available_layers_model.xml
  ===================================================================
  <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world"
  xmlns="http://www.opengis.net/context"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  
    <General>
      <Window width="600" height="300" />
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180"
      maxy="90" />
      <Title>metacat data</Title>
      <KeywordList>
        <Keyword>metacat</Keyword>
        <Keyword>EML</Keyword>
      </KeywordList>
      <Abstract>Low resolution.</Abstract>
    </General>
    <LayerList>
      
      
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
       <Name>ocean</Name>
        <Title>ocean area</Title> 
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="0">
      <Server service="wms" version="1.1.0" title="wms">
      <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
      </Server>
      <Name>land</Name>
      <Title>land area</Title>
      <SRS>EPSG:4326</SRS>
      <FormatList>
      <Format current="1">image/gif</Format>
      </FormatList>
      </Layer>
  
  
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="metacat document data">
          <OnlineResource xlink:type="simple"
          xlink:href="../../../../wms" />
        </Server>
        <Name>topp:metacat_testdata</Name>
        <Title>metacat documents</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
        
  
        <!--
     
      <StyleList>
              <Style current="1">
                        <Name>0xb8d8f6</Name>
                                  <Title>0xb8d8f6</Title>
                                            <LegendURL width="16" height="16" format="image/gif">
                                                       <OnlineResource xlink:type="simple" xlink:href="../../../../wms?VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=topp:metacat_testdata&SPATIAL_TYPE=POLYGON&STYLE=0xb8d8f6&FORMAT=image%2Fgif&SIMPLE=TRUE"/>
         
         </LegendURL>
           </Style>
         </StyleList>
      -->
      
      </Layer>
      <!-- <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="terraserver">
          <OnlineResource xlink:type="simple"
          xlink:href="http://terraserver.microsoft.com/OgcWms.aspx" />
        </Server>
        <Name>DOQ</Name>
        <Title>terraserver</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/jpeg</Format>
        </FormatList>
      </Layer> -->
      
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:RIVERS</Name>
        <Title>esri world rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:country</Name>
        <Title>esri world countries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
  
  
  
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:places</Name>
        <Title>esri usa places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:CITIES</Name>
        <Title>esri world cities places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:latlong</Name>
        <Title>esri world latlong</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/config-bak.xml
  
  Index: config-bak.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>tasmania.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
      
      <Context id="locator">
        <defaultModelUrl>tasmania.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
  
      <Transaction id="transaction">
        <widgets>
          <TransactionResponse id="transactionResponse">
          </TransactionResponse>
        </widgets>
      </Transaction>
      <FeatureCollection id="featureCollection">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <GmlRendererWZ id="testGmlRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
          </GmlRendererWZ>
          <FeatureList id="featureList">
          </FeatureList>
        </widgets>
      </FeatureCollection>
    </models>
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to zoom in</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to zoom out</tooltip>
        <tooltip xml:lang="fr">cliquer pour rée</tooltip>
      </ZoomOut>
      <GetFeatureInfo id="getFeatureInfo">
        <mouseHandler>mainMouseClick</mouseHandler>
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <context>mainMap</context>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/QueryEnable.gif</enabledSrc>
        <disabledSrc>/images/QueryDisable.gif</disabledSrc>
      </GetFeatureInfo>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to pan</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
      </DragPan>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
        <tooltip xml:lang="en">reset the map to full extent</tooltip>
        <tooltip xml:lang="fr">redonner la carte ses dimensions complèts</tooltip>
      </Reset>
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:tasmania_cities/topp:the_geom/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
        <defaultModelUrl>template_cities.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditPoint>
      <EditLine id="editLine">
        <buttonBar>mainButtonBar</buttonBar>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditLineEnable.gif</enabledSrc>
        <disabledSrc>/images/EditLineDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to add a point to a line</tooltip>
        <tooltip xml:lang="fr">click on map to add a point to a line</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:tasmania_roads/topp:the_geom/gml:MultiLineString/gml:lineStringMember/gml:LineString/gml:coordinates</featureXpath>
        <defaultModelUrl>template_road.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditLine>
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <proxyUrl>../../proxy.jsp</proxyUrl>
    <!-- 
    <serializeUrl>../../writeXml</serializeUrl>
     -->
  </MapbuilderConfig>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>metacat.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
      
      <Context id="locator">
        <defaultModelUrl>metacat.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
  
      <Transaction id="transaction">
        <widgets>
          <TransactionResponse id="transactionResponse">
          </TransactionResponse>
        </widgets>
      </Transaction>
      <FeatureCollection id="featureCollection">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <GmlRendererWZ id="testGmlRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
          </GmlRendererWZ>
          <FeatureList id="featureList">
          </FeatureList>
        </widgets>
      </FeatureCollection>
    </models>
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to zoom in</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to zoom out</tooltip>
        <tooltip xml:lang="fr">cliquer pour rée</tooltip>
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to pan</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
      </DragPan>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
        <tooltip xml:lang="en">reset the map to full extent</tooltip>
        <tooltip xml:lang="fr">redonner la carte ses dimensions complèts</tooltip>
      </Reset>
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:the_geom/gml:Point/gml:coordinates</featureXpath>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:ID</featureXpath>
        <defaultModelUrl>template_metacat.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditPoint>
      
      <GetFeatureInfo id="getFeatureInfo">
        <buttonBar>mainButtonBar</buttonBar>
         <targetModel>mainMap</targetModel>
       <!-- <targetModel>featureCollection</targetModel> -->
        <context>mainMap</context>
        <!-- <mouseHandler>mainMouseClick</mouseHandler> -->
         <mouseHandler>mainAoi</mouseHandler>
        <!-- <mouseHandler>mainAoi</mouseHandler> -->
        <class>RadioButton</class>
      <enabledSrc>/images/QueryEnable.gif</enabledSrc>
      <disabledSrc>/images/QueryDisable.gif</disabledSrc>
      </GetFeatureInfo>
    <SetAoi id="setAoi">
    <buttonBar>mainButtonBar</buttonBar>
    <targetModel>mainMap</targetModel>
    <mouseHandler>mainAoi</mouseHandler>
    <class>RadioButton</class>
    <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
    <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
    </SetAoi>
    
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <proxyUrl>../../proxy.jsp</proxyUrl>
    <!-- 
    <serializeUrl>../../writeXml</serializeUrl>
     -->
  </MapbuilderConfig>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/config.xml.new
  
  Index: config.xml.new
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>metacat.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
  
      <Context id="locator">
        <defaultModelUrl>metacat.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
  
      <Transaction id="transaction">
        <widgets>
          <TransactionResponse id="transactionResponse">
          </TransactionResponse>
        </widgets>
      </Transaction>
  
  <FeatureCollection id="featureCollection">
    <namespace>
    xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs'xmlns:topp='http://www.openplans.org/topp'
    </namespace>
    
      <widgets>
      
        <GmlRendererWZ id="testGmlRenderer">
        <htmlTagId>mainMapPane</htmlTagId>
        <targetModel>mainMap</targetModel>
        <mapContainerId>mainMapContainer</mapContainerId>
        <lineColor>#FF0000</lineColor>
        <lineWidth>1</lineWidth>
        <pointDiameter>10</pointDiameter>
        </GmlRendererWZ>
        <FeatureList id="featureList">
                </FeatureList>
                </widgets>
    </FeatureCollection>  
    
    </models>
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to zoom in</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to zoom out</tooltip>
        <tooltip xml:lang="fr">cliquer pour rée</tooltip>
      </ZoomOut>
      <GetFeatureInfo id="getFeatureInfo">
        <buttonBar>mainButtonBar</buttonBar>
        <!-- <targetModel>mainMap</targetModel> -->
        <!-- <targetModel>featureCollection</targetModel> -->
        <context>mainMap</context>
        <mouseHandler>mainMouseClick</mouseHandler>
        <!-- <mouseHandler>mainAoi</mouseHandler> -->
        <class>RadioButton</class>
        <enabledSrc>/images/QueryEnable.gif</enabledSrc>
        <disabledSrc>/images/QueryDisable.gif</disabledSrc>
        
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:topp:metacat_testdata/topp:ID/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
        <defaultModelUrl>template_metacat.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      
      </GetFeatureInfo>
      
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <!-- <mouseHandler>mainAoi</mouseHandler> -->
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:topp:metacat_testdata/topp:ID/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
        <defaultModelUrl>template_metacat.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditPoint>
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <proxyUrl>../../proxy.jsp</proxyUrl>
    <widgetTextUrl>widgetText.xml</widgetTextUrl>
    <!-- 
    <serializeUrl>../../writeXml</serializeUrl>
     -->
  </MapbuilderConfig>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/hide_map.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css">
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css">
  
  <link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet">
  <script src="./knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script>
  <script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script><script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script>
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config.xml';
      </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  </head>
  
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  <!-- Layout mapbuilder widgets and HTML -->
  <h1>Metacat Spatial Option Demo </h1>
  
  <table width="100" border="0">
  	<tr>
  		<td  valign="top">
      <table border="0">
        <tr> <td id="locatorMap"/> </tr>
        <tr> <td id="mainButtonBar" />  </tr>
        <tr> <td id="legend" valign="top"/> </tr> 
        <tr> <td colspan="3" id="featureList" /> </tr>
        <tr><td> 
        <br>
        <br>
        Upload a Spatial EML Document:
  
  
        <form action="http://sulphur.homelinux.com:7000/cgs/metacat_spatialresolver.jsp" enctype="multipart/form-data" method="post">
        <input name="file" type="file">
        <input type="submit" value="upload EML"> 
        </form>
        <br>
        * A Spatial EML Document describes and includes a spatial dataset (eg, a .shp or .dxf file). The 
        EML must reference the spatial dataset as a file(s).  The spatial data file(s) and the EML that references it must be combined in 
        a standard Zip file for uploading.
        </td></tr>
      </table>
  		</td>
      <td rowspan="2" valign="top" />
  		<table border="0">
  			<tr> <!--
  				<td align="left" id="mainButtonBar" />
  				<td align="right" id="cursorTrack" />
  			--> </tr>
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="right">
  
          <table border="0" width="600">
            <tr>
              <td align="center" id="mapScaleText"/>
  				    <td colspan="1"></td>
              <td align="center" id="cursorTrack" />
            </tr>
          </table>
          <!-- description and use documentation -->
          <table width="600">
            <tr><td> This is a demonstration of the Metacat Spatial Option (MSO) 
            that shows the ability to select Ecological Markup Language (EML) 
            documents stored in the Metacat server: (metacat.nceas.ucsb.edu).  
            Additionally, the user may choose to select places in the USA - for 
            a qualitative sense of where (spatially) the EML documents exist. 
            <br><br>
            1] to select the EML Document: zoom in, press the blue info 'i' button and point to a red dot.
            <br><br>
            2] to select a known place: zoom in, press the blue info 'i' button, press the 'circled i' (next to the USA known places layer selector) and then point to a black dot.
            <br><br><p>
            * Make sure to position the mouse directly over the feature while selecting it.
            <br>
            * Any of these features can be made selectable by a simple configuration change see: <a href="available_layers.html">selectable layers</a> 
            <br>
            * EML documents are represented as red dots -- the center of the dot is the geometric center of that EML data package. (a dataset comprising a global 
            study will lie at the intersection of the equator and the prime meridian).
            
            </td> </tr> </table>
          
  			</tr>
        
        
  		</table>
  		</td>
  	</tr>
  </table>
  
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/kruger_frame.html
  
  Index: kruger_frame.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css">
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css">
  
  <link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet">
  <script src="./knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script>
  <script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script><script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script>
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='kruger_frame_config.xml';
      </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  </head>
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  
  <table border="0">
  	<tr>
      <td rowspan="2" valign="top" />
  		<table border="0">
  			<tr> 
  			</tr>
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="right">
  
          <table border="0">
            <tr>
              <!--<td align="center" id="mapScaleText"/>
  				    <td colspan="1"></td>
              <td align="center" id="cursorTrack" />-->
            </tr>
        			<tr> <td id="locatorMap" style="display:none"/> </tr>
        			<tr> <td id="mainButtonBar" />  </tr>
        			<tr> <td id="legend" valign="top"/> </tr> 
        			<tr> <td colspan="3" id="featureList" /> </tr>
          </table>
  			</tr>
        
        
  		</table>
  		</td>
  	</tr>
  </table>
  
  <div id="debug"></div>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/kruger_frame_config.xml
  
  Index: kruger_frame_config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>kruger_frame_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
      
      <Context id="locator">
        <defaultModelUrl>kruger_frame_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
  
      <Transaction id="transaction">
        <widgets>
          <TransactionResponse id="transactionResponse">
          </TransactionResponse>
        </widgets>
      </Transaction>
      <FeatureCollection id="featureCollection">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <GmlRendererWZ id="testGmlRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
          </GmlRendererWZ>
          <FeatureList id="featureList">
          </FeatureList>
        </widgets>
      </FeatureCollection>
    </models>
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to zoom in</tooltip>
        <!--tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip-->
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to zoom out</tooltip>
        <!--tooltip xml:lang="fr">cliquer pour rée</tooltip-->
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to pan</tooltip>
        <!--tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip-->
      </DragPan>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
        <tooltip xml:lang="en">reset the map to full extent</tooltip>
        <!--tooltip xml:lang="fr">redonner la carte ses dimensions complèts</tooltip-->
      </Reset>
  
  	<!--
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:the_geom/gml:Point/gml:coordinates</featureXpath>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:ID</featureXpath>
        <defaultModelUrl>template_metacat.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditPoint>
      -->
  
      <GetFeatureInfo id="getFeatureInfo">
        <buttonBar>mainButtonBar</buttonBar>
         <targetModel>mainMap</targetModel>
       <!-- <targetModel>featureCollection</targetModel> -->
        <context>mainMap</context>
        <!-- <mouseHandler>mainMouseClick</mouseHandler> -->
         <mouseHandler>mainAoi</mouseHandler>
        <!-- <mouseHandler>mainAoi</mouseHandler> -->
        <class>RadioButton</class>
      <enabledSrc>/images/QueryEnable.gif</enabledSrc>
      <disabledSrc>/images/QueryDisable.gif</disabledSrc>
      </GetFeatureInfo>
    <!--SetAoi id="setAoi">
    <buttonBar>mainButtonBar</buttonBar>
    <targetModel>mainMap</targetModel>
    <mouseHandler>mainAoi</mouseHandler>
    <class>RadioButton</class>
    <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
    <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
    </SetAoi-->
  
    <AoiMetacatQuery id="aoiMetacatQuery">
  	  <buttonBar>mainButtonBar</buttonBar>
  	  <targetModel>mainMap</targetModel>
  	  <mouseHandler>mainAoi</mouseHandler>
  	  <class>RadioButton</class>
  	  <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
  	  <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
  	  <tooltip xml:lang="en">select datasets</tooltip>
    </AoiMetacatQuery>
    
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <proxyUrl>../../proxy.jsp</proxyUrl>
    <!-- 
    <serializeUrl>../../writeXml</serializeUrl>
     -->
  </MapbuilderConfig>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/kruger_frame_model.xml
  
  Index: kruger_frame_model.xml
  ===================================================================
  <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world"
  xmlns="http://www.opengis.net/context"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  
    <General>
      <Window width="200" height="200" />
      <BoundingBox SRS="EPSG:4326" minx="-26" miny="-40" maxx="61"
      maxy="45" />
      <Title>metacat data</Title>
      <KeywordList>
        <Keyword>metacat</Keyword>
        <Keyword>EML</Keyword>
      </KeywordList>
      <Abstract>Low resolution.</Abstract>
    </General>
    <LayerList>
      
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://nebulous.msi.ucsb.edu:8090/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="0">
      <Server service="wms" version="1.1.0" title="wms">
      <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
      </Server>
      <Name>land</Name>
      <Title>land area</Title>
      <SRS>EPSG:4326</SRS>
      <FormatList>
      <Format current="1">image/gif</Format>
      </FormatList>
      </Layer>
  
      <Layer queryable="0" hidden="0">
      <Server service="wms" version="1.1.0" title="wms">
      <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"  xlink:type="simple" xlink:href="http://wms.jpl.nasa.gov/wms.cgi?"/>
      </Server>
      <!-- <Name>global_mosaic</Name> -->
      <Name>BMNG</Name>
      <Title>jpl data</Title>
      <SRS>EPSG:4326</SRS>
      <FormatList>
      <Format current="1">image/jpeg</Format>
      </FormatList>
      </Layer>
      
  	<Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="Datasets">
          <OnlineResource xlink:type="simple"
          xlink:href="../../../../wms" />
        </Server>
        <Name>topp:metacat_testdata</Name>
        <Title>Datasets</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
        
  
        <!--
     
      <StyleList>
              <Style current="1">
                        <Name>0xb8d8f6</Name>
                                  <Title>0xb8d8f6</Title>
                                            <LegendURL width="16" height="16" format="image/gif">
                                                       <OnlineResource xlink:type="simple" xlink:href="../../../../wms?VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=topp:metacat_testdata&SPATIAL_TYPE=POLYGON&STYLE=0xb8d8f6&FORMAT=image%2Fgif&SIMPLE=TRUE"/>
         
         </LegendURL>
           </Style>
         </StyleList>
      -->
      
      </Layer>
  
  	
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="kruger boundary">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:BNDRY_KRUGERNP</Name>
        <Title>Kruger Park Boundaries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      
      <Layer queryable="0" hidden="1">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:RIVERS</Name>
        <Title>rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="1">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:country</Name>
        <Title>countries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:places</Name>
        <Title>esri usa places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:CITIES</Name>
        <Title>esri world cities places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:latlong</Name>
        <Title>esri world latlong</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/left_arrow.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/metacat.xml
  
  Index: metacat.xml
  ===================================================================
  <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world"
  xmlns="http://www.opengis.net/context"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  
    <General>
      <Window width="600" height="300" />
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180"
      maxy="90" />
      <Title>metacat data</Title>
      <KeywordList>
        <Keyword>metacat</Keyword>
        <Keyword>EML</Keyword>
      </KeywordList>
      <Abstract>Low resolution.</Abstract>
    </General>
    <LayerList>
      
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://nebulous.msi.ucsb.edu:8090/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="0">
            <Server service="wms" version="1.1.0" title="wms">
                    <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
                          </Server>
  
                                <Name>land</Name>
                                      <Title>land area</Title>
                                            <SRS>EPSG:4326</SRS>
                                                  <FormatList>
                                                          <Format current="1">image/gif</Format>
                                                                </FormatList>
                                                                    </Layer>
  
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://nebulous.msi.ucsb.edu:8090/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
        <Name>rivers</Name>
        <Title>rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://nebulous.msi.ucsb.edu:8090/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
        <Name>boundaries</Name>
        <Title>boundaries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://nebulous.msi.ucsb.edu:8090/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
        <Name>country_names</Name>
        <Title>country names</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://nebulous.msi.ucsb.edu:8090/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
        <Name>capital</Name>
        <Title>capitals</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="USA known places">
          <OnlineResource xlink:type="simple" xlink:href="http://nebulous.msi.ucsb.edu:8080/geoserver/wms" />
        </Server>
        <Name>topp:places</Name>
        <Title>USA known places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="metacat document data">
          <OnlineResource xlink:type="simple"
          xlink:href="../../../../wms" />
        </Server>
        <Name>topp:metacat_testdata</Name>
        <Title>metacat documents</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
    
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/metacat_query.html
  
  Index: metacat_query.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css">
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css">
  
  <link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet">
  <script src="./knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script>
  <script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script><script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script>
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='metacat_query_config.xml';
      </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  </head>
  
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  <!-- Layout mapbuilder widgets and HTML -->
  <h1>Metacat Spatial Option Demo </h1>
  
  <table border="0">
  	<tr>
  		<td  valign="top">
      <table border="0">
        <tr> <td id="locatorMap"/> </tr>
        <tr> <td id="mainButtonBar" />  </tr>
        <tr> <td id="legend" valign="top"/> </tr> 
        <tr> <td colspan="3" id="featureList" /> </tr>
      </table>
  		</td>
      <td rowspan="2" valign="top" />
  		<table border="0">
  			<tr> <!--
  				<td align="left" id="mainButtonBar" />
  				<td align="right" id="cursorTrack" />
  			--> </tr>
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="right">
  
          <table border="0">
            <tr>
              <td align="left" id="mapScaleText"/>
  				    <td colspan="1"></td>
              <td align="right" id="cursorTrack" />
            </tr>
          </table>
          <!-- description and use documentation -->
          <table width="600">
            <tr><td> This is a demonstration of the Metacat Spatial Option (MSO) 
            that shows the ability to select Ecological Markup Language (EML) 
            documents stored in the Metacat server: (metacat.nceas.ucsb.edu).  
            Additionally, the user may choose to select information for other layers - for 
            a qualitative sense of where (spatially) the EML documents exist. 
            <br><br>
            1] to select information for layers: zoom in, press the blue info 'i' button,  press the 'circled i' (next to desired layer) and point at the feature.
            <br><br>
            * Make sure to position the mouse directly over the feature while selecting it.
            <br><br>
            * EML documents are represented as red dots -- the center of the dot is the geometric center of that EML data package. (a dataset comprising a global 
            study will lie at the intersection of the equator and the prime meridian).
            
            </td> </tr> </table>
  			</tr>
        
        
  		</table>
  		</td>
  	</tr>
  </table>
  
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/metacat_query_config.xml
  
  Index: metacat_query_config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>metacat_query_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
      
      <Context id="locator">
        <defaultModelUrl>available_layers_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
  
      <Transaction id="transaction">
        <widgets>
          <TransactionResponse id="transactionResponse">
          </TransactionResponse>
        </widgets>
      </Transaction>
      <FeatureCollection id="featureCollection">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <GmlRendererWZ id="testGmlRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
          </GmlRendererWZ>
          <FeatureList id="featureList">
          </FeatureList>
        </widgets>
      </FeatureCollection>
    </models>
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to zoom in</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to zoom out</tooltip>
        <tooltip xml:lang="fr">cliquer pour rée</tooltip>
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to pan</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
      </DragPan>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
        <tooltip xml:lang="en">reset the map to full extent</tooltip>
        <tooltip xml:lang="fr">redonner la carte ses dimensions complèts</tooltip>
      </Reset>
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:the_geom/gml:Point/gml:coordinates</featureXpath>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:ID</featureXpath>
        <defaultModelUrl>template_metacat.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditPoint>
      
      <GetFeatureInfo id="getFeatureInfo">
        <buttonBar>mainButtonBar</buttonBar>
         <targetModel>mainMap</targetModel>
       <!-- <targetModel>featureCollection</targetModel> -->
        <context>mainMap</context>
        <!-- <mouseHandler>mainMouseClick</mouseHandler> -->
         <mouseHandler>mainAoi</mouseHandler>
        <!-- <mouseHandler>mainAoi</mouseHandler> -->
        <class>RadioButton</class>
      <enabledSrc>/images/QueryEnable.gif</enabledSrc>
      <disabledSrc>/images/QueryDisable.gif</disabledSrc>
      </GetFeatureInfo>
    <SetAoi id="setAoi">
    <buttonBar>mainButtonBar</buttonBar>
    <targetModel>mainMap</targetModel>
    <mouseHandler>mainAoi</mouseHandler>
    <class>RadioButton</class>
    <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
    <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
    </SetAoi>
    
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <proxyUrl>../../proxy.jsp</proxyUrl>
    <!-- 
    <serializeUrl>../../writeXml</serializeUrl>
     -->
  </MapbuilderConfig>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/metacat_query_model.xml
  
  Index: metacat_query_model.xml
  ===================================================================
  <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world"
  xmlns="http://www.opengis.net/context"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  
    <General>
      <Window width="600" height="300" />
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180"
      maxy="90" />
      <Title>metacat data</Title>
      <KeywordList>
        <Keyword>metacat</Keyword>
        <Keyword>EML</Keyword>
      </KeywordList>
      <Abstract>Low resolution.</Abstract>
    </General>
    <LayerList>
      
  
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="metacat document data">
          <OnlineResource xlink:type="simple"
          xlink:href="../../../../wms" />
        </Server>
        <Name>topp:metacat_query</Name>
        <Title>metacat documents returned from metacat query</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
        
  
        <!--
     
      <StyleList>
              <Style current="1">
                        <Name>0xb8d8f6</Name>
                                  <Title>0xb8d8f6</Title>
                                            <LegendURL width="16" height="16" format="image/gif">
                                                       <OnlineResource xlink:type="simple" xlink:href="../../../../wms?VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=topp:metacat_testdata&SPATIAL_TYPE=POLYGON&STYLE=0xb8d8f6&FORMAT=image%2Fgif&SIMPLE=TRUE"/>
         
         </LegendURL>
           </Style>
         </StyleList>
      -->
      
      </Layer>
      <!-- <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="terraserver">
          <OnlineResource xlink:type="simple"
          xlink:href="http://terraserver.microsoft.com/OgcWms.aspx" />
        </Server>
        <Name>DOQ</Name>
        <Title>terraserver</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/jpeg</Format>
        </FormatList>
      </Layer> -->
      
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:RIVERS</Name>
        <Title>esri world rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:country</Name>
        <Title>esri world countries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:places</Name>
        <Title>esri usa places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:CITIES</Name>
        <Title>esri world cities places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:latlong</Name>
        <Title>esri world latlong</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/pma.html
  
  Index: pma.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css"/>
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css"/>
  
  <link href="./knp/style/skins/knp/knp.css" type="text/css" rel="stylesheet"/>
  <script src="./knp/style/skins/knp/knp.js" type="text/JavaScript" language="Javascript"></script>
  
  <link href="http://dataknp.sanparks.org/knp/style/skins/knp/map.css" type="text/css" rel="stylesheet"/>
  
  <script src="http://dataknp.sanparks.org/knp/style/common/prototype.js" type="text/JavaScript" language="Javascript"></script>
  <script src="http://dataknp.sanparks.org/knp/style/common/effects.js" type="text/JavaScript" language="Javascript"></script>
  
  <script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knp";
              form_ref.submit();
            }
  </script>
  
  <script type="text/javascript">
    var mbConfigUrl="africa_frame_config.xml";
  </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  
  
  <script language="JavaScript">
  function show_map() {
  	Element.show('mapControlHide')
  	Element.hide('mapControlShow')
  
  	// reset the map position in the iframe
  	$("mapContainer").setAttribute("style", "right:-212px;");
  
  	// expand the iframe
  	var frm = top.getMapFrame();
  	frm.setAttribute("style", "width:295px;right:0;");
  
  	var element = $('mapContainer')
  	new Effect.Move(element, { x: -212, y: 0, duration: 0.2})
  
  	//setTimeout('$("mapContainer").setAttribute("style", "position:absolute;left:0;")', 300);
  
  	//alert('moved');
  	//do_move_anim(-260);
  }
  
  /*
   * Don't animate.  Just shrink the outer frame and make left:0.
   */
  function hide_map() {
  	Element.show('mapControlShow')
  	Element.hide('mapControlHide')
  	var element = $('mapContainer')
  	//new Effect.Move(element, { x: 260, y: 0, duration: 0.1})
  	$("mapContainer").setAttribute("style", "left:0px;");
  
  
  
  	//alert('moved');
  	//setTimeout('getElementsByClassName(top.document, "iframe", "iframeMap")[0].setAttribute("style", "width:35px;right:0;")', 200);
  
  	// shrink the iframe
  	var frm = top.getMapFrame();
  	frm.setAttribute("style", "width:35px;right:-3px;");
  
  
  	//alert('closed');
  	//alert('now');
  	//setTimeout('$("mapContainer").setAttribute("style", "left:0;")', 400);
  	//$("mapContainer").setAttribute("style", "right:-212px;");
  	//alert($("mapContainer").getAttribute("style"));
  	//alert('adjusted');
  
  	//do_move_anim(260);
  }
  
  
  //
  // animate the drawer
  //
  function do_move_anim(xdelta) {
  
  	var element = $('mapContainer')
  	var old_right = Element.getStyle(element, 'right')
  	//alert("right:" + old_right);
  	old_right = old_right.substring(0,old_right.indexOf("px"));
  	var new_right = old_right + xdelta;
  	new_right = new_right + "px";
  	new_right = "0px";
  	var new_left;
  
  	if (xdelta > 0) {
  		// hide
  		new_left = "0px";
  		new_right = "0px";
  	} else {
  		// show
  		new_left = "0px";
  		new_right = "0px";
  	}
  
  	var newStyle = {
  		left: new_left,
  		right: new_right};
  	Element.setStyle(element, newStyle);
  		
  
  	//alert(xdelta + ": " + Element.getStyle(element, 'left') + "=l R=" + Element.getStyle(element, 'right'));
  /*
  */
  	//new Effect.Move(element, { x: xdelta, y: 0, duration: 0.3})
  
  	/*
  	new Effect.Move(element, { x: xdelta, y: 0, duration: 0.3, 
  		afterFinishInternal: function(effect) { with(Element) {
  			undoPositioned(effect.element); setStyle(effect.element, newStyle);	}}})
  	new Effect.Move(element, { x: xdelta, y: 0, duration: 0.3, 
  		afterFinishInternal: function(effect) { with(Element) {
  			setStyle(effect.element, newStyle);	}}})
  			*/
  
  	//Element.setStyle(element, newStyle);
  
  
  
  	//alert(Element.getStyle(element, 'left') + "=l R=" + Element.getStyle(element, 'right'));
  }
  
  function getElementsByClassName(oElm, strTagName, strClassName){
      var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
      var arrReturnElements = new Array();
      strClassName = strClassName.replace(/\-/g, "\\-");
      var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
      var oElement;
      for(var i=0; i<arrElements.length; i++){
          oElement = arrElements[i];      
          if(oRegExp.test(oElement.className)){
              arrReturnElements.push(oElement);
          }   
      }
      return (arrReturnElements)
  }
  
  
  
  </script>
  </head>
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  
  <div id="mapContainer">
  
  <table border="0" cellpadding="0" cellspacing="0">
  	<tr>
      <td style="border-width:0;">
  		<div id="mapControl">
  			<div id="mapControlShow" style="display:none"><a href="#" onclick="show_map();return false;">&nbsp;</a></div>
  			<div id="mapControlHide"><a href="#" onclick="hide_map();return false;">&nbsp;</a></div>
  		</div>
      </td>
      <td valign="top">
  		<table border="0" style="border: 1px solid #525d76;">
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="left">
  				<td>
  
  				<table border="0">
  				  <tr>
  					<!--<td align="center" id="mapScaleText"/>
  							<td colspan="1"></td>
  					<td align="center" id="cursorTrack" />-->
  				  </tr>
  						<tr> <td id="locatorMap" style="display:none"/> </tr>
  						<tr> <td id="mainButtonBar" />  </tr>
  						<tr> <td id="legend" valign="top"/> </tr> 
  						<tr> <td colspan="3" id="featureList" /> </tr>
  				</table>
  
  				</td>
  			</tr>
        
  		</table>
  		</td>
  	</tr>
  </table>
  </div>
  
  <div id="debug"></div>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/pma2.html
  
  Index: pma2.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css">
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css">
  <link href="http://nebulous.msi.ucsb.edu:9999/knp/style/skins/knp/map.css" type="text/css" rel="stylesheet">
  <!--link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet">
  <script src="./knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script>
  <script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script><script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script-->
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='kruger_frame_config.xml';
      </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  </head>
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  
  <div id="mapContainer">
  	<div id="mapControl">
  	show/hide
  	</div>
  
  <table border="3" id="mapTable">
  	<tr>
      <td rowspan="2" valign="top" />
  		<table border="0">
  			<tr> 
  			</tr>
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background: transparent;" />
  			</tr>
  			<tr align="right">
  
          <table border="0">
            <tr>
              <td align="center" id="mapScaleText"/>
  				    <td colspan="1"></td>
              <td align="center" id="cursorTrack" />
            </tr>
        			<tr> <td id="locatorMap" style="display:none"/> </tr>
        			<tr> <td id="mainButtonBar" />  </tr>
        			<tr> <td id="legend" valign="top"/> </tr> 
        			<tr> <td colspan="3" id="featureList" /> </tr>
          </table>
  			</tr>
        
        
  		</table>
  		</td>
  	</tr>
  </table>
  </div>
  
  
  <div id="debug"></div>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/pma3.html
  
  Index: pma3.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css">
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css">
  <link href="http://nebulous.msi.ucsb.edu:9999/knp/style/skins/knp/map.css" type="text/css" rel="stylesheet">
  <script src="http://nebulous.msi.ucsb.edu:9999/knp/style/common/prototype.js" type="text/JavaScript" language="Javascript"></script>
  <script src="http://nebulous.msi.ucsb.edu:9999/knp/style/common/effects.js" type="text/JavaScript" language="Javascript"></script>
  
  <!--link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet"-->
  <!--script src="/knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script-->
  <script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script>
  <script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script>
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='kruger_frame_config.xml';
      </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  
  <script language="JavaScript">
  	function show_map() {
  		Element.show('mapControlHide')
  		Element.hide('mapControlShow')
  		do_move_anim(-212);
  	}
  
  	function hide_map() {
  		Element.show('mapControlShow')
  		Element.hide('mapControlHide')
  		do_move_anim(212);
  	}
  
  	function do_move_anim(xdelta) {
  		var element = $('mapContainer')
  		var old_right = Element.getStyle(element, 'right')
  		old_right = old_right.substring(0,old_right.indexOf("px"));
  		var new_right = old_right + xdelta;
  		new_right = new_right + "px";
  		//todo:  figure out how to make the right: 220px
  		//alert(new_right);
  
  
  		var newStyle = {
  			top: Element.getStyle(element, 'top'),
  			right: new_right};
  			//left: Element.getStyle(element, 'left')};
  		//alert(newStyle.right);
  
  		//Element.setStyle(element, newStyle)
  
  		new Effect.Move(element, { x: xdelta, y: 0, duration: 0.3, 
  			afterFinishInternal: function(effect) { with(Element) {
  				undoPositioned(effect.element); setStyle(effect.element, newStyle);	}}})
  	}
  
  
  
  
  </script>
  </head>
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  
  <div id="mapContainer">
  	<div id="mapControl">
  		<div id="mapControlShow"><a href="#" onclick="show_map();return false;">&nbsp;</a></div>
  		<div id="mapControlHide" style="display:none"><a href="#" onclick="hide_map();return false;">&nbsp;</a></div>
  	</div>
  
  <table border="0">
  	<tr>
      <td rowspan="2" valign="top" />
  		<table border="0">
  			<tr> 
  			</tr>
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="right">
  
          <table border="0">
            <tr>
              <!--<td align="center" id="mapScaleText"/>
  				    <td colspan="1"></td>
              <td align="center" id="cursorTrack" />-->
            </tr>
        			<tr> <td id="locatorMap" style="display:none"/> </tr>
        			<tr> <td id="mainButtonBar" />  </tr>
        			<tr> <td id="legend" valign="top"/> </tr> 
        			<tr> <td colspan="3" id="featureList" /> </tr>
          </table>
  			</tr>
        
        
  		</table>
  		</td>
  	</tr>
  </table>
  </div>
  
  <div id="debug"></div>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/pma4.html
  
  Index: pma4.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  <link rel="stylesheet" href="http://rover10.homelinux.com:9999/geoserver/style.css" type="text/css">
  <link rel="stylesheet" href="http://rover10.homelinux.com:9999/geoserver/data/mbdemos/lib/skin/default/html.css" type="text/css">
  <link href="http://rover10.homelinux.com:9999/knp/style/skins/knp/map.css" type="text/css" rel="stylesheet">
  <script src="http://rover10.homelinux.com:9999/knp/style/common/prototype.js" type="text/JavaScript" language="Javascript"></script>
  <script src="http://rover10.homelinux.com:9999/knp/style/common/effects.js" type="text/JavaScript" language="Javascript"></script>
  
  <!--link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet"-->
  <!--script src="/knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script-->
  <!--script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script-->
  <script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script>
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
  	  //var baseDir = "/usr/local/devtools/geoserver/server/geoserver/data/mbdemos/demo/metacat_wfs";
  
        //var mbConfigUrl="http://rover10.homelinux.com:8080/geoserver/data/mbdemos/demo/metacat_wfs/africa_frame_config.xml";
        //var mbConfigUrl="http://rover10.homelinux.com:9999/knp/style/skins/knp/africa_frame_config.xml";
        var mbConfigUrl="africa_frame_config.xml";
  </script>
  
  <!--script type="text/javascript" src="http://rover10.homelinux.com:9999/knp/style/skins/knp/map_frame.jsp?url=http://rover10.homelinux.com:8080/geoserver/data/mbdemos/lib/Mapbuilder.js"></script-->
  <!--script type="text/javascript" src="http://rover10.homelinux.com:8080/geoserver/data/mbdemos/lib/Mapbuilder.js"></script-->
  <!--script type="text/javascript" src="../../lib/Mapbuilder.js"></script-->
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  
  <script language="JavaScript">
  function show_map() {
  	Element.show('mapControlHide')
  	Element.hide('mapControlShow')
  
  	$("mapContainer").setAttribute("style", "position:absolute;right:-212px;");
  
  	var frm = getElementsByClassName(top.document, "iframe", 'iframerightcolclass')[0];
  	frm.setAttribute("style", "width:295px;position:absolute;right:0;");
  	//alert('open');
  	var element = $('mapContainer')
  	new Effect.Move(element, { x: -260, y: 0, duration: 0.2})
  	//setTimeout('$("mapContainer").setAttribute("style", "position:absolute;left:0;")', 300);
  	//alert('moved');
  	//do_move_anim(-260);
  }
  
  function hide_map() {
  	Element.show('mapControlShow')
  	Element.hide('mapControlHide')
  	var element = $('mapContainer')
  	//new Effect.Move(element, { x: 260, y: 0, duration: 0.1})
  	$("mapContainer").setAttribute("style", "position:absolute;left:0px;");
  	//alert('moved');
  	//setTimeout('getElementsByClassName(top.document, "iframe", "iframerightcolclass")[0].setAttribute("style", "width:35px;position:absolute;right:0;")', 200);
  
  	var frm = getElementsByClassName(top.document, "iframe", 'iframerightcolclass')[0];
  	frm.setAttribute("style", "width:35px;position:absolute;right:0;");
  	//alert('closed');
  	//alert('now');
  	//setTimeout('$("mapContainer").setAttribute("style", "position:absolute;left:0;")', 400);
  	//$("mapContainer").setAttribute("style", "position:absolute;right:-212px;");
  	//alert($("mapContainer").getAttribute("style"));
  	//alert('adjusted');
  
  	//do_move_anim(260);
  }
  
  
  //
  // animate the drawer
  //
  function do_move_anim(xdelta) {
  
  	var element = $('mapContainer')
  	var old_right = Element.getStyle(element, 'right')
  	//alert("right:" + old_right);
  	old_right = old_right.substring(0,old_right.indexOf("px"));
  	var new_right = old_right + xdelta;
  	new_right = new_right + "px";
  	new_right = "0px";
  	var new_left;
  
  	if (xdelta > 0) {
  		// hide
  		new_left = "0px";
  		new_right = "0px";
  	} else {
  		// show
  		new_left = "0px";
  		new_right = "0px";
  	}
  
  	var newStyle = {
  		left: new_left,
  		right: new_right};
  	Element.setStyle(element, newStyle);
  		
  
  	//alert(xdelta + ": " + Element.getStyle(element, 'left') + "=l R=" + Element.getStyle(element, 'right'));
  /*
  */
  	//new Effect.Move(element, { x: xdelta, y: 0, duration: 0.3})
  
  	/*
  	new Effect.Move(element, { x: xdelta, y: 0, duration: 0.3, 
  		afterFinishInternal: function(effect) { with(Element) {
  			undoPositioned(effect.element); setStyle(effect.element, newStyle);	}}})
  	new Effect.Move(element, { x: xdelta, y: 0, duration: 0.3, 
  		afterFinishInternal: function(effect) { with(Element) {
  			setStyle(effect.element, newStyle);	}}})
  			*/
  
  	//Element.setStyle(element, newStyle);
  
  
  
  	//alert(Element.getStyle(element, 'left') + "=l R=" + Element.getStyle(element, 'right'));
  }
  
  function getElementsByClassName(oElm, strTagName, strClassName){
      var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
      var arrReturnElements = new Array();
      strClassName = strClassName.replace(/\-/g, "\\-");
      var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
      var oElement;
      for(var i=0; i<arrElements.length; i++){
          oElement = arrElements[i];      
          if(oRegExp.test(oElement.className)){
              arrReturnElements.push(oElement);
          }   
      }
      return (arrReturnElements)
  }
  
  
  
  </script>
  </head>
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  
  <div id="mapContainer">
  
  <table border="0" cellpadding="0" cellspacing="0">
  	<tr>
      <td style="border-width:0; background-color:#e6e6e6;">
  		<div id="mapControl">
  			<div id="mapControlShow"><a href="#" onclick="show_map();return false;">&nbsp;</a></div>
  			<div id="mapControlHide" style="display:none"><a href="#" onclick="hide_map();return false;">&nbsp;</a></div>
  		</div>
      </td>
      <td valign="top">
  		<table border="0" style="border: 1px solid #525d76;">
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="right">
  				<td>
  
  				<table border="0">
  				  <tr>
  					<!--<td align="center" id="mapScaleText"/>
  							<td colspan="1"></td>
  					<td align="center" id="cursorTrack" />-->
  				  </tr>
  						<tr> <td id="locatorMap" style="display:none"/> </tr>
  						<tr> <td id="mainButtonBar" />  </tr>
  						<tr> <td id="legend" valign="top"/> </tr> 
  						<tr> <td colspan="3" id="featureList" /> </tr>
  				</table>
  
  				</td>
  			</tr>
        
  		</table>
  		</td>
  	</tr>
  </table>
  </div>
  
  <div id="debug"></div>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/right_arrow.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/show_map.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/template_cities.xml
  
  Index: template_cities.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <gml:featureMember xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml">
    <topp:tasmania_cities>
      <topp:the_geom>
        <gml:MultiPoint srsName="epsg:4326">
          <gml:pointMember>
            <gml:Point>
              <gml:coordinates decimal="." cs="," ts=" "></gml:coordinates>
            </gml:Point>
          </gml:pointMember>
        </gml:MultiPoint>
      </topp:the_geom>
      <topp:CITY_NAME></topp:CITY_NAME>
      <topp:ADMIN_NAME>Tasmania</topp:ADMIN_NAME>
      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
      <topp:STATUS>Provincial capital</topp:STATUS>
      <topp:POP_CLASS></topp:POP_CLASS>
    </topp:tasmania_cities>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/template_metacat.xml
  
  Index: template_metacat.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <gml:featureMember xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml">
    <topp:metacat_testdata>
      <topp:the_geom>
            <gml:Point srsName="epsg:4326">
              <gml:coordinates decimal="." cs="," ts=" "></gml:coordinates>
            </gml:Point>
      </topp:the_geom>
      <topp:ID></topp:ID>
      <topp:url></topp:url>
    </topp:metacat_testdata>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/template_metacat_query.xml
  
  Index: template_metacat_query.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <gml:featureMember xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml">
    <topp:metacat_query>
      <topp:the_geom>
            <gml:Point srsName="epsg:4326">
              <gml:coordinates decimal="." cs="," ts=" "></gml:coordinates>
            </gml:Point>
      </topp:the_geom>
      <topp:ID></topp:ID>
      <topp:url></topp:url>
    </topp:metacat_query>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/template_road.xml
  
  Index: template_road.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <gml:featureMember xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml">
    <topp:tasmania_roads fid="tasmania_roads.1">
      <topp:the_geom>
        <gml:MultiLineString srsName="epsg:4326">
          <gml:lineStringMember>
            <gml:LineString>
              <gml:coordinates decimal="." cs="," ts=" "></gml:coordinates>
            </gml:LineString>
          </gml:lineStringMember>
        </gml:MultiLineString>
      </topp:the_geom>
      <topp:TYPE>road</topp:TYPE>
    </topp:tasmania_roads>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/world_frame.html
  
  Index: world_frame.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  
  <html>
  <head>
  <title>Metacat Spatial Option Demo</title>
  
  
  <link rel="stylesheet" href="../../../../style.css" type="text/css">
  <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css">
  
  <link href="./knb/style/skins/knb/knb.css" type="text/css" rel="stylesheet">
  <script src="./knb/style/skins/knb/knb.js" type="text/JavaScript" language="Javascript"></script>
  <script src="./knb/style/common/branding.js" type="text/JavaScript" language="Javascript"></script><script language="JavaScript">
            function submitform(action,form_ref) {
              form_ref.action.value=action;
              form_ref.sessionid.value="";
              form_ref.qformat.value="knb";
              form_ref.submit();
            }
  </script>
  
  <script type="text/javascript">
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='world_frame_config.xml';
      </script>
  <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
  </head>
  <!--
   <body onload="document.location='../../../wms/GetCapabilities'">
   -->
  <body onload="mbDoLoad()">
  
  <table border="0">
  	<tr>
      <td rowspan="2" valign="top" />
  		<table border="0">
  			<tr> 
  			</tr>
  			<tr>
  				<td colspan="2" id="mainMapPane" style="background-color: white;" />
  			</tr>
  			<tr align="right">
  
          <table border="0">
            <tr>
              <!-- <td align="center" id="mapScaleText"/>
  				    <td colspan="1"></td>
              <td align="center" id="cursorTrack" /> -->
            </tr>
        			<tr> <td id="locatorMap" style="display:none"/> </tr>
        			<tr> <td id="mainButtonBar" />  </tr>
        			<tr> <td id="legend" valign="top"/> </tr> 
        			<tr> <td colspan="3" id="featureList" /> </tr>
          </table>
  			</tr>
        
        
  		</table>
  		</td>
  	</tr>
  </table>
  
  <div id="debug"></div>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/world_frame_config.xml
  
  Index: world_frame_config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>world_frame_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
          <MouseClickHandler id="mainMouseClick"/>
        </tools>
      </Context>
      
      <Context id="locator">
        <defaultModelUrl>world_frame_model.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <AoiBoxWZ id="aoiBox2">
            <htmlTagId>locatorMap</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>locatorContainer</mapContainerId>
          </AoiBoxWZ>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="locatorZoomToAoi">
            <targetModel>mainMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
  
      <Transaction id="transaction">
        <widgets>
          <TransactionResponse id="transactionResponse">
          </TransactionResponse>
        </widgets>
      </Transaction>
      <FeatureCollection id="featureCollection">
        <namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
        <widgets>
          <GmlRendererWZ id="testGmlRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
          </GmlRendererWZ>
          <FeatureList id="featureList">
          </FeatureList>
        </widgets>
      </FeatureCollection>
    </models>
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to zoom in</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click to zoom out</tooltip>
        <tooltip xml:lang="fr">cliquer pour rée</tooltip>
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click and drag to pan</tooltip>
        <tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
      </DragPan>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
        <tooltip xml:lang="en">reset the map to full extent</tooltip>
        <tooltip xml:lang="fr">redonner la carte ses dimensions complèts</tooltip>
      </Reset>
      <EditPoint id="editPoint">
        <buttonBar>mainButtonBar</buttonBar>
        <mouseHandler>mainMouseClick</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/EditPointEnable.gif</enabledSrc>
        <disabledSrc>/images/EditPointDisable.gif</disabledSrc>
        <tooltip xml:lang="en">click on map to create a point feature</tooltip>
        <tooltip xml:lang="fr">click on map to create a point feature</tooltip>
        <targetModel>featureCollection</targetModel>
        <transactionResponseModel>transaction</transactionResponseModel>
        <webServiceUrl>../../../../wfs</webServiceUrl>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:the_geom/gml:Point/gml:coordinates</featureXpath>
        <featureXpath>/gml:featureMember/topp:metacat_testdata/topp:ID</featureXpath>
        <defaultModelUrl>template_metacat.xml</defaultModelUrl>
        <targetContext>mainMap</targetContext>
      </EditPoint>
      
      <GetFeatureInfo id="getFeatureInfo">
        <buttonBar>mainButtonBar</buttonBar>
         <targetModel>mainMap</targetModel>
       <!-- <targetModel>featureCollection</targetModel> -->
        <context>mainMap</context>
        <!-- <mouseHandler>mainMouseClick</mouseHandler> -->
         <mouseHandler>mainAoi</mouseHandler>
        <!-- <mouseHandler>mainAoi</mouseHandler> -->
        <class>RadioButton</class>
      <enabledSrc>/images/QueryEnable.gif</enabledSrc>
      <disabledSrc>/images/QueryDisable.gif</disabledSrc>
      </GetFeatureInfo>
    <!--SetAoi id="setAoi">
    <buttonBar>mainButtonBar</buttonBar>
    <targetModel>mainMap</targetModel>
    <mouseHandler>mainAoi</mouseHandler>
    <class>RadioButton</class>
    <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
    <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
    </SetAoi-->
  
    <AoiMetacatQuery id="aoiMetacatQuery">
  	  <buttonBar>mainButtonBar</buttonBar>
  	  <targetModel>mainMap</targetModel>
  	  <mouseHandler>mainAoi</mouseHandler>
  	  <class>RadioButton</class>
  	  <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
  	  <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
  	  <tooltip xml:lang="en">Metacat spatial query</tooltip>
    </AoiMetacatQuery>
    
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <proxyUrl>../../proxy.jsp</proxyUrl>
    <!-- 
    <serializeUrl>../../writeXml</serializeUrl>
     -->
  </MapbuilderConfig>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/world_frame_model.xml
  
  Index: world_frame_model.xml
  ===================================================================
  <?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world"
  xmlns="http://www.opengis.net/context"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
  
    <General>
      <Window width="600" height="300" />
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180"
      maxy="90" />
      <Title>metacat data</Title>
      <KeywordList>
        <Keyword>metacat</Keyword>
        <Keyword>EML</Keyword>
      </KeywordList>
      <Abstract>Low resolution.</Abstract>
    </General>
    <LayerList>
      
      
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple"
          xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map" />
        </Server>
       <Name>ocean</Name>
        <Title>ocean area</Title> 
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="0" hidden="0">
      <Server service="wms" version="1.1.0" title="wms">
      <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
      </Server>
      <Name>land</Name>
      <Title>land area</Title>
      <SRS>EPSG:4326</SRS>
      <FormatList>
      <Format current="1">image/gif</Format>
      </FormatList>
      </Layer>
  
  
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="metacat document data">
          <OnlineResource xlink:type="simple"
          xlink:href="../../../../wms" />
        </Server>
        <Name>topp:metacat_testdata</Name>
        <Title>metacat documents</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
        
  
        <!--
     
      <StyleList>
              <Style current="1">
                        <Name>0xb8d8f6</Name>
                                  <Title>0xb8d8f6</Title>
                                            <LegendURL width="16" height="16" format="image/gif">
                                                       <OnlineResource xlink:type="simple" xlink:href="../../../../wms?VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=topp:metacat_testdata&SPATIAL_TYPE=POLYGON&STYLE=0xb8d8f6&FORMAT=image%2Fgif&SIMPLE=TRUE"/>
         
         </LegendURL>
           </Style>
         </StyleList>
      -->
      
      </Layer>
      <!-- <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="terraserver">
          <OnlineResource xlink:type="simple"
          xlink:href="http://terraserver.microsoft.com/OgcWms.aspx" />
        </Server>
        <Name>DOQ</Name>
        <Title>terraserver</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/jpeg</Format>
        </FormatList>
      </Layer> -->
      
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:RIVERS</Name>
        <Title>esri world rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:country</Name>
        <Title>esri world countries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
  
  
  
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:places</Name>
        <Title>esri usa places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
      
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:CITIES</Name>
        <Title>esri world cities places</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      <!--Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1"
        title="esri places">
          <OnlineResource xlink:type="simple" xlink:href="../../../../wms" />
        </Server>
        <Name>topp:latlong</Name>
        <Title>esri world latlong</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer-->
  
      
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/knb/style/common/branding.js
  
  Index: branding.js
  ===================================================================
   /*
    *   '$RCSfile$'
    *     Purpose: Default style sheet for KNB project web pages 
    *              Using this stylesheet rather than placing styles directly in 
    *              the KNB web documents allows us to globally change the 
    *              formatting styles of the entire site in one easy place.
    *   Copyright: 2000 Regents of the University of California and the
    *               National Center for Ecological Analysis and Synthesis
    *     Authors: Matt Jones
    *
    *    '$Author$'
    *      '$Date$'
    *  '$Revision$'
    *
    * This program is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License as published by
    * the Free Software Foundation; either version 2 of the License, or
    * (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    */
  
  
  /**
   *  NOTE: THIS SCRIPT EXPECTS YOU ALREADY TO HAVE IMPORTED THE FOLLOWING 
   *  VARIABLES, WHICH ARE TYPICALLY DEFINED IN style/skins/qformat/qformat.js:
   *
   *   Location of the header that will be displayed at the top of the page
   *  HEADER_URL 
   *
   *   Location of the header that will be displayed at the top of the page
   *  LEFTCOL_URL 
   *
   *   Location of the header that will be displayed at the top of the page
   *  RIGHTCOL_URL 
   *
   *   Location of the header that will be displayed at the top of the page
   *  FOOTER_URL 
   *
   * header iframe class
   *  IFRAME_HEADER_CLASS
   *
   * left column iframe class
   *  IFRAME_LEFTCOL_CLASS
   *
   * right column iframe class
   *  IFRAME_RIGHTCOL_CLASS
   *
   * footer iframe class
   *  IFRAME_FOOTER_CLASS
   *
   * entire table class
   *  TEMPLATE_TABLE_CLASS
   *
   * header table-cell class. Note you should not set css "width" on this, since it 
   * includes a colspan
   *  TEMPLATE_HEADERROW_CLASS
   *
   * left column table-cell class. Note that restricting css "height" on this may 
   * affect visibility of the main content, since it's in the same table row 
   *  TEMPLATE_LEFTCOL_CLASS
   *
   * main central content table-cell class. Note that css attributes set here may 
   * apply to the content nested inside this cell
   *  TEMPLATE_CONTENTAREA_CLASS
   *
   * rigth column table-cell class. Note that restricting css "height" on this may 
   * affect visibility of the main content, since it's in the same table row 
   *  TEMPLATE_RIGHTCOL_CLASS
   *
   * footer table-cell class. Note you should not set "width" on this, since it 
   * includes a colspan
   *  TEMPLATE_FOOTERROW_CLASS
   */
  
  
  
  /**
   *  inserts the first half of the template table that surrounds the page's'
   *  content, including the the optional header and left column areas
   *  referenced by the HEADER_URL and LEFTCOL_URL settings
   */
  function insertTemplateOpening() {
  
    //table opening tag
    document.write("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" "
                                    +" class=\""+TEMPLATE_TABLE_CLASS+"\">");
    //first row is header
    document.write("<tr><td "+_getColSpanString()+" class=\""+TEMPLATE_HEADERROW_CLASS+"\">");
  
    //content for the header (if any)
    _createIFrameWithURL(HEADER_URL, IFRAME_HEADER_CLASS);
  
    document.write("</td></tr><tr>");
  
    //content for the left column (if any)
    if (!_isBlank(LEFTCOL_URL)) {
  
      document.write("<td class=\""+TEMPLATE_LEFTCOL_CLASS+"\">");
  
      _createIFrameWithURL(LEFTCOL_URL, IFRAME_LEFTCOL_CLASS);
  
      document.write("</td>");
    }
  
    //main content area
    document.write("<td class=\""+TEMPLATE_CONTENTAREA_CLASS+"\">");
  }
  
  /**
   *  inserts the last half of the template table that surrounds the page's'
   *  content, including the optional right column and footer areas
   *  referenced by the RIGHTCOL_URL and FOOTER_URL settings
   */
  function insertTemplateClosing() {
  
    //right column
    document.write("</td>");
  
    //content for the right column (if any)
    if (!_isBlank(RIGHTCOL_URL)) {
  
      document.write("<td class=\""+TEMPLATE_RIGHTCOL_CLASS+"\">");
  
      _createIFrameWithURL(RIGHTCOL_URL, IFRAME_RIGHTCOL_CLASS);
  
      document.write("</td>");
    }
  
    //last row is footer
    document.write("</tr><tr><td "+_getColSpanString()+" class=\""
                                                +TEMPLATE_FOOTERROW_CLASS+"\">");
  
    //content for the footer (if any)
    _createIFrameWithURL(FOOTER_URL, IFRAME_FOOTER_CLASS);
  
    //close table
    document.write("</td></tr></table>");
  
  }
  
  
  /**
   *  inserts the header referenced by the SEARCHBOX_URL setting
   */
  function insertSearchBox() { 
  
    if (!_isBlank(SEARCHBOX_URL)) {
  
      _createIFrameWithURL(SEARCHBOX_URL, IFRAME_SEARCHBOX_CLASS);
    }
  
  }
  
  /**
   *  inserts the header referenced by the ADVANCED_SEARCHBOX_URL setting
   */
  function insertAdvancedSearchBox() { 
  
    if (!_isBlank(ADVANCED_SEARCHBOX_URL)) {
  
      _createIFrameWithURL(ADVANCED_SEARCHBOX_URL, IFRAME_ADVANCED_SEARCHBOX_CLASS);
    }
  
  }
  
  /**
   *  inserts the header referenced by the LOGINBOX_URL setting
   */
  function insertLoginBox() { 
  
    if (!_isBlank(LOGINBOX_URL)) {
  
      _createIFrameWithURL(LOGINBOX_URL, IFRAME_LOGINBOX_CLASS);
    }
  
  }
  
  
  /**
   *  inserts an iframe into the document and assigns it the passed source URL
   *  and class attribute
   */
  function _createIFrameWithURL(targetURL, cssClass) {
  
  
    if (_isBlank(targetURL)) {
  
      document.write("&nbsp;");
  
    } else {
  
      document.write("<iframe src=\""+targetURL+"\" class=\""+cssClass+"\" "
                    +" id=\"" + cssClass + "\""
                    +" name=\"" + cssClass + "\""
  				  + "\" marginwidth=\"0\" scrolling=\"no\" "
                    +" marginheight=\"0\" marginwidth=\"0\" scrolling=\"no\" "
                    +" border=\"0\" frameborder=\"0\" framespacing=\"0\" "
                    +" hspace=\"0\" vspace=\"0\">Your browser does not support"
                    +" the iframe tag. <a href=\""+targetURL+"\" "
                    +"target=\"_blank\">This content</a>"
                    +" should have been displayed at this location</iframe>");
    }
  }
  
  
  
  function _isBlank(testString) {
  
    return (  !testString
            || testString==null
            || (testString.replace(/^\s*/, '').replace(/\s*$/,'')==""));
  }
  
  
  function _getColSpanString() {
  
    var colspan = 1;
    if (!_isBlank(LEFTCOL_URL))  colspan++;
    if (!_isBlank(RIGHTCOL_URL)) colspan++;
    if (colspan==1) return "";
    else return " colspan=\""+colspan+"\" ";
  } 
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/knb/style/skins/knb/knb.css
  
  Index: knb.css
  ===================================================================
   /*
    *   '$RCSfile$'
    *     Purpose: Default style sheet for KNB project web pages 
    *              Using this stylesheet rather than placing styles directly in 
    *              the KNB web documents allows us to globally change the 
    *              formatting styles of the entire site in one easy place.
    *   Copyright: 2000 Regents of the University of California and the
    *               National Center for Ecological Analysis and Synthesis
    *     Authors: Matt Jones
    *
    *    '$Author$'
    *      '$Date$'
    *  '$Revision$'
    *
    * This program is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License as published by
    * the Free Software Foundation; either version 2 of the License, or
    * (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    */
  
  
  
  /*
   *  import eml css:
   */
  
  @import url(/knb/style/common/eml_xsl.css);
  
  
  /*
   *  import eml css:
   */
  
  @import url(http://knb.ecoinformatics.org/portalpages.css);
  
  
  /**
   *  set the correct iframe sizes to accomodate the 
   *  header, footer, left and right areas.
   *  NOTE: these styles apply only to each 
   *  container frame, *NOT* to the document within it!
   */  
  .iframeheaderclass {
    height:   80px; 
    width:    100%;
    border:   0px;
    margin:   0px;
  }
  
  .iframesearchboxclass {
    height:   431px; 
    width:    100%;
    border:   0px;
    margin:   0px;
  }
  
  .iframeleftcolclass  { /* not used */ }
  .iframerightcolclass { /* not used */ }
  .iframefooterclass   { /* not used */ }
  
  /**
   *  set the size and alignment etc of the top-level layout table
   */  
  .templatetableclass {
    width:   100%; 
    border:   0px;
    padding:  0px;
    margin:   0px;
  }
  
  
  /**
   *  set the style of the main content area and its contents
   */ 
  .templatecontentareaclass {
    border:   0px;
    padding:  0px;
    margin:   0px;
  }
  
  
  /**
   *  set the correct <td> sizes to accomodate the 
   *  header, footer, left and right iframes.
   *  NOTE: these styles apply only to each 
   *  container frame, *NOT* to the document in
   *  the iframe within it!
   */  
  .templateheaderrowclass {
    height:   80px; 
  /*
    no width allowed - uses same width as table class
  */
    border:   0px;
    padding:  0px;
    margin:   0px;
  }
  
  
  .templateleftcolclass {
    height:   100%; 
    width:    0px;
    border:   0px;
    padding:  0px;
    margin:   0px;
  }
  
  
  .templaterightcolclass {
    height:   100%; 
    width:    0px;
    border:   0px;
    padding:  0px;
    margin:   0px;
  }
  
  
  .templatefooterrowclass {
    height:   0px; 
  /*
    no width allowed - uses same width as table class
  */
    border:   0px;
    padding:  0px;
    margin:   0px;
  }
  
  
  /**
   *  these override styles imported from eml css 
   */
  
  
  .sectionnames{
      font-weight: bold;
      font-size: 16px;
      color: #0040A1;
  }
  .highlight  {
      background-color: #dddddd; 
      font-size: 12px;
      border: solid #ffffff 1px;
  } 
  
  
  .tablehead {
      background-image: url(http://knb.ecoinformatics.org/images/panelhead_bg.gif);
      color: #0040A1; 
      text-align: left;
      font-size: 14px; 
      font-weight: bold;
      border-top: solid #ffffff 2px;
      border-bottom: solid #ffffff 2px;
      padding-left: 15%;
      padding-top: 0px;
      padding-bottom: 0px;
  }
  
  th.tablehead {
  
      text-align: center;
      border: 0px;
      margin: 0px;
      padding: 0px;
      height:  21px;
  }
  
  .tablehead_lcorner {
      background-image: url(http://knb.ecoinformatics.org/images/panelhead_bg_lcorner.gif);
      background-position: right top;
      background-repeat: no-repeat;
      padding: 0px;
      margin:  0px;
      width:   10px;
      height:  21px;
  }    
      
  .tablehead_rcorner {
      background-image: url(http://knb.ecoinformatics.org/images/panelhead_bg_rcorner.gif);
      background-position: left top;
      background-repeat: no-repeat;
      padding: 0px;
      margin:  0px;
      width:   10px;
      height:  21px;
  } 
  a {
      color: #669933;
      font-weight: bold;
      font-size: 12px; 
      text-decoration: none; }
      
  a:hover {
      color: #ff9933;
      text-decoration: underline; }
  /**
   *  these are used only in the metacat pages
   */
  
  p.emphasis {
  
    font-size: 18px;
    color: #dd7744; 
    font-weight: bold;
    font-style:  normal;
  }
  
  .searchresultsdivider {
      background-color: #dddddd;   
  }
  
  /**
   *  these are used only in the registry skins
   */
  p.searchbox {
      color: #0040A1;
      font-weight: bold;
      font-size: 12px; 
      text-decoration: none; 
  }
  
  .intro {
          width:   760px;
          margin-left:    15px;
  }
  
  br {
      margin: 0px;
      padding: 0px;
  }
  
  textarea {
     width: 80%;
  }
  
  .required {
      font-weight: bold;
      color: #b00000;
  }
  
  .label {
      font-weight: bold;
  }
  
  .emphasis {
      font-weight: bold;
      font-size: 18px;
      color: #000000;
  }
  
  .boldlink {
  	font-weight: bold;
  	font-size: 12px;
  }
  .colorbold {
  	font-weight: bold;
  	color: #669933;
  	font-size: 12px;
  }
  
  .redbold {
  	font-weight: bold;
  	color: #b00000;
  	font-size: 12px;
  }
  
  .greenbold {
  	font-weight: bold;
  	color: #008000;
  	font-size: 12px;
  }
  
  .smalltext {
  	font-weight: bold;
  	font-size: 10px;
  	vertical-align: super;
  }
  
  .italicized {
  	font-style: italic;
  	font-size: 12px;
  }
  
  .regtext {
  	font-weight: normal;
  	font-size: 12px;
  }
  .sectbody {
  	background: #EAEAEA;
  	font-size: 12px;
          font-weight: bold;}
  
  .sectheader {
  	background: #B2D2FE;
  	color: #0040A1;
  	font-size: 14px;
          font-weight: bold;}
  	
  .tables {
          width:   760px;
          margin-left:      20px;
          border-top: solid black 1px;
          border-left: solid black 1px;
          border-right: solid black 1px;
  }
  
  .hide {
        display:none;
    }
  
  .bordertop {
          border-top: solid black 1px;
        }
        
  .borderbottom {
          border-bottom: 1px solid black;}
  	
  .topbottom {
  	border-top: 1px solid black;
  	border-bottom: 1px solid black; 
  	}
  
  .longwidth {
  	width: 80%;
  	}
  
  .shortwidth {
  	width: 40%;
  	}
  	
  .rightCol {
         width:  24%;
         text-align: right;
      }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/metacat_knp/knb/style/skins/knb/knb.js
  
  Index: knb.js
  ===================================================================
   /**
    *   '$RCSfile$'
    *     Purpose: Default style sheet for KNB project web pages 
    *              Using this stylesheet rather than placing styles directly in 
    *              the KNB web documents allows us to globally change the 
    *              formatting styles of the entire site in one easy place.
    *   Copyright: 2000 Regents of the University of California and the
    *               National Center for Ecological Analysis and Synthesis
    *     Authors: Matt Jones
    *
    *    '$Author$'
    *      '$Date$'
    *  '$Revision$'
    *
    * This program is free software; you can redistribute it and/or modify
    * it under the terms of the GNU General Public License as published by
    * the Free Software Foundation; either version 2 of the License, or
    * (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    */
  
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
   * * * * * *  CONFIGURATION SETTINGS - EDIT THESE FOR YOUR ENVIRONMENT * * * * 
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  
   
  //  These settings allow you to include and display common content (eg a common 
  //  header) on all your pages, in much the same way as a frameset allows you to 
  //  do, but through the use of iframes and a table instead. You can include up 
  //  to 4 external pages, each one within the header, footer, left or right areas
  //
  //  looks like this (if you're using a fixed width font to display these notes):
  //    ___________________
  //    |     header      |
  //    |-----------------|
  //    | |             | |
  //    | |             | |
  //    |L|   content   |R|
  //    | |             | |
  //    | |             | |
  //    |-----------------|
  //    |     footer      | 
  //    -------------------
  //
  //  Each area may display another page on the local site, or a page on a 
  //  different server, or may be set to display nothing (in which case an iframe 
  //  will not be drawn, although the containing table cell will still need to be 
  //  resized using the css style - see below) 
  //
  //  NOTES:
  //
  //  1) if you have any links in the included documents, the target attribute for 
  //     these *MUST* be set to _top, otherwise the new document will be displayed 
  //     inside the small iframe areas, instead of replacing the entire page!
  //     - example: <a href="index.html" target="_top">HOME</a>
  //   
  //  2) you will need to set the correct iframe size, in order to accomodate 
  //     each of these areas on the page. The default location for these size 
  //     settings is in the default.css file - see the "IFRAME_XXXXXX_CLASS" 
  //     variables (below) for the name of the style to edit
  //
  //  3) you will also need to set the correct table cell sizes and/or overall 
  //     table size for similar reasons. The default location for these size 
  //     settings is in the default.css file - see the "TEMPLATE_XXXXXX_CLASS" 
  //     variables (below) for the name of the style to edit
  
  
  
  ////////////////////////////////////////////////////////////////////////////////
  //  Edit these variables to define the content that will be loaded into the 
  //  various iframes. Each may be a relative path to another page on the local 
  //  site, or a full URL to a page on a remote server, or may be set to the empty 
  //  string if no content is required at that position on the page (and in which  
  //  case an iframe will not be drawn, although an empty table cell will still  
  //  exist unless it is resized smaller) . 
  //  ( e.g. if you do not want a header to be included, set: HEADER_URL="";)
  ////////////////////////////////////////////////////////////////////////////////
  
  
  //  Location of the header that will be displayed at the top of the page
  var HEADER_URL 
    = "http://knb.ecoinformatics.org/includes/include_portalhead_page.jsp";
  
  // Location of the search box that will be displayed above the  
  //  results on the results page (optional)
  var SEARCHBOX_URL 
    = "http://knb.ecoinformatics.org/includes/include_searchbox_page.jsp";
  
  //  Location of the header that will be displayed at the top of the page
  var LEFTCOL_URL 
    = "";
    
  //  Location of the header that will be displayed at the top of the page
  var RIGHTCOL_URL 
    = "";
    
  //  Location of the header that will be displayed at the top of the page
  var FOOTER_URL 
    = "";
    
  
  
  
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  /* * * * * * * * *  MAY CHANGE THE FOLLOWING, BUT SHOULDN'T NEED TO* * * * * */ 
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  
    
  ////////////////////////////////////////////////////////////////////////////////
  //  Edit the default.css file to set the correct iframe sizes to accomodate the 
  //  header, footer, left and right areas.
  //  The following variables set the names of the styles that will be applied to 
  //  each of the iframes - they can be anythign you wish, provided you use the 
  //  same names for your classes in the css file
  //  NOTE: these styles apply only to each container frame, *NOT* to the document 
  //  within it!
  ////////////////////////////////////////////////////////////////////////////////
  
  //header iframe class
  var IFRAME_HEADER_CLASS         = "iframeheaderclass";
  
  //(metacat only) search box iframe class
  var IFRAME_SEARCHBOX_CLASS      = "iframesearchboxclass";
  
  //left column iframe class
  var IFRAME_LEFTCOL_CLASS        = "iframeleftcolclass";
  
  //right column iframe class
  var IFRAME_RIGHTCOL_CLASS       = "iframerightcolclass";
  
  //footer iframe class
  var IFRAME_FOOTER_CLASS         = "iframefooterclass";
  
  
  ////////////////////////////////////////////////////////////////////////////////
  //  Edit the default.css file to set the correct table sizes to accomodate the 
  //  header, footer, left and right iframes.
  //  The following variables set the names of the styles that will be applied to 
  //  each of the table cells (or the table itself - see below) - they can be 
  //  anything you wish, provided you use the same names for your classes in the 
  //  css file
  //  NOTE: these styles apply only to each table cell, *NOT* to the document 
  //  inside the iframe that is nested within it! (the exception is 
  //  TEMPLATE_CONTENTAREA_CLASS, since the content probably isn't within an 
  //  iframe - so style elements in this class will apply to the content istelf)
  ////////////////////////////////////////////////////////////////////////////////
  
  //entire table class
  var TEMPLATE_TABLE_CLASS        = "templatetableclass";
  
  //header table-cell class. Note you should not set css "width" on this, since it 
  //includes a colspan
  var TEMPLATE_HEADERROW_CLASS    = "templateheaderrowclass";
  
  //left column table-cell class. Note that restricting css "height" on this may 
  //affect visibility of the main content, since it's in the same table row 
  var TEMPLATE_LEFTCOL_CLASS      = "templateleftcolclass";
  
  //main central content table-cell class. Note that css attributes set here may 
  //apply to the content nested inside this cell
  var TEMPLATE_CONTENTAREA_CLASS  = "templatecontentareaclass";
  
  //rigth column table-cell class. Note that restricting css "height" on this may 
  //affect visibility of the main content, since it's in the same table row 
  var TEMPLATE_RIGHTCOL_CLASS     = "templaterightcolclass";
  
  //footer table-cell class. Note you should not set "width" on this, since it 
  //includes a colspan
  var TEMPLATE_FOOTERROW_CLASS    = "templatefooterrowclass";
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/owsContext/cite.xml
  
  Index: cite.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  
  <OWSContext version="0.0.13"
  
      id="ows-context-tie"
  
      xmlns="http://www.opengis.net/context"
  
      xmlns:xlink="http://www.w3.org/1999/xlink"
  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  
      xmlns:sld="http://www.opengis.net/sld"
  
      xmlns:ogc="http://www.opengis.net/ogc"
  
      xmlns:ows="http://www.opengis.net/ows"
  
      xmlns:param="http;//www.opengis.net/param"
  
      xsi:schemaLocation="http://www.opengis.net/oc oc_0_0_13.xsd">
  
    <General>
  
      <Window width="500" height="285"/>
  
      <ows:BoundingBox crs="EPSG:4326">
  
        <ows:LowerCorner>-0.0042 -0.0024</ows:LowerCorner>
  
        <ows:UpperCorner>0.0042 0.0024</ows:UpperCorner>
  
      </ows:BoundingBox>
  
      <Title>Blue Lake Cite Map</Title>
  
      <KeywordList>
  
        <Keyword>CITE</Keyword>
  
      </KeywordList>
  
      <Abstract></Abstract>
  
  
  
      <LogoURL width="140" height="65" format="image/gif">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengis.org/img/ogc_header_top_left.gif"/>
  
      </LogoURL>
  
      <DescriptionURL format="text/html">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengeospatial.org/press/?page=pressrelease&amp;year=0&amp;prid=211"/>
  
      </DescriptionURL>
  
      <ows:ServiceProvider>
  
      </ows:ServiceProvider>
  
    </General>
  
    <ResourceList>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:Forests</Name>
  
        <Title>Forests</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:Ponds</Name>
  
        <Title>Ponds</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
      <Layer hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Lakes">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:Lakes</Name>
  
        <Title>Lakes</Title>
  
        <Geometry>the_geom</Geometry>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:Streams</Name>
  
        <Title>Streams</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:NamedPlaces</Name>
  
        <Title>Named Places</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:Buildings</Name>
  
        <Title>Buildings</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:DividedRoutes</Name>
  
        <Title>Divided Routes</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
      <FeatureType hidden="0">
  
        <Server service="OGC:WFS" version="1.0.0" title="Cite Road Segments">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wfs"/>
  
        </Server>
  
        <Name>cite:RoadSegments</Name>
  
        <Title>Road Segments</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <Geometry>the_geom</Geometry>
  
      </FeatureType>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:Bridges</Name>
  
        <Title>Bridges</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Cite Forests">
  
          <OnlineResource xlink:type="simple" xlink:href="/geoserver/wms"/>
  
        </Server>
  
        <Name>cite:MapNeatline</Name>
  
        <Title>Map Neatline</Title>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList><Format current="1">image/png</Format></FormatList>
  
      </Layer>
  
    
  
    </ResourceList>
  
  </OWSContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/owsContext/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Mapbuilder GML rendering Demo</title>
      <link rel="stylesheet" href="../../lib/skin/default/mapStyle.css" type="text/css">
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='owsContext.xml';
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <table>
        <tr>
          <td/>
          <td><h2 id="mapTitle"></h2></td>
        </tr>
        <tr>
  
  <!-- left hand column -->
          <td valign="top" style="padding:10px">
            <div>
              <div id="locatorMap"/>
            </div>
            <div>
              <div id="legend"/>
            </div>
           <hr/>
           <div>
              data used in this demo<br/>
              <a href="javascript:window.open(config.objects.mainMap.url,'modelXML',null,false)" target="dataWindow">context document</a><br/>
              <a href="javascript:window.open(document.mbConfigUrl,'modelXML')" target="dataWindow">configuration document</a><br/>
              <p id="saveModelWidget">save</p>
           </div>
          </td>
  
  <!-- right hand column -->
          <td>
            <table width="100%">
              <tr>
                <td align="left">
                  <h2 id="mapTitle"></h2>
                </td>
              </tr>
              <tr>
                <td align="center">
                  <table>
                    <tr>
                      <td colspan="3">
                        <div id="mainMapPane"/>
                        <div id="loading">
                          <p>Loading Program<br/>
                          <img src="../../lib/skin/default/images/Loading.gif"/>
                          </p>
                        </div>
                      </td>
                    </tr>
                    <tr>
                      <td align="left">
                        <div id="mainButtonBar"/>
                      </td>
                      <td align="center" id="mapScaleText" />
                      <td align="right" id="cursorTrack" />
                    </tr>
                  </table>
                </td>
              </tr>
              <tr>
                <td align="left" id="abstract"/>
              </tr>
              <tr>
                <td align="left" id="gmlModelStatus"/>
              </tr>
            </table>
            <hr/>
            <p align="right"><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</p>
          </td>
        </tr>
  
      </table>
  
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/owsContext/locatorBoston.xml
  
  Index: locatorBoston.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="180" height="90"/>
      <BoundingBox SRS="EPSG:4326" minx="-76.984875" miny="39.40874999999999" maxx="-64.834875" maxy="45.48374999999999"/>
      <Title>Boston locator map</Title>
      <KeywordList>
        <Keyword>Boston</Keyword>
        <Keyword>atlas</Keyword>
      </KeywordList>
      <Abstract>Atlas of Canada, World Base Map. Small scale vector based map served by Mapserver WMS.</Abstract>
      <LogoURL width="34" height="35" format="image/jpg">
        <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/site/english/atlas_identifier.jpg"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Michael Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+1 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+1 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>land</Name>
        <Title>land area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>lake_fill</Name>
        <Title>lakes</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>lake_outline</Name>
        <Title>lake outlines</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>rivers</Name>
        <Title>rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>boundaries</Name>
        <Title>boundaries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/owsContext/ocClass4.xml
  
  Index: ocClass4.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  
  <OWSContext version="0.0.13"
  
      id="ows-context-tie"
  
      xmlns="http://www.opengis.net/context"
  
      xmlns:xlink="http://www.w3.org/1999/xlink"
  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  
      xmlns:sld="http://www.opengis.net/sld"
  
      xmlns:ogc="http://www.opengis.net/ogc"
  
      xmlns:ows="http://www.opengis.net/ows"
  
      xmlns:param="http;//www.opengis.net/param"
  
      xsi:schemaLocation="http://www.opengis.net/oc oc_0_0_13.xsd">
  
    <General>
  
      <Window width="500" height="300"/>
  
      <ows:BoundingBox crs="EPSG:4326">
  
        <ows:LowerCorner>-71.10285218349743 42.261800717452054</ows:LowerCorner>
  
        <ows:UpperCorner>-71.04767081931412 42.29490953596204</ows:UpperCorner>
  
      </ows:BoundingBox>
  
      <!--ows:BoundingBox crs="EPSG:4326">
  
        <ows:LowerCorner>-71.1485566986829 42.2593928033786</ows:LowerCorner>
  
        <ows:UpperCorner>-71.0016725358029 42.4399863588876</ows:UpperCorner>
  
      </ows:BoundingBox-->
  
      <Title>OWS Context Document Schema Interoperability Experiment</Title>
  
      <KeywordList>
  
        <Keyword>MassGIS</Keyword>
  
        <Keyword>Boston</Keyword>
  
        <Keyword>Massachusetts</Keyword>
  
      </KeywordList>
  
      <Abstract> The OpenGIS Web Services Context Document Schema Interoperability Experiment is initiated by cadcorp, DM Solutions, GeoConnections/Natural Resources Canada, and IONIC Software. It is an Interoperability Experiment intended to an XML schema for encoding OpenGIS Web Services Context documents (OWS Context).  OWS Context documents are related to, but more powerful than, Web Map Context Documents (03-036r2). The latter are limited to referencing OGC Web Map Services (WMS), whereas the former can reference other OGC Web Services, e.g. Web Feature Services (WFS), Web Coverage Services (WCS), etc.</Abstract>
  
      <LogoURL width="140" height="65" format="image/gif">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengis.org/img/ogc_header_top_left.gif"/>
  
      </LogoURL>
  
      <DescriptionURL format="text/html">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengis.org/press/?page=pressrelease&amp;view=20040525_ContextIE_PR"/>
  
      </DescriptionURL>
  
      <ows:ServiceProvider>
  
      <ows:ProviderName>Environment Canada</ows:ProviderName>
  
      <ows:ProviderSite xlink:type="simple" xlink:href="http://www.ec.gc.ca/"/>
  
      <ows:ServiceContact>
  
        <ows:IndividualName>Tom Kralidis</ows:IndividualName>
  
        <ows:PositionName>Systems Scientist</ows:PositionName>
  
        <ows:ContactInfo>
  
          <ows:Phone>
  
            <ows:Voice>+01-905-336-4409</ows:Voice>
  
            <ows:Facsimile>+01-905-336-4499</ows:Facsimile>
  
          </ows:Phone>
  
          <ows:Address>
  
            <ows:DeliveryPoint>867 Lakeshore Road</ows:DeliveryPoint>
  
            <ows:City>Burlington</ows:City>
  
            <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
  
            <ows:PostalCode>L7R4A6</ows:PostalCode>
  
            <ows:Country>Canada</ows:Country>
  
            <ows:ElectronicMailAddress>tom.kralidis at ec.gc.ca</ows:ElectronicMailAddress>
  
          </ows:Address>
  
          <ows:OnlineResource xlink:type="simple" xlink:href="http://www.ec.gc.ca/"/>
  
          <ows:HoursOfService>0700h - 1500h (EST), Monday - Friday</ows:HoursOfService>
  
          <ows:ContactInstructions>Just call or email</ows:ContactInstructions>
  
        </ows:ContactInfo>
  
        <ows:Role>Systems Scientist</ows:Role>
  
      </ows:ServiceContact>
  
    </ows:ServiceProvider>
  
    </General>
  
    <ResourceList>
  
      <Coverage hidden="0">
  
        <Server service="OGC:WCS" version="1.0.0" title="Boston Indexed Geotiff imagery">
  
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicwcs/coverage/BOSTONPOOL"/>
  
        </Server>
  
        <Name>MOD_Grid_L2g_2d</Name>
  
        <Title>MOD_Grid_L2g_2d Coverage Offering</Title>
  
        <Abstract>MOD_Grid_L2g_2d Coverage Offering, MOD09GHK data</Abstract>
  
        <MetadataURL format="text/xml">
  
          <OnlineResource xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicwcs/coverage/BOSTONPOOL/REQUEST/getdir/DIR/metadata/DATA/LPR/BOSTONPOOL/MOD_Grid_L2g_2d.xml"/>
  
        </MetadataURL>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">GeoTIFF</Format>
  
        </FormatList>
  
        <DimensionList>
  
          <Dimension name="time" units="ISO8601">2003-12-01T14:55:00Z/2003-12-03T20:50:00Z</Dimension>
  
        </DimensionList>
  
        <ParameterList>
  
          <Parameter>
  
            <param:kvp name="band" value="band1"/>
  
          </Parameter>
  
          <Parameter>
  
            <param:kvp name="interpolation" value="nearest neighbor"/>
  
          </Parameter>
  
        </ParameterList>
  
      </Coverage>
  
      <FeatureType hidden="0">
  
        <Server service="OGC:GML" version="2.1.2" title="Cadcorp GeognoSIS.NET Web Feature Service">
  
          <OnlineResource xlink:type="simple" xlink:href="http://www.cadcorpdev.co.uk/gml/MassGIS/LandUse.gml"/>
  
        </Server>
  
        <Name>Landuse</Name>
  
        <Title>Landuse</Title>
  
        <Abstract>Boston Landuse Polygons</Abstract>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:26986</SRS>
  
      </FeatureType>
  
      <Layer queryable="0" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Boston on Oracle">
  
          <OnlineResource xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA"/>
  
        </Server>
  
        <Name>hydro</Name>
  
        <Title>hydro</Title>
  
        <Abstract/>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/gif</Format>
  
          <Format>image/png</Format>
  
          <Format>image/jpeg</Format>
  
        </FormatList>
  
        <StyleList>
  
          <Style current="1">
  
            <Name>default</Name>
  
            <Title>default</Title>
  
          </Style>
  
        </StyleList>
  
      </Layer>
  
      <Layer queryable="0" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Boston on Oracle">
  
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA"/>
  
        </Server>
  
        <Name>highways</Name>
  
        <Title>highways</Title>
  
        <Abstract/>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/gif</Format>
  
          <Format>image/png</Format>
  
          <Format>image/jpeg</Format>
  
        </FormatList>
  
        <StyleList>
  
          <Style current="1">
  
            <Name>default</Name>
  
            <Title>default</Title>
  
          </Style>
  
        </StyleList>
  
      </Layer>
  
      <FeatureType hidden="0">
  
        <Server service="OGC:WFS" version="1.0.0" title="Boston on Oracle">
  
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA"/>
  
        </Server>
  
        <Name>roads</Name>
  
        <Title>roads</Title>
  
        <Abstract/>
  
        <Geometry>GEOMETRY</Geometry>
  
        <ogc:Filter>
  
          <ogc:PropertyIsEqualTo>
  
            <ogc:PropertyName>CLASS</ogc:PropertyName>
  
            <ogc:Literal>4</ogc:Literal>
  
          </ogc:PropertyIsEqualTo>
  
        </ogc:Filter>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:26986</SRS>
  
      </FeatureType>
  
      <Layer queryable="0" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Boston on Oracle">
  
          <OnlineResource xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA"/>
  
        </Server>
  
        <Name>place_names</Name>
  
        <Title>place_names</Title>
  
        <Abstract/>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/gif</Format>
  
          <Format>image/png</Format>
  
          <Format>image/jpeg</Format>
  
        </FormatList>
  
        <StyleList>
  
          <Style current="1">
  
            <Name>default</Name>
  
            <Title>default</Title>
  
          </Style>
  
        </StyleList>
  
      </Layer>
  
    </ResourceList>
  
  </OWSContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/owsContext/oc_0_0_13r1.xml
  
  Index: oc_0_0_13r1.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  
  <OWSContext version="0.0.13"
  
      id="ows-context-tie"
  
      xmlns="http://www.opengis.net/context"
  
      xmlns:xlink="http://www.w3.org/1999/xlink"
  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  
      xmlns:sld="http://www.opengis.net/sld"
  
      xmlns:ogc="http://www.opengis.net/ogc"
  
      xmlns:ows="http://www.opengis.net/ows"
  
      xmlns:param="http;//www.opengis.net/param"
  
      xsi:schemaLocation="http://www.opengis.net/oc oc_0_0_13.xsd">
  
    <General>
  
      <Window width="500" height="300"/>
  
      <ows:BoundingBox crs="EPSG:4326">
  
        <ows:LowerCorner>-71.10307290895416 42.26191108018042</ows:LowerCorner>
  
        <ows:UpperCorner>-71.04789154477085 42.295019898690406</ows:UpperCorner>
  
      </ows:BoundingBox>
  
      <!--ows:BoundingBox crs="EPSG:4326">
  
        <ows:LowerCorner>-71.1485566986829 42.2593928033786</ows:LowerCorner>
  
        <ows:UpperCorner>-71.0016725358029 42.4399863588876</ows:UpperCorner>
  
      </ows:BoundingBox-->
  
      <Title>OWS Context Document Schema Interoperability Experiment</Title>
  
      <KeywordList>
  
        <Keyword>MassGIS</Keyword>
  
        <Keyword>Boston</Keyword>
  
        <Keyword>Massachusetts</Keyword>
  
      </KeywordList>
  
      <Abstract> The OpenGIS Web Services Context Document Schema Interoperability Experiment is initiated by cadcorp, DM Solutions, GeoConnections/Natural Resources Canada, and IONIC Software. It is an Interoperability Experiment intended to an XML schema for encoding OpenGIS Web Services Context documents (OWS Context).  OWS Context documents are related to, but more powerful than, Web Map Context Documents (03-036r2). The latter are limited to referencing OGC Web Map Services (WMS), whereas the former can reference other OGC Web Services, e.g. Web Feature Services (WFS), Web Coverage Services (WCS), etc.</Abstract>
  
      <LogoURL width="140" height="65" format="image/gif">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengis.org/img/ogc_header_top_left.gif"/>
  
      </LogoURL>
  
      <DescriptionURL format="text/html">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengis.org/press/?page=pressrelease&amp;view=20040525_ContextIE_PR"/>
  
      </DescriptionURL>
  
      <ows:ServiceProvider>
  
      <ows:ProviderName>Environment Canada</ows:ProviderName>
  
      <ows:ProviderSite xlink:type="simple" xlink:href="http://www.ec.gc.ca/"/>
  
      <ows:ServiceContact>
  
        <ows:IndividualName>Tom Kralidis</ows:IndividualName>
  
        <ows:PositionName>Systems Scientist</ows:PositionName>
  
        <ows:ContactInfo>
  
          <ows:Phone>
  
            <ows:Voice>+01-905-336-4409</ows:Voice>
  
            <ows:Facsimile>+01-905-336-4499</ows:Facsimile>
  
          </ows:Phone>
  
          <ows:Address>
  
            <ows:DeliveryPoint>867 Lakeshore Road</ows:DeliveryPoint>
  
            <ows:City>Burlington</ows:City>
  
            <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
  
            <ows:PostalCode>L7R4A6</ows:PostalCode>
  
            <ows:Country>Canada</ows:Country>
  
            <ows:ElectronicMailAddress>tom.kralidis at ec.gc.ca</ows:ElectronicMailAddress>
  
          </ows:Address>
  
          <ows:OnlineResource xlink:type="simple" xlink:href="http://www.ec.gc.ca/"/>
  
          <ows:HoursOfService>0700h - 1500h (EST), Monday - Friday</ows:HoursOfService>
  
          <ows:ContactInstructions>Just call or email</ows:ContactInstructions>
  
        </ows:ContactInfo>
  
        <ows:Role>Systems Scientist</ows:Role>
  
      </ows:ServiceContact>
  
    </ows:ServiceProvider>
  
    </General>
  
    <ResourceList>
  
    <Layer queryable="0" hidden="0">
  
     <Server service="OGC:WMS" version="1.1.1" title="OGC:WMS">
  
      <OnlineResource xlink:type="simple" xlink:href="http://demo.cubewerx.com/ows1/cubeserv/cubeserv.cgi"/>
  
     </Server>
  
     <Name>DOQ:TerraService</Name>
  
     <Title>USGS Digital Ortho-Quadrangles</Title>
  
     <SRS>EPSG:4326</SRS>
  
     <FormatList>
  
      <Format current="1">image/gif</Format>
  
     </FormatList>
  
     <StyleList>
  
     <Style current="1">
  
      <Name>default</Name>
  
      <Title>default</Title>
  
     </Style>
  
     </StyleList>
  
    </Layer>
  
      <Coverage hidden="0">
  
        <Server service="OGC:WCS" version="1.0.0" title="Boston Indexed Geotiff imagery">
  
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicwcs/coverage/BOSTONPOOL"/>
  
        </Server>
  
        <Name>MOD_Grid_L2g_2d</Name>
  
        <Title>MOD_Grid_L2g_2d Coverage Offering</Title>
  
        <Abstract>MOD_Grid_L2g_2d Coverage Offering, MOD09GHK data</Abstract>
  
        <MetadataURL format="text/xml">
  
          <OnlineResource xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicwcs/coverage/BOSTONPOOL/REQUEST/getdir/DIR/metadata/DATA/LPR/BOSTONPOOL/MOD_Grid_L2g_2d.xml"/>
  
        </MetadataURL>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">GeoTIFF</Format>
  
        </FormatList>
  
        <DimensionList>
  
          <Dimension name="time" units="ISO8601">2003-12-01T14:55:00Z/2003-12-03T20:50:00Z</Dimension>
  
        </DimensionList>
  
        <ParameterList>
  
          <Parameter>
  
            <param:kvp name="band" value="band1"/>
  
          </Parameter>
  
          <Parameter>
  
            <param:kvp name="interpolation" value="nearest neighbor"/>
  
          </Parameter>
  
        </ParameterList>
  
      </Coverage>
  
      <FeatureType hidden="0">
  
        <Server service="OGC:GML" version="2.1.2" title="Cadcorp GeognoSIS.NET Web Feature Service">
  
          <OnlineResource xlink:type="simple" xlink:href="http://www.cadcorpdev.co.uk/gml/MassGIS/LandUse.gml"/>
  
        </Server>
  
        <Name>Landuse</Name>
  
        <Title>Landuse</Title>
  
        <Abstract>Boston Landuse Polygons</Abstract>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:26986</SRS>
  
      </FeatureType>
  
      <Layer queryable="0" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Boston on Oracle">
  
          <OnlineResource xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA"/>
  
        </Server>
  
        <Name>hydro</Name>
  
        <Title>hydro</Title>
  
        <Abstract/>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/gif</Format>
  
          <Format>image/png</Format>
  
          <Format>image/jpeg</Format>
  
        </FormatList>
  
        <StyleList>
  
          <Style current="1">
  
            <Name>default</Name>
  
            <Title>default</Title>
  
          </Style>
  
        </StyleList>
  
      </Layer>
  
      <Layer queryable="0" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Boston on Oracle">
  
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA"/>
  
        </Server>
  
        <Name>highways</Name>
  
        <Title>highways</Title>
  
        <Abstract/>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/gif</Format>
  
          <Format>image/png</Format>
  
          <Format>image/jpeg</Format>
  
        </FormatList>
  
        <StyleList>
  
          <Style current="1">
  
            <Name>default</Name>
  
            <Title>default</Title>
  
          </Style>
  
        </StyleList>
  
      </Layer>
  
      <FeatureType hidden="0">
  
        <Server service="OGC:WFS" version="1.0.0" title="Boston on Oracle">
  
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA"/>
  
        </Server>
  
        <Name>roads</Name>
  
        <Title>roads</Title>
  
        <Abstract/>
  
                          <Geometry>GEOMETRY</Geometry>
  
        <ogc:Filter>
  
          <ogc:PropertyIsEqualTo>
  
            <ogc:PropertyName>CLASS</ogc:PropertyName>
  
            <ogc:Literal>3</ogc:Literal>
  
          </ogc:PropertyIsEqualTo>
  
        </ogc:Filter>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:26986</SRS>
  
      </FeatureType>
  
      <Layer queryable="0" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Boston on Oracle">
  
          <OnlineResource xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA"/>
  
        </Server>
  
        <Name>place_names</Name>
  
        <Title>place_names</Title>
  
        <Abstract/>
  
        <sld:MinScaleDenominator>50000</sld:MinScaleDenominator>
  
        <sld:MaxScaleDenominator>5000</sld:MaxScaleDenominator>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/gif</Format>
  
          <Format>image/png</Format>
  
          <Format>image/jpeg</Format>
  
        </FormatList>
  
        <StyleList>
  
          <Style current="1">
  
            <Name>default</Name>
  
            <Title>default</Title>
  
          </Style>
  
        </StyleList>
  
      </Layer>
  
    </ResourceList>
  
  </OWSContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/owsContext/owsContext.xml
  
  Index: owsContext.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Mike Adair (NRCAN CCRs) -->
  <MapbuilderConfig version="0.2.1" id="owsContextConfig" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
  	<models>
  		<!--Logger id="eventLogDoc">
  			  <widgets>
  				<Widget id="eventLog">
  				  <stylesheet>../../lib/widget/EventLog.xsl</stylesheet>
  				</Widget>
  			  </widgets>
  		</Logger-->
  		<OwsContext id="mainMap">
  			<defaultModelUrl>oc_0_0_13r1.xml</defaultModelUrl>
  			<models>
  				<FeatureCollection id="gml2FeatureTemplate">
  					<method>get</method>
  					<widgets>
  						<!--ModelStatus id="gmlModelStatus"/-->
  						<GmlRendererWZ id="testGmlRenderer">
  							<htmlTagId>mainMapPane</htmlTagId>
  							<mapContainerId>mainMapContainer</mapContainerId>
  							<lineColor>#0000FF</lineColor>
  							<lineWidth>2</lineWidth>
  							<pointDiameter>10</pointDiameter>
  						</GmlRendererWZ>
  						<Legend id="wfsLegend">
  							<htmlTagId>legend</htmlTagId>
  						</Legend>
  					</widgets>
  				</FeatureCollection>
  			</models>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/owsMapPane.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<!--fixedWidth>300</fixedWidth-->
  				</MapPane>
  				<Loading id="loading"></Loading>
  				<AoiBoxDHTML id="aoiBoxMain">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  				</CursorTrack>
  				<MapScaleText id="mapScaleText"/>
  				<Legend id="contextLegend">
  					<htmlTagId>legend</htmlTagId>
  				</Legend>
  				<Widget id="abstract">
  					<stylesheet>../../lib/widget/Abstract.xsl</stylesheet>
  				</Widget>
  				<Widget id="mapTitle">
  					<stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
  				</Widget>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<WebServiceRequest id="wfsController">
  					<targetModel>gml2FeatureTemplate</targetModel>
  					<requestName>wfs:GetFeature</requestName>
  				</WebServiceRequest>
  			</tools>
  			<nodeSelectXpath>/wmc:OWSContext/wmc:ResourceList</nodeSelectXpath>
  		</OwsContext>
  		<Context id="locatorMap">
  			<defaultModelUrl>../data/context/locatorMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="locatorMapWidget">
  					<htmlTagId>locatorMap</htmlTagId>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<fixedWidth>180</fixedWidth>
  				</MapPane>
  				<AoiBoxWZ id="aoiBoxLocator">
  					<htmlTagId>locatorMap</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxWZ>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="locatorAoi"/>
  				<ZoomToAoi id="locatorZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Context>
  	</models>
  	<widgets>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<SetAoi id="setAoi">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/SetAoiEnable.png</enabledSrc>
  			<disabledSrc>/images/SetAoiDisable.png</disabledSrc>
  		</SetAoi>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<Save id="save">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/SaveDisable.png</disabledSrc>
  			<popupWindowName>modelXML</popupWindowName>
  		</Save>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>/widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/owsContext/tasmania.xml
  
  Index: tasmania.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  
  <OWSContext version="0.0.13"
  
      id="ows-context-tie"
  
      xmlns="http://www.opengis.net/context"
  
      xmlns:xlink="http://www.w3.org/1999/xlink"
  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  
      xmlns:sld="http://www.opengis.net/sld"
  
      xmlns:ogc="http://www.opengis.net/ogc"
  
      xmlns:ows="http://www.opengis.net/ows"
  
      xmlns:param="http;//www.opengis.net/param"
  
      xsi:schemaLocation="http://www.opengis.net/oc oc_0_0_13.xsd">
  
    <General>
  
      <Window width="500" height="250"/>
  
      <ows:BoundingBox crs="EPSG:4326">
  
        <ows:LowerCorner>141.57875 -44.26625</ows:LowerCorner>
  
        <ows:UpperCorner>151.03125 -39.56375</ows:UpperCorner>
  
      </ows:BoundingBox>
  
      <Title>WPS context doc</Title>
  
      <KeywordList>
  
        <Keyword>WPS</Keyword>
  
      </KeywordList>
  
      <Abstract>test case for the OGC WPS IE</Abstract>
  
      <LogoURL width="140" height="65" format="image/gif">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengis.org/img/ogc_header_top_left.gif"/>
  
      </LogoURL>
  
      <DescriptionURL format="text/html">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengeospatial.org/press/?page=pressrelease&amp;year=0&amp;prid=211"/>
  
      </DescriptionURL>
  
      <ows:ServiceProvider>
  
    </ows:ServiceProvider>
  
    </General>
  
    <ResourceList>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Local">
  
          <OnlineResource xlink:type="simple" xlink:href="http://localhost:8080/geoserver/wms"/>
  
        </Server>
  
        <Name>topp:tasmania_state_boundaries</Name>
  
        <Title>Tasmania State Boundaries</Title>
  
        <Abstract>Tasmania State Boundaries based on the Digital Chart of the World.</Abstract>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/png</Format>
  
        </FormatList>
  
      </Layer>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Local">
  
          <OnlineResource xlink:type="simple" xlink:href="http://localhost:8080/geoserver/wms"/>
  
        </Server>
  
        <Name>topp:tasmania_water_bodies</Name>
  
        <Title>Tasmania Water Bodies</Title>
  
        <Abstract>Tasmania Water Bodies based on the Digital Chart of the World.</Abstract>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/png</Format>
  
        </FormatList>
  
      </Layer>
  
      <FeatureType hidden="0">
  
        <Server service="OGC:WFS" version="1.0.0" title="Local">
  
          <OnlineResource xlink:type="simple" xlink:href="http://localhost:8080/geoserver/wfs"/>
  
        </Server>
  
        <Name>topp:tasmania_roads</Name>
  
        <Title>Tasmania Roads</Title>
  
        <Abstract>Tasmania Roads based on the Digital Chart of the World.</Abstract>
  
        <SRS>EPSG:4326</SRS>
  
        <Geometry>the_geom</Geometry>
  
      </FeatureType>
  
      <Layer queryable="1" hidden="0">
  
        <Server service="OGC:WMS" version="1.1.1" title="Local">
  
          <OnlineResource xlink:type="simple" xlink:href="http://localhost:8080/geoserver/wms"/>
  
        </Server>
  
        <Name>topp:tasmania_cities</Name>
  
        <Title>Tasmania Major Cities</Title>
  
        <Abstract>Tasmania Major based on the Digital Chart of the World.</Abstract>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">image/png</Format>
  
        </FormatList>
  
      </Layer>
  
    
  
    </ResourceList>
  
  </OWSContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/simple/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by Tom Kralidis (NRCAN CCRs) -->
  <MapbuilderConfig version="1.0.0" id="simpleTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>../data/context/atlasWorld.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</Loading2>
  			</widgets>
  		</Context>
  	</models>
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/simple/index.html
  
  Index: index.html
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        
  <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
      <title>Mapbuilder Simple Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config.xml';
  
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()" style="width:800px">
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> Simple Demo</h1>
      
      <div id="mainMapPane" style="float:right">
          <noscript>
              this page requires Javascript to be enabled
          </noscript>
      </div>
      
      <p>
        In it's most basic configuration, MapBuilder can be used to simply put a map
        in a web page.
        The configuration for this page consists of a single 
        model (a Web Map Context document) and two widgets (a MapPane and a loading indicator).
        See the <a href="../basic">Basic demo</a> to for an example of an interactive map, 
        as well as some of the more common ways to work with MapBuilder.
      </p>
    </body>
  </html>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/Abstract.xsl
  
  Index: Abstract.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" xmlns:wmc="http://www.opengis.net/context" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <!--
  Description: Output the context title and abstract
  Author:      Mike Adair mike.adairATnrcan.gc.ca
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  Abstract.xsl,v 1.5 2004/06/25 17:59:38 madair1 Exp
  
  -->
    <xsl:output method="xml" encoding="utf-8"/>
    
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="widgetNode"/>
    
    <xsl:template match="/">
      <xsl:apply-templates select="wmc:ViewContext/wmc:General"/>
      <xsl:apply-templates select="wmc:OWSContext/wmc:General"/>
    </xsl:template>
  
    
    <!-- Main html -->
    <xsl:template match="wmc:General">
      <xsl:param name="metadataUrl">
        <xsl:value-of select="wmc:DescriptionURL/wmc:OnlineResource/@xlink:href"/>
      </xsl:param>
      <xsl:param name="logoUrl">
        <xsl:value-of select="wmc:LogoURL/wmc:OnlineResource/@xlink:href"/>
      </xsl:param>
      <div>
        <xsl:if test="$logoUrl">
          <div style="float:right"><img src='{$logoUrl}' alt='{$logoUrl}'/></div>
        </xsl:if>
        <p>
          <xsl:choose>
            <xsl:when test="wmc:Abstract/@xml:lang">              
              <xsl:value-of select="wmc:Abstract[@xml:lang=$lang]"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="wmc:Abstract"/>
            </xsl:otherwise>
          </xsl:choose>
          <!--br/><xsl:value-of select="{$widgetNode}/stylesheet"/-->
        </p>
        <p style="float:left; clear:left; padding-top:0px; margin-top:0px;">
          <a href='{$metadataUrl}' title='{$metadataUrl}' target="moreInfo"><xsl:call-template name="moreInfo"/></a>
        </p>
        <p style="float:right; clear:right; padding-top:0px; margin-top:0px; font-weight: bold">
          provided by: <xsl:value-of select="wmc:ContactInformation/wmc:ContactPersonPrimary/wmc:ContactOrganization"/>
        </p>
      </div>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
    
    <xsl:template name="moreInfo">
      <xsl:choose>
        <xsl:when test="$lang='fr'">Lisez à propos de cette carte</xsl:when>
        <xsl:otherwise>Read more about this map</xsl:otherwise>
      </xsl:choose>
    </xsl:template>
   
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  <html>
    <head>
      <title>Mapbuilder Time Series Demo</title>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
      <style type="text/css">
        #workspace {
          height: 300px;
          overflow: auto;
          position: relative;
          /* border: 1px solid blue;*/
          background-color: rgb(240,240,240);
          display: none;
        }
        #abstract {
          margin: 0px;
        }
      </style>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='tsConfig.xml';
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> Time Series Demo</h1>
      <table>
        <tr>
          <td valign="top">
          
  <table><!-- table for left side of page - 2 columns -->
    <tr>
      <td id="tsButtonBar" align="left"/>
      <td id="timestamp" align="right"/>
    </tr>
    <tr>
      <td colspan="2" valign="top">
        <div id="mainMapPane"/>
        <noscript>this page requires Javascript to be enabled</noscript>
      </td>
    </tr>
    <tr>
      <td id="mainButtonBar" valign="top" align="left"/>
      <td id="cursorTrack" valign="top" align="right"/>
    </tr>
    <tr>
      <td id="timeRangeSelect" colspan="2" valign="top" align="left"/>
    </tr>
    <tr>
      <td id="legend" colspan="2" valign="top" align="left"/>
    </tr>
  </table>
      
          </td>
          <td valign="top">
          
  <table><!-- table for left side of page - single column -->
    <tr>
      <td align="left"><h2 id="mapTitle"></h2></td>
    </tr>
    <tr>
      <td align="left" valign="top" id="abstract"></td>
    </tr>
    <tr>
      <td id="mainButtonBar" valign="top" align="left">
        Other examples
        <div id="collectionList"/>
      </td>
    </tr>
    <tr>
      <td valign="top" align="left">
        <a href="javascript:document.getElementById('workspace').style.display='block';config.loadModel('wmsCapTemplate','http://aes.gsfc.nasa.gov/cgi-bin/wms?request=GetCapabilities');">NASA SVS Image Server</a> 
        - a large collection of earth observation data.  
        Images are in fixed size so map zoom/pan functions are not allowed.
      </td>
    </tr>
    <tr>
      <td valign="top" align="left">
        <p id="wmsCapsUrlInput"/>
      </td>
    </tr>
    <tr>
      <td valign="top" align="left">
        <p id="workspace">
        </p>
      </td>
    </tr>
  </table>
            
          </td>
        </tr>
      </table>
  
      <table class="footer">
        <tr>
          <td><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</td>
          <td width="60"><img src="../../lib/skin/default/images/Icon.gif"/></td>
        </tr>
      </table>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/timeSeriesCollection.xml
  
  Index: timeSeriesCollection.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContextCollection version="1.0.0" xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net http://schemas.opengis.net/context/1.0.0/collection.xsd">
    <!-- List of context XML URLs -->
    <!--ViewContextReference version="1.0.0" id="tsPrecipAnomaly">
      <Title>The BALANCE Climate Change Visualization Server</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsIFGITemp.xml"/>
      </ContextURL>
    </ViewContextReference-->
    <ViewContextReference version="1.0.0" id="tsPrecipAnomaly">
      <Title>Precipitation Anomalies (IRI Columbia U.)</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsPrecipAnomaly.xml"/>
      </ContextURL>
    </ViewContextReference>
    <ViewContextReference version="1.0.0" id="tsPrecipAnomaly">
      <Title>Estimated Precipitation Africa (IRI Columbia U.)</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsEstPrecip.xml"/>
      </ContextURL>
    </ViewContextReference>
    <ViewContextReference version="1.0.0" id="tsPrecipAnomaly">
      <Title>Estimated Precipitation Africa (10-day) (IRI Columbia U.)</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsEstPrecip10Day.xml"/>
      </ContextURL>
    </ViewContextReference>
    <ViewContextReference version="1.0.0" id="tsWorldTemp">
      <Title>World Temperature (NASA)</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsWorldTemp.xml"/>
      </ContextURL>
    </ViewContextReference>
    <ViewContextReference version="1.0.0" id="tsPrecipAnomaly">
      <Title>AVHRR Composite - Geocomp (CCRS) - slow to load</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsGeocomp.xml"/>
      </ContextURL>
    </ViewContextReference>
    <!--ViewContextReference version="1.0.0" id="tsOzoneMLS">
      <Title>Ozone from new Microwave Limb Sounder on Aura (72x89 - no zoom) (NASA)</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsOzoneMLS.xml"/>
      </ContextURL>
    </ViewContextReference>
    <ViewContextReference version="1.0.0" id="tsAfricaFires">
      <Title>African Fires during 2002 (1024x1024 Animation)</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsAfricaFires.xml"/>
      </ContextURL>
    </ViewContextReference>
    <ViewContextReference version="1.0.0" id="tsChinaDustStorm">
      <Title>China Dust Storm during April 2001 (1024x512 - no zoom) (NASA)</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsChinaDustStorm.xml"/>
      </ContextURL>
    </ViewContextReference>
    <ViewContextReference version="1.0.0" id="tsYellowstoneFires">
      <Title>Wildfire Growth around Yellowstone National Park in 1988 (1024x1024 - no zoom) (NASA)</Title>
      <ContextURL>
        <OnlineResource xlink:type="simple" xlink:href="tsYellowstoneFires.xml"/>
      </ContextURL>
    </ViewContextReference-->
    
  </ViewContextCollection>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsAfricaFires.xml
  
  Index: tsAfricaFires.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="1024" height="1024"/>
      <BoundingBox SRS="CRS:84" minx="-22" miny="-39" maxx="58" maxy="41"/>
            <Title>African Fires during 2002 (1024x1024 Animation)</Title>
            <Abstract>This animation shows fire activity in Africa from January 1, 2002 to December 31, 2002.  The fires are shown as tiny particles with each particle depicting the geographic region in which fire was detected.  The color of a particle represents the number of days since a sizable amount of fire was detected in that region, with red representing less than 20 days, orange representing 20 to 40 days, yellow representing 40 to 60 days, and gray to black representing more than 60 days.  This data was measured by the MODIS instrument on the Terra satellite.  MODIS detects fires by measuring the brightness temperature of a region in several frequency bands and looking for hot spots where this temperature is greater than the surrounding region.
            This version only shows every 10 days to reduce donwload times. 
            </Abstract>
            <KeywordList>
              <Keyword vocabulary="SVS">Africa</Keyword>
              <Keyword vocabulary="DLESE">Atmospheric science</Keyword>
              <Keyword vocabulary="SVS">Fires</Keyword>
              <Keyword vocabulary="DLESE">Forestry</Keyword>
              <Keyword vocabulary="DLESE">Natural hazards</Keyword>
              <Keyword vocabulary="GCMD">EARTH SCIENCE:Agriculture:Forest Science:Forest Fire Science</Keyword>
              <Keyword vocabulary="GCMD">EARTH SCIENCE:Biosphere:Ecological Dynamics:Fire Occurrence</Keyword>
              <Keyword vocabulary="GCMD">EARTH SCIENCE:Human Dimensions:Natural Hazards:Fires</Keyword>
            </KeywordList>
      <LogoURL width="273" height="22" format="image/png">
        <OnlineResource xlink:type="simple" xlink:href="http://svs.gsfc.nasa.gov/svs_icons/nasalogo.png"/>
      </LogoURL>
      <DescriptionURL format="text/html">
          <OnlineResource xlink:type="simple" xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002800/a002890/"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Tom Kralidis</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+01 613 947 1828</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+01 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>tom.kralidis at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
    <!-- need to find these layers on a serve rthat understands SRS="CRS:84"
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>land</Name>
        <Title>land area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      -->
          <Layer opaque="0" noSubsets="1" fixedWidth="1024" fixedHeight="1024">
        <Server service="wms" version="1.3.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://aes.gsfc.nasa.gov/cgi-bin/wms?"/>
        </Server>
            <Name>2890_296</Name>
        <DimensionList>
            <Dimension name="time" units="ISO8601" default="2002-12-31">2002-01-01/2002-12-31/P10D</Dimension>
            <!-- full year will crash your system!!
            <Dimension name="time" units="ISO8601" default="2002-12-31">2002-01-01/2002-12-31/P1D</Dimension>
            -->
        </DimensionList>
            <MetadataURL type="FGDC:1998">
              <Format>text/plain</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
               xlink:type="simple"
               xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002800/a002890/a002890.fgdc"/>
            </MetadataURL>
            <DataURL>
              <Format>text/html</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
               xlink:type="simple"
               xlink:href="http://modis-fire.gsfc.nasa.gov/index.asp"/>
            </DataURL>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
            <StyleList>
            <Style current="1">
              <Name>composite</Name>
              <Title>Overlay Composited with Background Image</Title>
              <Abstract>This animation shows fire activity in Africa during 2002.  This version provides the transparent overlay composited with a background image.</Abstract>
              <LegendURL width="161" height="110">
                <Format>image/tif</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002800/a002890/firebar.tif"/>
              </LegendURL>
              <LegendURL width="161" height="110">
                <Format>image/jpeg</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002800/a002890/firebar.jpg"/>
              </LegendURL>
            </Style>
            <Style>
              <Name>overlay</Name>
              <Title>Transparent Overlay Only</Title>
              <Abstract>This animation shows fire activity in Africa during 2002.  This version provides only the transparent overlay.</Abstract>
              <LegendURL width="161" height="110">
                <Format>image/tif</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002800/a002890/firebar.tif"/>
              </LegendURL>
              <LegendURL width="161" height="110">
                <Format>image/jpeg</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002800/a002890/firebar.jpg"/>
              </LegendURL>
            </Style>
            </StyleList>
          </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsChinaDustStorm.xml
  
  Index: tsChinaDustStorm.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="1024" height="512"/>
      <BoundingBox SRS="CRS:84" minx="11.3" miny="-84.4" maxx="-11.3" maxy="84.4"/>
            <Title>China Dust Storm during April 2001 (1024x512 Animation)</Title>
            <Abstract>A major dust storm occurred in April 2001 over parts of China and Mongolia. Dust from this storm was transported all the way to the coast of the United States.  Although dust from the Sahara Desert is routinely transported across the Atlantic to the east coast of the United States, Asian dust rarely makes the distance across the Pacific to the west coast.  These airborne microscopic dust and smoke particles, or aerosols, were measured by the TOMS instrument on the Earth Probe satellite.  For governments struggling to meet national air quality standards, knowing more about the sources and movement of pollution across national borders has become an important issue.</Abstract>
            <KeywordList>
              <Keyword vocabulary="SVS">Aerosols</Keyword>
              <Keyword vocabulary="DLESE">Atmospheric science</Keyword>
              <Keyword vocabulary="SVS">Dust</Keyword>
              <Keyword vocabulary="SVS">Pollution</Keyword>
              <Keyword vocabulary="GCMD">EARTH SCIENCE:Atmosphere:Aerosols:Dust/Ash</Keyword>
            </KeywordList>
      <LogoURL width="273" height="22" format="image/png">
        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
             xlink:type="simple"
             xlink:href="http://svs.gsfc.nasa.gov/svs_icons/nasalogo.png"/>
      </LogoURL>
      <DescriptionURL format="text/html">
          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
           xlink:type="simple"
           xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002956/"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Tom Kralidis</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+01 613 947 1828</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+01 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>tom.kralidis at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
          <Layer opaque="0" noSubsets="1" fixedWidth="1024" fixedHeight="512">
        <Server service="wms" version="1.3.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://aes.gsfc.nasa.gov/cgi-bin/wms?"/>
        </Server>
            <Name>2956_530</Name>
            <Title>China Dust Storm during April 2001 (1024x512 Animation)</Title>
            <Abstract>A major dust storm occurred in April 2001 over parts of China and Mongolia. Dust from this storm was transported all the way to the coast of the United States.  Although dust from the Sahara Desert is routinely transported across the Atlantic to the east coast of the United States, Asian dust rarely makes the distance across the Pacific to the west coast.  These airborne microscopic dust and smoke particles, or aerosols, were measured by the TOMS instrument on the Earth Probe satellite.  For governments struggling to meet national air quality standards, knowing more about the sources and movement of pollution across national borders has become an important issue.</Abstract>
            <KeywordList>
              <Keyword vocabulary="SVS">Aerosols</Keyword>
              <Keyword vocabulary="DLESE">Atmospheric science</Keyword>
              <Keyword vocabulary="SVS">Dust</Keyword>
              <Keyword vocabulary="SVS">Pollution</Keyword>
              <Keyword vocabulary="GCMD">EARTH SCIENCE:Atmosphere:Aerosols:Dust/Ash</Keyword>
            </KeywordList>
        <DimensionList>
            <Dimension name="time" units="ISO8601" default="2001-04-17">2001-04-07/2001-04-17/P1D</Dimension>
        </DimensionList>
            <MetadataURL type="FGDC:1998">
              <Format>text/plain</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
               xlink:type="simple"
               xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002956/a002956.fgdc"/>
            </MetadataURL>
            <DataURL>
              <Format>text/html</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
               xlink:type="simple"
               xlink:href="http://toms.gsfc.nasa.gov/aerosols/aerosols.html"/>
            </DataURL>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
            <StyleList>
            <Style current="1">
              <Name>composite</Name>
              <Title>Overlay Composited with Background Image</Title>
              <Abstract>This animation shows the concentration of dust in the atmosphere during April 2001 when a massive dust storm crossed the Pacific from China and Mongolia to the United States.  This version provides the transparent overlay composited with a background image.</Abstract>
              <LegendURL width="320" height="180">
                <Format>image/tif</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002956/chinadust-colorbar.tif"/>
              </LegendURL>
              <LegendURL width="320" height="180">
                <Format>image/jpeg</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002956/chinadust-colorbar.jpg"/>
              </LegendURL>
            </Style>
            <Style>
              <Name>overlay</Name>
              <Title>Transparent Overlay Only</Title>
              <Abstract>This animation shows the concentration of dust in the atmosphere during April 2001 when a massive dust storm crossed the Pacific from China and Mongolia to the United States.  This version provides only the transparent overlay.</Abstract>
              <LegendURL width="320" height="180">
                <Format>image/tif</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002956/chinadust-colorbar.tif"/>
              </LegendURL>
              <LegendURL width="320" height="180">
                <Format>image/jpeg</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002956/chinadust-colorbar.jpg"/>
              </LegendURL>
            </Style>
            </StyleList>
          </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsConfig.xml
  
  Index: tsConfig.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by Tom Kralidis (NRCAN CCRs) -->
  <MapbuilderConfig version="1.0.0" id="simpleTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>tsEstPrecip.xml</defaultModelUrl>
  			<widgets>
  				<AoiBoxDHTML id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<TimeSeries id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/MapPane.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</TimeSeries>
  				<Timestamp id="timestamp">
          </Timestamp>
  				<Legend id="legend">
          </Legend>
  				<Widget id="abstract">
  					<stylesheet>Abstract.xsl</stylesheet>
  				</Widget>
  				<Widget id="mapTitle">
  					<stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
  				</Widget>
  				<!--SelectTimeFrame id="timeRangeSelect">
          </SelectTimeFrame-->
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  				</CursorTrack>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<MovieLoop id="movieLoop">
  					<framesPerSecond>4</framesPerSecond>
  					<maxFrames>15</maxFrames>
  				</MovieLoop>
  			</tools>
  		</Context>
  		<ContextCollection id="collection">
  			<defaultModelUrl>timeSeriesCollection.xml</defaultModelUrl>
  			<widgets>
  				<CollectionList id="collectionList">
  					<targetModel>mainMap</targetModel>
  				</CollectionList>
  			</widgets>
  		</ContextCollection>
  		<WmsCapabilities id="wmsCapTemplate">
  			<!--defaultModelUrl>../data/test/tsNasaCaps.xml</defaultModelUrl-->
  			<title>OGC Web Map Server (WMS)</title>
  			<widgets>
  				<Widget id="layerList">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<stylesheet>../../lib/widget/SelectMapLayers.xsl</stylesheet>
  				</Widget>
  				<Loading2 id="loading2">
  					<htmlTagId>workspace</htmlTagId>
  					<outputNodeId>workspaceCanvas</outputNodeId>
  					<textMessage>This is a large file, please wait for it to load...</textMessage>
  				</Loading2>
  			</widgets>
  			<tools>
  				<Caps2Context id="convertCaps">
  					<targetModel>mainMap</targetModel>
  				</Caps2Context>
  			</tools>
  			<nodeSelectXpath>//Layer</nodeSelectXpath>
  		</WmsCapabilities>
  	</models>
  	<widgets>
  		<ModelUrlInput id="wmsCapsUrlInput">
  			<targetModel>wmsCapTemplate</targetModel>
  			<title>Or load another WMS Capabilities URL: </title>
  		</ModelUrlInput>
  		<Button id="play">
  			<buttonBar>tsButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PlayEnable.png</enabledSrc>
  			<disabledSrc>/images/PlayDisable.png</disabledSrc>
  			<tooltip>play the movie</tooltip>
  			<action>movieLoop.play()</action>
  		</Button>
  		<Button id="stepBack">
  			<buttonBar>tsButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/StepBackwardDisable.png</disabledSrc>
  			<tooltip>step back one frame</tooltip>
  			<action>movieLoop.nextFrame(-1)</action>
  		</Button>
  		<Button id="pause">
  			<buttonBar>tsButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PauseEnable.png</enabledSrc>
  			<disabledSrc>/images/PauseDisable.png</disabledSrc>
  			<tooltip>pause the movie</tooltip>
  			<action>movieLoop.pause()</action>
  		</Button>
  		<Button id="stop">
  			<buttonBar>tsButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>RadioButton</class>
  			<enabledSrc>/images/StopEnable.png</enabledSrc>
  			<disabledSrc>/images/StopDisable.png</disabledSrc>
  			<tooltip>stop and rewind to beginning</tooltip>
  			<action>movieLoop.stop()</action>
  		</Button>
  		<Button id="stepAhead">
  			<buttonBar>tsButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/StepForwardDisable.png</disabledSrc>
  			<tooltip>step ahead one frame</tooltip>
  			<action>movieLoop.nextFrame(1)</action>
  		</Button>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>/widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsEstPrecip.xml
  
  Index: tsEstPrecip.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="320" height="300"/>
      <BoundingBox SRS="EPSG:4326" minx="-20." miny="-40." maxx="55." maxy="40." resx="0.1" resy="0.1" />
      <Title>Estimated Precipitation (Africa)</Title>
      <Abstract>Map Server maintained by International Research Institute for Climate Prediction, Columbia University, USA</Abstract>
      <KeywordList>
        <Keyword>precipitation</Keyword>
      </KeywordList>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://iridl.ldeo.columbia.edu/" />
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson></ContactPerson>
          <ContactOrganization>IRI, Columbia U.</ContactOrganization>
        </ContactPersonPrimary>
        <ContactElectronicMailAddress>help at iri.columbia.edu</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.3.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://iridl.ldeo.columbia.edu/SOURCES/.NOAA/.NCEP/.CPC/.FEWS/.Africa/.DAILY/.RFEv2/wmsmap?"/>
        </Server>
        <Name>est_prcp</Name>
        <Title>Estimated Precipitation</Title>
        <Abstract>Estimated Precipitation. original title was: NOAA NCEP CPC FEWS Africa DAILY RFEv2</Abstract>
        <DimensionList>
          <!--Dimension name="time" units="ISO8601" nearestValue="1">2000-10-31/2005-03-29/P1D</Dimension-->
          <Dimension name="time" units="ISO8601" nearestValue="1">2005-02-01/2005-03-29/P1D</Dimension>
        </DimensionList>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsEstPrecip10Day.xml
  
  Index: tsEstPrecip10Day.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org01/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="320" height="300"/>
      <BoundingBox SRS="EPSG:4326" minx="-20." miny="-40." maxx="55." maxy="40." resx="0.1" resy="0.1" />
      <Title>Estimated Precipitation 10 Day (Africa)</Title>
      <Abstract>Map Server maintained by International Research Institute for Climate Prediction, Columbia University, USA</Abstract>
      <KeywordList>
        <Keyword>precipitation</Keyword>
      </KeywordList>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://iridl.ldeo.columbia.edu/" />
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson></ContactPerson>
          <ContactOrganization>IRI, Columbia U.</ContactOrganization>
        </ContactPersonPrimary>
        <ContactElectronicMailAddress>help at iri.columbia.edu</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.3.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://iridl.ldeo.columbia.edu/SOURCES/.NOAA/.NCEP/.CPC/.FEWS/.Africa/.TEN-DAY/.RFEv2/wmsmap?"/>
        </Server>
        <Name>est_prcp</Name>
        <Title>Estimated Precipitation</Title>
        <Abstract>Estimated Precipitation. original title was: NOAA NCEP CPC FEWS Africa TEN-DAY RFEv2</Abstract>
        <DimensionList>
          <!--Dimension name="time" units="ISO8601" nearestValue="1">1999-12-1/10,1999-12-11/20,1999-12-21/31,2000-01-1/10,2000-01-11/20,2000-01-21/31,2000-02-1/10,2000-02-11/20,2000-02-21/29,2000-03-1/10,2000-03-11/20,2000-03-21/31,2000-04-1/10,2000-04-11/20,2000-04-21/30,2000-05-1/10,2000-05-11/20,2000-05-21/31,2000-06-1/10,2000-06-11/20,2000-06-21/30,2000-07-1/10,2000-07-11/20,2000-07-21/31,2000-08-1/10,2000-08-11/20,2000-08-21/31,2000-09-1/10,2000-09-11/20,2000-09-21/30,2000-10-1/10,2000-10-11/20,2000-10-21/31,2000-11-1/10,2000-11-11/20,2000-11-21/30,2000-12-1/10,2000-12-11/20,2000-12-21/31,2001-01-1/10,2001-01-11/20,2001-01-21/31,2001-02-1/10,2001-02-11/20,2001-02-21/28,2001-03-1/10,2001-03-11/20,2001-03-21/31,2001-04-1/10,2001-04-11/20,2001-04-21/30,2001-05-1/10,2001-05-11/20,2001-05-21/31,2001-06-1/10,2001-06-11/20,2001-06-21/30,2001-07-1/10,2001-07-11/20,2001-07-21/31,2001-08-1/10,2001-08-11/20,2001-08-21/31,2001-09-1/10,2001-09-11/20,2001-09-21/30,2001-10-1/10,2001-1
 0-11/20,2001-10-21/31,2001-11-1/10,2001-11-11/20,2001-11-21/30,2001-12-1/10,2001-12-11/20,2001-12-21/31,2002-01-1/10,2002-01-11/20,2002-01-21/31,2002-02-1/10,2002-02-11/20,2002-02-21/28,2002-03-1/10,2002-03-11/20,2002-03-21/31,2002-04-1/10,2002-04-11/20,2002-04-21/30,2002-05-1/10,2002-05-11/20,2002-05-21/31,2002-06-1/10,2002-06-11/20,2002-06-21/30,2002-07-1/10,2002-07-11/20,2002-07-21/31,2002-08-1/10,2002-08-11/20,2002-08-21/31,2002-09-1/10,2002-09-11/20,2002-09-21/30,2002-10-1/10,2002-10-11/20,2002-10-21/31,2002-11-1/10,2002-11-11/20,2002-11-21/30,2002-12-1/10,2002-12-11/20,2002-12-21/31,2003-01-1/10,2003-01-11/20,2003-01-21/31,2003-02-1/10,2003-02-11/20,2003-02-21/28,2003-03-1/10,2003-03-11/20,2003-03-21/31,2003-04-1/10,2003-04-11/20,2003-04-21/30,2003-05-1/10,2003-05-11/20,2003-05-21/31,2003-06-1/10,2003-06-11/20,2003-06-21/30,2003-07-1/10,2003-07-11/20,2003-07-21/31,2003-08-1/10,2003-08-11/20,2003-08-21/31,2003-09-1/10,2003-09-11/20,2003-09-21/30,2003-10-1/10,2003-10-11/
 20,2003-10-21/31,2003-11-1/10,2003-11-11/20,2003-11-21/30,2003-12-1/10,2003-12-11/20,2003-12-21/31,2004-01-1/10,2004-01-11/20,2004-01-21/31,2004-02-1/10,2004-02-11/20,2004-02-21/29,2004-03-1/10,2004-03-11/20,2004-03-21/31,2004-04-1/10,2004-04-11/20,2004-04-21/30,2004-05-1/10,2004-05-11/20,2004-05-21/31,2004-06-1/10,2004-06-11/20,2004-06-21/30,2004-07-1/10,2004-07-11/20,2004-07-21/31,2004-08-1/10,2004-08-11/20,2004-08-21/31,2004-09-1/10,2004-09-11/20,2004-09-21/30,2004-10-1/10,2004-10-11/20,2004-10-21/31,2004-11-1/10,2004-11-11/20,2004-11-21/30,2004-12-1/10,2004-12-11/20,2004-12-21/31,2005-01-1/10,2005-01-11/20,2005-01-21/31,2005-02-1/10,2005-02-11/20,2005-02-21/28,2005-03-1/10,2005-03-11/20</Dimension-->
          <Dimension name="time" units="ISO8601" nearestValue="1">2004-01-1,2004-01-11,2004-01-21,2004-02-1,2004-02-11,2004-02-21,2004-03-1,2004-03-11,2004-03-21,2004-04-1,2004-04-11,2004-04-21,2004-05-1,2004-05-11,2004-05-21,2004-06-1,2004-06-11,2004-06-21,2004-07-1,2004-07-11,2004-07-21,2004-08-1,2004-08-11,2004-08-21,2004-09-1,2004-09-11,2004-09-21,2004-10-1,2004-10-11,2004-10-21,2004-11-1,2004-11-11,2004-11-21,2004-12-1,2004-12-11,2004-12-21,2005-01-1,2005-01-11,2005-01-21,2005-02-1,2005-02-11,2005-02-21/28,2005-03-1,2005-03-11</Dimension>
        </DimensionList>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsGeocomp.xml
  
  Index: tsGeocomp.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="tsGeocomp" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
  <!--
  http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/test_cubeserv/cubeserv.cgi?SERVICE=WMS&VERSION=1.1.3&REQUEST=GetMap&
  SRS=EPSG%3A4269&BBOX=-145.0,40.0,-50.0,80.0&WIDTH=560&HEIGHT=350&
  LAYERS=abc3_19930411%3ACEOWARE2&STYLES=&FORMAT=image%2Fpng&BGCOLOR=0xFFFFFF&TRANSPARENT=F&TIME=1993-05-01
  
  1993-04-11,           1993-05-01,1993-05-11,1993-05-21,1993-06-01,1993-06-11,1993-06-21,1993-07-01,1993-07-11,1993-07-21,1993-08-01,1993-08-11,1993-08-21,1993-09-01,1993-09-11,1993-09-21,1993-10-01,1993-10-11,1993-10-21,
  1994-04-11,1994-04-21,1994-05-01,1994-05-11,1994-05-21,1994-06-01,1994-06-11,1994-06-21,1994-07-01,1994-07-11,1994-07-21,1994-08-01,1994-08-11,1994-08-21,1994-09-01,1994-09-11,1994-09-21,1994-10-01,1994-10-11,1994-10-21,
  1995-04-11,1995-04-21,1995-05-01,1995-05-11,1995-05-21,1995-06-01,1995-06-11,1995-06-21,1995-07-01,1995-07-11,1995-07-21,1995-08-01,1995-08-11,1995-08-21,1995-09-01,1995-09-11,1995-09-21,1995-10-01,1995-10-11,1995-10-21,
  1996-04-11,1996-04-21,1996-05-01,1996-05-11,1996-05-21,1996-06-01,1996-06-11,1996-06-21,1996-07-01,1996-07-11,1996-07-21,1996-08-01,1996-08-11,1996-08-21,1996-09-01,1996-09-11,1996-09-21,1996-10-01,1996-10-11,1996-10-21,
  1997-04-11,1997-04-21,1997-05-01,1997-05-11,1997-05-21,1997-06-01,1997-06-11,1997-06-21,1997-07-01,1997-07-11,1997-07-21,1997-08-01,1997-08-11,1997-08-21,1997-09-01,1997-09-11,1997-09-21,1997-10-01,1997-10-11,1997-10-21,
  1998-04-11,1998-04-21,1998-05-01,1998-05-11,1998-05-21,1998-06-01,1998-06-11,1998-06-21,1998-07-01,1998-07-11,1998-07-21,1998-08-01,1998-08-11,1998-08-21,1998-09-01,1998-09-11,1998-09-21,1998-10-01,1998-10-11,1998-10-21
  -->  
      <Window width="400" height="337"/>
      <BoundingBox SRS="EPSG:42304" minx="442694.0261391697" miny="-148274.61719307187" maxx="2814302.8832287025" maxy="1849805.8449048596"/>
  <!--   
      <Window width="400" height="200"/>
      <BoundingBox SRS="EPSG:4326" minx="-142" miny="40" maxx="-52" maxy="85"/>
  -->
      <Title>Canada-wide 1-km AVHRR Composite Maps based on GEOCOMP Data enhanced with ABC3v2 Software</Title>
      <Abstract>The ABC3 Canada-wide 1-km resolution AVHRR composite maps (Version 2) were produced as part of the CCRS Northern Biosphere Observation and Modelling Experiment (NBIOME). NBIOME co-ordinated the participation of a Canadian research team in the international Earth Observing System (EOS) to develop methods for post-processing of AVHRR seasonal composite maps to produce derived products with national coverage. The ABC3v2 output product layers are used at CCRS in land cover and climate change studies; and are used to generate various non-remote sensing products such as Leaf Area Index (LAI) and Net Primary Productivity (NPP). These data layers can be used directly by resource managers to study large scale changes in land cover types and land use practices. Natural disturbances such as forest fires can alter the land cover. Anthropogenic changes caused by clear cutting of forests or industrial and residential development are significant in the long-term. The composi
 te products can be used to evaluate seasonal behaviours of land cover types. These data layers and derived products can be used in radiation budget and climate studies.</Abstract>
      <KeywordList>
        <Keyword>Earth Science > Land Surface > Land Temperature > Land Surface Temperature</Keyword>
        <Keyword>Earth Science > Land Surface > Land Use/Land Cover > Land Cover</Keyword>
        <Keyword>Earth Science > Land Surface > Surface Radiative Properties > Reflectance</Keyword>
        <Keyword>Bidirectional Reflectance</Keyword>
        <Keyword>CLIMATE CHANGE</Keyword>
        <Keyword>ENVIRONMENTAL CHANGE</Keyword>
        <Keyword>Radiant Temperature</Keyword>
      </KeywordList>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=8544&amp;entryType=productCollection&amp;keymap=outlineCanada" />
      </DescriptionURL>
      <ContactInformation>
          <ContactElectronicMailAddress>info at GeoGratis.cgdi.gc.ca</ContactElectronicMailAddress>
          <ContactPersonPrimary>
              <ContactPerson>Steve Smith</ContactPerson>
              <ContactOrganization>GeoGratis, NRCan</ContactOrganization>
          </ContactPersonPrimary>
          <ContactAddress>
              <AddressType>postal</AddressType>
              <Address>650-615 Booth St.</Address>
              <City>Ottawa</City>
              <StateOrProvince>Ont</StateOrProvince>
              <PostCode>K1A 0E9</PostCode>
              <Country>Canada</Country>
          </ContactAddress>
          <ContactVoiceTelephone/>
          <ContactElectronicMailAddress>info at GeoGratis.cgdi.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.3" title="Ceoware">
          <!--OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/test_cubeserv/cubeserv.cgi?"/-->
          <OnlineResource xlink:type="simple" xlink:href="http://test-dw.ccrs.nrcan.gc.ca:9090/cubewerx/cubeserv/cubeserv.cgi?"/>
        </Server>
        <Name>abc3_19930411:CEOWARE2</Name>
        <Title>AVHRR Composite</Title>
        <Abstract>The ABC3 Canada-wide 1-km resolution AVHRR composite maps (Version 2) were produced as part of the CCRS Northern Biosphere Observation and Modelling Experiment (NBIOME). NBIOME co-ordinated the participation of a Canadian research team in the international Earth Observing System (EOS) to develop methods for post-processing of AVHRR seasonal composite maps to produce derived products with national coverage. The ABC3v2 output product layers are used at CCRS in land cover and climate change studies; and are used to generate various non-remote sensing products such as Leaf Area Index (LAI) and Net Primary Productivity (NPP). These data layers can be used directly by resource managers to study large scale changes in land cover types and land use practices. Natural disturbances such as forest fires can alter the land cover. Anthropogenic changes caused by clear cutting of forests or industrial and residential development are significant in the long-term. The compo
 site products can be used to evaluate seasonal behaviours of land cover types. These data layers and derived products can be used in radiation budget and climate studies.</Abstract>
        <DimensionList>
          <!--Dimension name="time" units="ISO8601" nearestValue="1">
  1993-04-11,           1993-05-01,1993-05-11,1993-05-21,1993-06-01,1993-06-11,1993-06-21,1993-07-01,1993-07-11,1993-07-21,1993-08-01,1993-08-11,1993-08-21,1993-09-01,1993-09-11,1993-09-21,1993-10-01,1993-10-11,1993-10-21,
  1994-04-11,1994-04-21,1994-05-01,1994-05-11,1994-05-21,1994-06-01,1994-06-11,1994-06-21,1994-07-01,1994-07-11,1994-07-21,1994-08-01,1994-08-11,1994-08-21,1994-09-01,1994-09-11,1994-09-21,1994-10-01,1994-10-11,1994-10-21,
  1995-04-11,1995-04-21,1995-05-01,1995-05-11,1995-05-21,1995-06-01,1995-06-11,1995-06-21,1995-07-01,1995-07-11,1995-07-21,1995-08-01,1995-08-11,1995-08-21,1995-09-01,1995-09-11,1995-09-21,1995-10-01,1995-10-11,1995-10-21,
  1996-04-11,1996-04-21,1996-05-01,1996-05-11,1996-05-21,1996-06-01,1996-06-11,1996-06-21,1996-07-01,1996-07-11,1996-07-21,1996-08-01,1996-08-11,1996-08-21,1996-09-01,1996-09-11,1996-09-21,1996-10-01,1996-10-11,1996-10-21,
  1997-04-11,1997-04-21,1997-05-01,1997-05-11,1997-05-21,1997-06-01,1997-06-11,1997-06-21,1997-07-01,1997-07-11,1997-07-21,1997-08-01,1997-08-11,1997-08-21,1997-09-01,1997-09-11,1997-09-21,1997-10-01,1997-10-11,1997-10-21,
  1998-04-11,1998-04-21,1998-05-01,1998-05-11,1998-05-21,1998-06-01,1998-06-11,1998-06-21,1998-07-01,1998-07-11,1998-07-21,1998-08-01,1998-08-11,1998-08-21,1998-09-01,1998-09-11,1998-09-21,1998-10-01,1998-10-11,1998-10-21
          </Dimension-->
          <Dimension name="time" units="ISO8601" nearestValue="1">1998-04-11,1998-04-21,1998-05-01,1998-05-11,1998-05-21,1998-06-01,1998-06-11,1998-06-21,1998-07-01,1998-07-11,1998-07-21,1998-08-01,1998-08-11,1998-08-21,1998-09-01,1998-09-11,1998-09-21,1998-10-01,1998-10-11,1998-10-21</Dimension>
        </DimensionList>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <!--Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer-->
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsIFGITemp.xml
  
  Index: tsIFGITemp.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org01/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="440" height="240"/>
      <BoundingBox SRS="EPSG:4326" miny="55" maxy="85" maxx="60" minx="5"/>
      <Title>Monthly Mean Temperature</Title>
      <Abstract>Web Map Server maintained for BALANCE Project by Institute for Geoinformatics, University of Muenster.  Contact: tegtmeyer at uni-muenster.de.</Abstract>
          <KeywordList>
              <Keyword>Barents Sea</Keyword>
              <Keyword>arctic</Keyword>
              <Keyword>climate</Keyword>
              <Keyword>BALANCE</Keyword>
          </KeywordList>
      <DescriptionURL format="text/html">
          <OnlineResource xlink:href="http://www.balance-eu.info" xlink:type="simple"/>
      </DescriptionURL>
          <ContactInformation>
              <ContactPersonPrimary>
                  <ContactPerson>Sascha Tegtmeyer</ContactPerson>
                  <ContactOrganization>IFGI</ContactOrganization>
              </ContactPersonPrimary>
              <ContactPosition>Student</ContactPosition>
              <ContactAddress>
                  <AddressType>postal</AddressType>
                  <Address>Robert-Koch-Str. 26-28 </Address>
                  <City>Muenster</City>
                  <StateOrProvince>NRW</StateOrProvince>
                  <PostCode>48145</PostCode>
                  <Country>Germany</Country>
              </ContactAddress>
              <ContactVoiceTelephone/>
              <ContactElectronicMailAddress>tegtmeyer at uni-muenster.de</ContactElectronicMailAddress>
          </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="BALANCE Visualization Server">
          <OnlineResource xlink:type="simple" xlink:href="http://triangulum.uni-muenster.de:8080/cdd/wms"/>
        </Server>
                      <Name>TEMPERATURE</Name>
                      <Title>Monthly Mean Temperature</Title>
                      <Abstract>Monthly Mean Temperature from REMO</Abstract>
        <DimensionList>
                      <!--Extent nearestValue="0" default="2005-04" name="time">1962-01/2098-12/P1M</Extent-->
          <Dimension name="time" units="ISO8601" nearestValue="1">1962-01/2005-12/P1M</Dimension>
        </DimensionList>
        <MetadataURL format="text/xml">
          <OnlineResource xlink:type="simple" xlink:href="http://geo-hermes.uni-muenster.de:8080/balance/servlet/de.ifgi.wmsclient.balance.util.LegendServlet?HEIGHT=25&amp;WIDTH=95&amp;MIN=%3C%3D+-30&amp;MAX=%3E+30&amp;FONTSIZE=12&amp;FONTWEIGHT=BOLD&amp;COLORS=%23000033,%234169E1,%230FDDAF,%23FFFF00,%23FFA500,%23FF0000,%23CD0000,%23660000"/>
        </MetadataURL>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
        <StyleList>
                      <Style>
                          <Name>default</Name>
                          <Title>default</Title>
                          <LegendURL width="75" height="20">
                              <Format>image/png</Format>
                              <OnlineResource ns5:href="http://geo-hermes.uni-muenster.de:8080/balance/servlet/de.ifgi.wmsclient.balance.util.LegendServlet?HEIGHT=25&amp;WIDTH=95&amp;MIN=%3C%3D+-30&amp;MAX=%3E+30&amp;FONTSIZE=12&amp;FONTWEIGHT=BOLD&amp;COLORS=%23000033,%234169E1,%230FDDAF,%23FFFF00,%23FFA500,%23FF0000,%23CD0000,%23660000" ns5:type="simple" xmlns:ns5="http://www.w3.org/1999/xlink"/>
                          </LegendURL>
                      </Style>
        </StyleList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsOzoneMLS.xml
  
  Index: tsOzoneMLS.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.1.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.1.0/context.xsd">
    <General>
      <Window width="72" height="89"/>
      <BoundingBox SRS="CRS:84" minx="-180" miny="-89" maxx="180" maxy="89"/>
      <Title>Ozone from new Microwave Limb Sounder</Title>
      <KeywordList>
        <Keyword>time series</Keyword>
      </KeywordList>
      <Abstract>Ozone (O3) in the lower stratosphere and upper troposphere as 
      measured by the Microwave Limb Sounder (MLS) instrument on NASA's Aura satellite. 
      MLS can simultaneously measure several trace gases and ozone-destroying chemicals 
      in the upper troposphere and photosphere. In this series of animiations we 
      present chlorine monoxide (ClO), hydrogen chloride (HCl), nitric acid (HNO3), 
      ozone (O3), water vapor (H2O) and temperature measurements. 
      These are 'first light' data taken when the MLS was operated for the first time.
      
      This animation shows global ozone in the atmosphere from August 13 through 
      October 15, 2004. Red represents high ozone concentrations; blue represents 
      low concentrations. The spatial resolution is low: each pixel covers an 
      area of 5 degrees longitude by 2 degrees latitude, so the entire world 
      (except for 1 degree at each pole) is covered by the 72x89 pixel images.
      </Abstract>
      <LogoURL width="273" height="22" format="image/png">
        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
             xlink:type="simple"
             xlink:href="http://svs.gsfc.nasa.gov/svs_icons/nasalogo.png"/>
      </LogoURL>
      <DescriptionURL format="text/html">
          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
           xlink:type="simple"
           xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a003000/a003082/"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Mike Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+01 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+01 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer opaque="1" noSubsets="1" fixedWidth="72" fixedHeight="89">
        <Server service="wms" version="1.3.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://aes.gsfc.nasa.gov/cgi-bin/wms?"/>
        </Server>
        <Name>3082_47</Name>
        <Title>Ozone from new Microwave Limb Sounder on Aura (72x89 Animation)</Title>
        <Abstract>Ozone (O3) in the lower stratosphere and upper troposphere as measured by the Microwave Limb Sounder (MLS) instrument on NASA's Aura satellite. MLS can simultaneously measure several trace gases and ozone-destroying chemicals in the upper troposphere and photosphere. In this series of animiations we present chlorine monoxide (ClO), hydrogen chloride (HCl), nitric acid (HNO3), ozone (O3), water vapor (H2O) and temperature measurements. These are 'first light' data taken when the MLS was operated for the first time.</Abstract>
        <KeywordList>
          <Keyword vocabulary="DLESE">Atmospheric science</Keyword>
          <Keyword vocabulary="GCMD">EARTH SCIENCE:Atmosphere:Air Quality:Tropospheric Ozone</Keyword>
          <Keyword vocabulary="GCMD">EARTH SCIENCE:Atmosphere:Atmospheric Chemistry/Oxygen Compounds:Ozone</Keyword>
        </KeywordList>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
        <DimensionList>
          <Dimension name="time" units="ISO8601" default="2004-10-15">2004-08-13/2004-08-17/P1D,2004-08-20/2004-08-23/P1D,2004-08-25/2004-08-31/P1D,2004-09-02/2004-09-06/P1D,2004-09-10/2004-09-16/P2D,2004-09-17/2004-09-22/P1D,2004-09-24/2004-09-29/P1D,2004-10-01,2004-10-03/2004-10-07/P1D,2004-10-09/2004-10-12/P1D,2004-10-14,2004-10-15</Dimension>
          <!-- test cases 
          <Dimension name="time" units="ISO8601" default="2004-10-15">
          2004/2008/P1Y,
          2004-04/2004-10/P1M,
          2004-02-25/2004-02-28/P1D,
          2004-09-02T23:00/2004-09-02T23:50/PT10M,
          2004-09-10T23:30:25/2004-09-16T23:30:40.555/P2DT4H,
          2004-09-17T22:30:40.555Z/2004-09-22T23Z/P1DT5s,
          2004-09-01/2004-12-29/P1M10D,
          2004-10-01,
          2004-10-09/2004-10-23/P7DT12.5S,
          2004-10-14,2004-10-15
          </Dimension>
          <Dimension name="time" units="ISO8601" default="2004-10-15">
          2004-09-17T22:30:40.555Z/2004-09-22T23Z/P1DT5S
          </Dimension-->
        </DimensionList>
        <MetadataURL type="FGDC:1998">
          <Format>text/plain</Format>
          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
           xlink:type="simple"
           xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a003000/a003082/a003082.fgdc"/>
        </MetadataURL>
        <DataURL>
          <Format>text/html</Format>
          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
           xlink:type="simple"
           xlink:href="http://www.nasa.gov/vision/earth/lookingatearth/aura_first.html"/>
        </DataURL>
        <Style>
          <Name>opaque</Name>
          <Title>Opaque</Title>
          <Abstract>This animation shows global ozone in the atmosphere from August 13 through October 15, 2004. Red represents high ozone concentrations; blue represents low concentrations. The spatial resolution is low: each pixel covers an area of 5 degrees longitude by 2 degrees latitude, so the entire world (except for 1 degree at each pole) is covered by the 72x89 pixel images.</Abstract>
        </Style>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsPrecipAnomaly.xml
  
  Index: tsPrecipAnomaly.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="500" height="245"/>
      <BoundingBox SRS="EPSG:4326" minx="-181.25" miny="-88.75" maxx="181.25" maxy="88.75" resx="2.5" resy="2.5" />
      <Title>Precipitation Anomaly Time Series</Title>
      <Abstract>Precipitation anomalies by International Research Institute for Climate Prediction, Columbia University, USA</Abstract>
      <KeywordList>
        <Keyword>precipitation</Keyword>
      </KeywordList>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://iridl.ldeo.columbia.edu/" />
      </DescriptionURL>
      <ContactInformation>
        <ContactElectronicMailAddress>help at iri.columbia.edu</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.3.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://iridl.ldeo.columbia.edu/home/.mbell/.IRI/.MD/.CID/wmsmap?"/>
        </Server>
        <Name>prcp_anomaly</Name>
        <Title>prcp_anomaly</Title>
        <Abstract>Precipitation Anomaly</Abstract>
        <DimensionList>
        <!--Dimension name="time" units="ISO8601" nearestValue="1">1979-01/2005-01/P1M</Dimension-->
        <Dimension name="time" units="ISO8601" nearestValue="1">2004-09/2005-01/P1M</Dimension>
        </DimensionList>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsWorldTemp.xml
  
  Index: tsWorldTemp.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="400" height="200"/>
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <Title>Maximum Temperature from world weather stations</Title>
      <Abstract>Maximum Temperature from world weather stations.</Abstract>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://globe.digitalearth.gov/" />
      </DescriptionURL>
      <KeywordList>
        <Keyword>Temperature</Keyword>
      </KeywordList>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson></ContactPerson>
          <ContactOrganization>NASA</ContactOrganization>
        </ContactPersonPrimary>
        <ContactElectronicMailAddress></ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
  		<Layer queryable="1" hidden="0">
  			<Server service="OGC:WMS" version="1.0.0" title="OGC:WMS">
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=BlueMarble"/>
  			</Server>
  			<Name>Countries,Earth+Image,Coastlines,Waterbodies</Name>
  			<Title>Demis Blue Marble</Title>
  			<SRS>EPSG:4326</SRS>
  			<FormatList>
  				<Format current="1">image/gif</Format>
  			</FormatList>
  			<StyleList>
  				<Style current="1">
  					<Name>default</Name>
  					<Title>default</Title>
  				</Style>
  			</StyleList>
  		</Layer>
      <Layer level="2" hidden="0">
        <Server service="wms" title="The GLOBE Program Visualization Server" wmtver="1.1.1">
          <OnlineResource xlink:type="simple" xlink:href="http://globe.digitalearth.gov/viz-bin/wmt.cgi"/>
        </Server>
        <Name>NTMAX</Name>
        <Title>Maximum Temperature</Title>
        <Abstract>Maximum Temperature from world weather stations. Units: deg C.</Abstract>
        <DimensionList>
        <!-- too many dates!! Dimension units="ISO8601" name="time" current="2005-02-01" default="2004-04-07">1998-06-01/2004-04-07/P1D</Dimension-->
        <Dimension units="ISO8601" name="time" current="2005-02-01" default="2004-04-07">2004-03-01/2004-04-07/P1D</Dimension>
        </DimensionList>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
      </Layer>    
      <!--Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer-->
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/timeSeries/tsYellowstoneFires.xml
  
  Index: tsYellowstoneFires.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContext version="1.0.0" id="timeSeriesDemo" 
      xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="1024" height="1024"/>
      <BoundingBox SRS="CRS:84" minx="-111.4" miny="43.868" maxx="-109.4" maxy="45.400"/>
            <Title>Wildfire Growth around Yellowstone National Park in 1988 (1024x1024 Animation)</Title>
            <Abstract>During the summer of 1988, wildfires burned about 1.4 million acres in and around Yellowstone National Park.  Spurred by the driest summer in park history, the fires started in early July and lasted until early October.  The worst day was August 20, when tremendous winds pushed the fires to burn over 150,000 acres.  Although the scars from these fires are still visible in Landsat imagery from space over ten years later, the patchwork nature of the fire footprint left many unburned areas from which plant species have regenerated very successfully.  This animation shows how the fires progressed in the period from June 30 though October 2, 1988, by which time the fall rain and snow had stopped the fire growth.  These maps are based on daily ground observations by fire lookouts in the park and by infrared imaging cameras flown over the park at night.  These observations are considered accurate to within about 100 meters.</Abstract>
            <KeywordList>
              <Keyword vocabulary="SVS">Fires</Keyword>
              <Keyword vocabulary="DLESE">Natural hazards</Keyword>
              <Keyword vocabulary="DLESE">Physical geography</Keyword>
              <Keyword vocabulary="SVS">Yellowstone National Park</Keyword>
              <Keyword vocabulary="GCMD">EARTH SCIENCE:Agriculture:Forest Science:Forest Fire Science</Keyword>
              <Keyword vocabulary="GCMD">EARTH SCIENCE:Biosphere:Ecological Dynamics:Fire Occurrence</Keyword>
              <Keyword vocabulary="GCMD">EARTH SCIENCE:Human Dimensions:Natural Hazards:Fires</Keyword>
            </KeywordList>
      <LogoURL width="273" height="22" format="image/png">
        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
             xlink:type="simple"
             xlink:href="http://svs.gsfc.nasa.gov/svs_icons/nasalogo.png"/>
      </LogoURL>
      <DescriptionURL format="text/html">
          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
           xlink:type="simple"
           xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002909/"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Tom Kralidis</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+01 613 947 1828</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+01 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>tom.kralidis at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
          <Layer opaque="0" noSubsets="1" fixedWidth="1024" fixedHeight="1024">
        <Server service="wms" version="1.3.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://aes.gsfc.nasa.gov/cgi-bin/wms?"/>
        </Server>
            <Name>2909_467</Name>
        <DimensionList>
            <Dimension name="time" units="ISO8601" default="1988-10-02">1988-06-30/1988-10-02/P1D</Dimension>
        </DimensionList>
            <MetadataURL type="FGDC:1998">
              <Format>text/plain</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
               xlink:type="simple"
               xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002909/a002909.fgdc"/>
            </MetadataURL>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
     <StyleList>
            <Style current="1">
              <Name>composite</Name>
              <Title>Overlay Composited with Background Image</Title>
              <Abstract>This animation shows the progression of the fires in and around Yellowstone National Park during the summer of 1988, overlayed on a false-color image from Landsat 7..  Independent fires are shown in different colors, and the most recently burned areas are shown in a brighter color.  This version provides the transparent overlay composited with a background image.</Abstract>
              <LegendURL width="320" height="210">
                <Format>image/tif</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002909/firelegend.tif"/>
              </LegendURL>
            </Style>
            <Style>
              <Name>overlay</Name>
              <Title>Transparent Overlay Only</Title>
              <Abstract>This animation shows the progression of the fires in and around Yellowstone National Park during the summer of 1988, overlayed on a false-color image from Landsat 7..  Independent fires are shown in different colors, and the most recently burned areas are shown in a brighter color.  This version provides only the transparent overlay.</Abstract>
              <LegendURL width="320" height="210">
                <Format>image/tif</Format>
                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xlink:type="simple"
                 xlink:href="http://svs.gsfc.nasa.gov/vis/a000000/a002900/a002909/firelegend.tif"/>
              </LegendURL>
            </Style>
     </StyleList>
          </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wfs-t/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by Tom Kralidis (NRCAN CCRs) -->
  <MapbuilderConfig version="1.0.0" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file. 
    -->
  	<models>
  		<Context id="mainMap">
  			<defaultModelUrl>tasmania.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</MapPane>
  				<Loading id="loading"/>
  				<Loading2 id="loading2">
  					<mapContainerId>mainMapContainer</mapContainerId>
  				</Loading2>
  				<AoiBoxWZ id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxWZ>
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  				</CursorTrack>
  				<Legend id="legend"/>
  				<Widget id="version">
  					<stylesheet>../../lib/widget/Version.xsl</stylesheet>
  				</Widget>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<MouseClickHandler id="mainMouseClick"/>
  			</tools>
  		</Context>
  		<Context id="locator">
  			<defaultModelUrl>../data/context/locatorMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="locatorWidget">
  					<htmlTagId>locatorMap</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<fixedWidth>180</fixedWidth>
  				</MapPane>
  				<AoiBoxWZ id="aoiBox3">
  					<htmlTagId>locatorMap</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxWZ>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="locatorAoi"/>
  				<ZoomToAoi id="locatorZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Context>
  		<Transaction id="transaction">
  			<widgets>
  				<TransactionResponse id="transactionResponse">
          </TransactionResponse>
  			</widgets>
  		</Transaction>
  		<FeatureCollection id="featureCollection">
  			<widgets>
  				<GmlRendererWZ id="testGmlRenderer">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>3</lineWidth>
  					<pointDiameter>10</pointDiameter>
  				</GmlRendererWZ>
  				<FeatureList id="featureList">
          </FeatureList>
  			</widgets>
  			<namespace>xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs' xmlns:topp='http://www.openplans.org/topp'</namespace>
  		</FeatureCollection>
  	</models>
  	<widgets>
  		<DeleteFeature id="deleteFeature">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/DeleteDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>../../../geoserver/wfs</webServiceUrl>
  			<targetContext>mainMap</targetContext>
  		</DeleteFeature>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.png</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.png</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.png</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.png</enabledSrc>
  			<disabledSrc>/images/PanDisable.png</disabledSrc>
  		</DragPan>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.png</disabledSrc>
  		</Reset>
  		<EditPoint id="editPoint">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditPointEnable.png</enabledSrc>
  			<disabledSrc>/images/EditPointDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>../../../geoserver/wfs</webServiceUrl>
  			<targetContext>mainMap</targetContext>
  			<featureXpath>/gml:featureMember/topp:tasmania_cities/topp:the_geom/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates</featureXpath>
  			<defaultModelUrl>template_cities.xml</defaultModelUrl>
  		</EditPoint>
  		<EditLine id="editLine">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/EditLineEnable.png</enabledSrc>
  			<disabledSrc>/images/EditLineDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>../../../geoserver/wfs</webServiceUrl>
  			<targetContext>mainMap</targetContext>
  			<featureXpath>/gml:featureMember/topp:tasmania_roads/topp:the_geom/gml:MultiLineString/gml:lineStringMember/gml:LineString/gml:coordinates</featureXpath>
  			<defaultModelUrl>template_road.xml</defaultModelUrl>
  		</EditLine>
  		<InsertFeature id="insertFeature">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>featureCollection</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/SaveDisable.png</disabledSrc>
  			<transactionResponseModel>transaction</transactionResponseModel>
  			<webServiceUrl>../../../geoserver/wfs</webServiceUrl>
  			<targetContext>mainMap</targetContext>
  		</InsertFeature>
  		<WfsGetFeature id="wfsGetFeature">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainMouseClick</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/QueryEnable.png</enabledSrc>
  			<disabledSrc>/images/QueryDisable.png</disabledSrc>
  			<transactionResponseModel>featureCollection</transactionResponseModel>
  			<webServiceUrl>../../../geoserver/wfs</webServiceUrl>
  			<typeName>topp:tasmania_cities,topp:tasmania_roads</typeName>
  			<tolerance>5</tolerance>
  		</WfsGetFeature>
  	</widgets>
  	<skinDir>../../lib/skin/default</skinDir>
  	<widgetTextUrl>/widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  	<!-- Url of LOCAL redirection script, required to access external URLs -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wfs-t/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  <!--
  Description: A Browser based Transactional Web Feature Server client
               based on javascript and XSL
               libraries from http://mapbuilder.sourceforge.net .
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
  <html>
    <head>
      <title>Mapbuilder WFS-T Client</title>
  
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='../../lib/skin/default/mapStyle.css'>
  
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config.xml';
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
  
    <body onload="mbDoLoad()">
      <!-- Layout mapbuilder widgets and HTML -->
      <h1><a href="http://mapbuilder.sourceforge.net">MapBuilder</a> WFS-T Demo</h1>
      <table>
        <tr>
          <td valign="top" id="locatorMap"/>
          <td rowspan="2" colspan="2">
            <div id="mainMapPane"/>
            <div id="loading">
              <p>Loading Program<br/>
              <img src="../../lib/skin/default/images/Loading.gif"/>
              </p>
            </div>
        </tr>
        <tr>
          <td id="legend"/>
        </tr>
        <tr>
          <td/>
          <td align="left" id="mainButtonBar"/>
          <td align="right" id="cursorTrack" />
        </tr>
        <tr>
          <td colspan="3" id="featureList"/>
        </tr>
        <tr>
          <td colspan="3" id="transactionResponse"/>
        </tr>
        <tr>
          <td colspan="3">
            <div id="eventLog"/>
          </td>
        </tr>
        <tr align="right">
          <td valign="bottom" align="left">
            <a href="install.html">Basemap install instructions</a>.
          </td>
          <td colspan="2">
            <table>
              <tr align="right">
                <td><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/><div id="version"/></td>
                <td><img src="../../lib/skin/default/images/Icon.gif"/></td>
              </tr>
            </table>
          </td>
        </tr>
      </table>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wfs-t/install.html
  
  Index: install.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  
  <!--
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
  <html>
    <head>
      <title>WFS-T Client Installation Instructions</title>
      <link rel='StyleSheet' type='text/css' href='/mapbuilder/lib/skin/default/docsStyle.css'>
    </head>
  
    <body>
      <h1><a href="http://mapbuilder.sourceforge.net">Map Builder</a> WFS-T Demo Installation Instructions</h1>
      <p>The Feature entry demo is configured to work with a default installation
      of <a href="http://geoserver.sourceforge.net">Geoserver</a>.  Geoserver
      needs be installed on a server which supports Java Servlets (which is
      why this demo doesn't work on the
      <a href="http://mapbuilder.sf.net"/>Sourceforge</a> website).</p>
      <h2>Installation instructions</h2>
      <ol>
        <li>Download and install <a href="http://java.sun.com/j2se/corejava/index.jsp"/>Java</a>.</li>
        <li>Download and install <a href="http://java.sun.com/products/java-media/jai/current.html"/>Java Advanced Imaging (JAI)</a>.</li>
        <li>Download, install and start <a href="http://jakarta.apache.org/tomcat/">Tomcat</a>, (or another a Java Servlet Container).</li>
        <li>Download and install <a href="http://geoserver.sourceforge.net">Geoserver</a> version 1.3.0-beta or later.  Installation is as simple as copying the geoserver.war file into the tomcat/webapps/ directory.</li>
        <li>Copy the mapbuilder.war file into the tomcat/webapps/ directory.</li>
        <li>Access the WFS-T demo URL.  This will probably be <a href="http://localhost:8080/mapbuilder/demo/wfs-t/">http://localhost:8080/mapbuilder/demo/wfs-t/</a>.
      </ol>
  
      <table class="footer">
        <tr>
          <td><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</td>
          <td width="60"><img src="/mapbuilder/lib/skin/default/images/Icon.gif"/></td>
        </tr>
      </table>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wfs-t/tasmania.xml
  
  Index: tasmania.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="600" height="300"/>
      <BoundingBox SRS="EPSG:4326" minx="141.57875" miny="-44.26625" maxx="151.03125" maxy="-39.56375"/>
      <Title>Tasmania, Austalia</Title>
      <KeywordList>
        <Keyword>Tasmania</Keyword>
        <Keyword>Australia</Keyword>
      </KeywordList>
      <Abstract>Low resolution map of Tasmania, Australia derived from the Digital Chart of the World.</Abstract>
    </General>
    <LayerList>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Local">
          <OnlineResource xlink:type="simple" xlink:href="../../../geoserver/wms"/>
        </Server>
        <Name>topp:tasmania_state_boundaries</Name>
        <Title>Tasmania State Boundaries</Title>
        <Abstract>Tasmania State Boundaries based on the Digital Chart of the World.</Abstract>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>green</Name>
            <Title>Default Styler</Title>
            <Abstract/>
            <!--LegendURL width="20" height="20">
              <Format>image/gif</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="../../../geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/gif&amp;WIDTH=20&amp;HEIGHT=20&amp;LAYER=topp:tasmania_state_boundaries"/>
            </LegendURL-->
          </Style>
        </StyleList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <!--OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/-->
        <OnlineResource xlink:type="simple" xlink:href="http://www2.demis.nl/WMS/wms.asp?wms=WorldMap"/>
        </Server>
        <Name>Coastlines,Borders</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Local">
          <OnlineResource xlink:type="simple" xlink:href="../../../geoserver/wms"/>
        </Server>
        <Name>topp:tasmania_water_bodies</Name>
        <Title>Tasmania Water Bodies</Title>
        <Abstract>Tasmania Water Bodies based on the Digital Chart of the World.</Abstract>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>cite_lakes</Name>
            <Title>Default Styler</Title>
            <Abstract/>
            <!--LegendURL width="20" height="20">
              <Format>image/gif</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="../../../geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/gif&amp;WIDTH=20&amp;HEIGHT=20&amp;LAYER=topp:tasmania_water_bodies"/>
            </LegendURL-->
          </Style>
        </StyleList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Local">
          <OnlineResource xlink:type="simple" xlink:href="../../../geoserver/wms"/>
        </Server>
        <Name>topp:tasmania_roads</Name>
        <Title>Tasmania Roads</Title>
        <Abstract>Tasmania Roads based on the Digital Chart of the World.</Abstract>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>simple_roads</Name>
            <Title>Default Styler for simple road segments</Title>
            <Abstract/>
            <!--LegendURL width="20" height="20">
              <Format>image/gif</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="../../../geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/gif&amp;WIDTH=20&amp;HEIGHT=20&amp;LAYER=topp:tasmania_roads"/>
            </LegendURL-->
          </Style>
        </StyleList>
      </Layer>
      <Layer queryable="1" hidden="0">
        <Server service="OGC:WMS" version="1.1.1" title="Local">
          <OnlineResource xlink:type="simple" xlink:href="../../../geoserver/wms"/>
        </Server>
        <Name>topp:tasmania_cities</Name>
        <Title>Tasmania Major Cities</Title>
        <Abstract>Tasmania Major based on the Digital Chart of the World.</Abstract>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        <StyleList>
          <Style current="1">
            <Name>capitals</Name>
            <Title>Default Styler</Title>
            <Abstract/>
            <!--LegendURL width="20" height="20">
              <Format>image/gif</Format>
              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="../../../geoserver/wms/GetLegendGraphic?VERSION=1.0.0&amp;FORMAT=image/gif&amp;WIDTH=20&amp;HEIGHT=20&amp;LAYER=topp:tasmania_cities"/>
            </LegendURL-->
          </Style>
        </StyleList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wfs-t/template_cities.xml
  
  Index: template_cities.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- $Id$ -->
  <gml:featureMember xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml">
    <topp:tasmania_cities>
      <topp:the_geom>
        <gml:MultiPoint srsName="epsg:4326">
          <gml:pointMember>
            <gml:Point>
              <gml:coordinates decimal="." cs="," ts=" "></gml:coordinates>
            </gml:Point>
          </gml:pointMember>
        </gml:MultiPoint>
      </topp:the_geom>
      <topp:CITY_NAME></topp:CITY_NAME>
      <topp:ADMIN_NAME>Tasmania</topp:ADMIN_NAME>
      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
      <topp:STATUS>Provincial capital</topp:STATUS>
      <topp:POP_CLASS></topp:POP_CLASS>
    </topp:tasmania_cities>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wfs-t/template_road.xml
  
  Index: template_road.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <gml:featureMember xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml">
    <topp:tasmania_roads>
      <topp:the_geom>
        <gml:MultiLineString srsName="epsg:4326">
          <gml:lineStringMember>
            <gml:LineString>
              <gml:coordinates decimal="." cs="," ts=" "></gml:coordinates>
            </gml:LineString>
          </gml:lineStringMember>
        </gml:MultiLineString>
      </topp:the_geom>
      <topp:TYPE>road</topp:TYPE>
    </topp:tasmania_roads>
  </gml:featureMember>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ExecuteRequest.xml
  
  Index: ExecuteRequest.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <Execute service="WPS" version="0.2.4" store="false" 
  
  		xmlns="http://www.opengis.net/wps" 
  
  		xmlns:gml="http://www.opengis.net/gml"
  
  		xmlns:ows="http://www.opengis.net/ows" 
  
  		xmlns:xlink="http://www.w3.org/1999/xlink" 
  
  		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  
  		xsi:schemaLocation="http://www.opengis.net/wps file:///C:/Docume~1/adair/MYDOCU~1/wpsIE/schemas/0.2.4/wpsExecute.xsd" >
  
  	<ProcessName>minValue</ProcessName>
  
  	<Input>
  
  		<ParameterValue>
  
  			<Name>inputGridCoverage</Name>
  
  			<Label>Input Grid Coverage</Label>
  
  			<Description>Coverage that will be processed. This can be a reference URI to a GeoTiff or a WCS request when returning a GeoTiff</Description>
  
  			<Reference xlink:href="http://triangulum.uni-muenster.de:8080/cdd/wcs?REQUEST=GetCoverage&amp;SERVICE=WCS&amp;VERSION=1.0.0&amp;BBOX=-30,55,80,85&amp;TIME=2005-03&amp;CRS=EPSG:4326&amp;COVERAGE=TEMPERATURE">
  
  				<ows:Abstract>This is the GeoTIFF online source</ows:Abstract>
  
  			</Reference>
  
  		</ParameterValue>
  
  	</Input>
  
  	<Input>
  
  		<ParameterValue>
  
  			<Name>valueToIgnore</Name>
  
  			<Label>Value to ignore</Label>
  
  			<Description>Some values might be known to not be the minimum value. They should be ignored in output statistics (e.g. 0 or -9999), Example: valueToIgnore = -9999</Description>
  
  			<LiteralValue>-9999</LiteralValue>
  
  		</ParameterValue>
  
  	</Input>
  
  	<Output>
  
  		<Name>minValueResult</Name>
  
  	</Output>
  
  </Execute>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ExecuteRequestResponse.xml
  
  Index: ExecuteRequestResponse.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <!--Sample XML file generated by XMLSPY v5 U (http://www.xmlspy.com)-->
  
  <ExecuteResponse 
  
  		xmlns="http://www.opengis.net/wps" 
  
  		xmlns:gml="http://www.opengis.net/gml" 
  
  		xmlns:ows="http://www.opengis.net/ows" 
  
  		xmlns:xlink="http://www.w3.org/1999/xlink" 
  
  		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  
  		xsi:schemaLocation="http://www.opengis.net/wps C:\DOCUME~1\adair\MYDOCU~1\wpsIE\schemas\0.2.4\wpsExecute.xsd" 
  
  		version="0.2.4" statusLocation="http://www.altova.com">
  
  	<ProcessName>Min Value</ProcessName>
  
  			<Input>
  
  				<ParameterValue>
  
  					<Name>inputGridCoverage</Name>
  
  					<Label>Input Grid Coverage</Label>
  
  					<Description>Coverage that will be processed. This can be a reference URI to a GeoTiff or a WCS request when returning a GeoTiff</Description>
  
  						<Reference xlink:href="anyURI" gml:remoteSchema="http://www.altova.com">
  
  							<ows:Format>image/GeoTiff</ows:Format>
  
  						</Reference>
  
  				</ParameterValue>
  
  			</Input>
  
  			<Input>
  
  				<ParameterValue>
  
  					<Name>bbox</Name>
  
  					<Label>Bounding Box</Label>
  
  					<Description>bounding box to be processed</Description>
  
  						<BoundingBox crs="EPSG:4326" dimensions="3">
  
  							<ows:LowerCorner>-71.10285218349743 42.261800717452054</ows:LowerCorner>
  
  							<ows:UpperCorner>-71.04767081931412 42.29490953596204</ows:UpperCorner>
  
  						</BoundingBox>
  
  				</ParameterValue>
  
  			</Input>
  
  			<Input>
  
  				<ParameterValue>
  
  					<Name>image</Name>
  
  					<Label>image of interest</Label>
  
  					<Description>number of image of interest, needed in case more than one image is encoded in a GeoTIFF: initial value is 1</Description>
  
  						<LiteralValue ows:type="integer" uom="anyUri"/>
  
  				</ParameterValue>
  
  			</Input>
  
  			<Input>
  
  				<ParameterValue>
  
  					<Name>band</Name>
  
  					<Label>band of interest</Label>
  
  					<Description>and for which the statistics shall be provided: initial value is 1</Description>
  
  						<LiteralValue ows:type="integer">1
  
  						</LiteralValue>
  
  				</ParameterValue>
  
  			</Input>
  
  			<Input>
  
  				<ParameterValue>
  
  					<Name>valueToIgnore</Name>
  
  					<Label>Value to ignore</Label>
  
  					<Description>Some values might be known to not be the minimum value. They should be ignored in output statistics (e.g. 0 or -9999), Example: valueToIgnore = -9999</Description>
  
  						<LiteralValue ows:type="decimal"/>
  
  				</ParameterValue>
  
  			</Input>
  
  			<Output>
  
  				<ParameterValue>
  
  					<Name>minValueResult</Name>
  
  					<Label>Minium Value</Label>
  
  					<Description>The minimum value found in the dataset</Description>
  
  						<LiteralValue ows:type="decimal">10.6</LiteralValue>
  
  				</ParameterValue>
  
  			</Output>
  
  	<ows:Metadata xlink:href="http://www.altova.com" about="http://www.altova.com"/>
  
  	<Status>
  
  		<ProcessSucceeded>String</ProcessSucceeded>
  
  	</Status>
  
  </ExecuteResponse>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/IFGITemp.xml
  
  Index: IFGITemp.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <OWSContext version="0.0.13"
      id="ows-context-tie"
      xmlns="http://www.opengis.net/context"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:sld="http://www.opengis.net/sld"
      xmlns:ogc="http://www.opengis.net/ogc"
      xmlns:ows="http://www.opengis.net/ows"
      xmlns:param="http;//www.opengis.net/param"
      xsi:schemaLocation="http://www.opengis.net/oc oc_0_0_13.xsd">
    <General>
      <Window width="550" height="300"/>
      <ows:BoundingBox crs="EPSG:4326">
        <ows:LowerCorner>5 55</ows:LowerCorner>
        <ows:UpperCorner>60 85</ows:UpperCorner>
      </ows:BoundingBox>
      <Title>BALANCE Visualization Server</Title>
      <Abstract>Web Map Server maintained for BALANCE Project by Institute for Geoinformatics, University of Muenster.  Contact: tegtmeyer at uni-muenster.de.</Abstract>
          <KeywordList>
              <Keyword>Barents Sea</Keyword>
              <Keyword>arctic</Keyword>
              <Keyword>climate</Keyword>
              <Keyword>BALANCE</Keyword>
          </KeywordList>
      <DescriptionURL format="text/html">
          <OnlineResource xlink:href="http://www.balance-eu.info" xlink:type="simple"/>
      </DescriptionURL>
      <ows:ServiceProvider>
      <ows:ProviderName>IFGI</ows:ProviderName>
      <ows:ProviderSite xlink:type="simple" xlink:href="http://www.balance-eu.info"/>
      <ows:ServiceContact>
        <ows:IndividualName>Sascha Tegtmeyer</ows:IndividualName>
        <ows:PositionName>Student</ows:PositionName>
        <ows:ContactInfo>
          <ows:Phone>
            <ows:Voice>xx</ows:Voice>
            <ows:Facsimile>xx</ows:Facsimile>
          </ows:Phone>
          <ows:Address>
            <ows:DeliveryPoint>Robert-Koch-Str. 26-28</ows:DeliveryPoint>
            <ows:City>Muenster</ows:City>
            <ows:AdministrativeArea>NRW</ows:AdministrativeArea>
            <ows:PostalCode>48145</ows:PostalCode>
            <ows:Country>Germany</ows:Country>
            <ows:ElectronicMailAddress>tegtmeyer at uni-muenster.de</ows:ElectronicMailAddress>
          </ows:Address>
          <ows:OnlineResource xlink:type="simple" xlink:href="http://www.balance-eu.info"/>
        </ows:ContactInfo>
        <ows:Role>Student</ows:Role>
      </ows:ServiceContact>
    </ows:ServiceProvider>
    </General>
    <ResourceList>
      <Coverage hidden="0">
        <Server service="OGC:WCS" version="1.0.0" title="BALANCE Visualization Server">
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://triangulum.uni-muenster.de:8080/cdd/wcs?"/>
        </Server>
        <Name>TEMPERATURE</Name>
                      <Title>Monthly Mean Temperature</Title>
                      <Abstract>Monthly Mean Temperature from REMO</Abstract>
        <MetadataURL format="text/xml">
          <OnlineResource xlink:type="simple" xlink:href="http://geo-hermes.uni-muenster.de:8080/balance/servlet/de.ifgi.wmsclient.balance.util.LegendServlet?HEIGHT=25&amp;WIDTH=95&amp;MIN=%3C%3D+-30&amp;MAX=%3E+30&amp;FONTSIZE=12&amp;FONTWEIGHT=BOLD&amp;COLORS=%23000033,%234169E1,%230FDDAF,%23FFFF00,%23FFA500,%23FF0000,%23CD0000,%23660000"/>
        </MetadataURL>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">GeoTIFF</Format>
        </FormatList>
        <DimensionList>
          <Dimension name="time" units="ISO8601" nearestValue="1">1962-01/2098-12/P1M</Dimension>
        </DimensionList>
        <ParameterList>
          <Parameter>
            <param:kvp name="TIME" value="2005.03"/>
          </Parameter>
        </ParameterList>
      </Coverage>
      <Layer queryable="1" hidden="0">
        <Server service="wms" version="1.1.1" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://triangulum.uni-muenster.de:8080/cdd/wms"/>
        </Server>
                      <Name>TEMPERATURE</Name>
                      <Title>Monthly Mean Temperature</Title>
                      <Abstract>Monthly Mean Temperature from REMO</Abstract>
        <DimensionList>
                      <!--Extent nearestValue="0" default="2005-04" name="time">1962-01/2098-12/P1M</Extent-->
          <Dimension name="time" units="ISO8601" nearestValue="1">2004-04/2005-04/P1M</Dimension>
        </DimensionList>
        <MetadataURL format="text/xml">
          <OnlineResource xlink:type="simple" xlink:href="http://geo-hermes.uni-muenster.de:8080/balance/servlet/de.ifgi.wmsclient.balance.util.LegendServlet?HEIGHT=25&amp;WIDTH=95&amp;MIN=%3C%3D+-30&amp;MAX=%3E+30&amp;FONTSIZE=12&amp;FONTWEIGHT=BOLD&amp;COLORS=%23000033,%234169E1,%230FDDAF,%23FFFF00,%23FFA500,%23FF0000,%23CD0000,%23660000"/>
        </MetadataURL>
        <FormatList>
          <Format current="1">image/png</Format>
        </FormatList>
        <StyleList>
                      <Style>
                          <Name>default</Name>
                          <Title>default</Title>
                          <LegendURL width="75" height="20">
                              <Format>image/png</Format>
                              <OnlineResource ns5:href="http://geo-hermes.uni-muenster.de:8080/balance/servlet/de.ifgi.wmsclient.balance.util.LegendServlet?HEIGHT=25&amp;WIDTH=95&amp;MIN=%3C%3D+-30&amp;MAX=%3E+30&amp;FONTSIZE=12&amp;FONTWEIGHT=BOLD&amp;COLORS=%23000033,%234169E1,%230FDDAF,%23FFFF00,%23FFA500,%23FF0000,%23CD0000,%23660000" ns5:type="simple" xmlns:ns5="http://www.w3.org/1999/xlink"/>
                          </LegendURL>
                      </Style>
        </StyleList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/atlas/web/mapdata/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </ResourceList>
  </OWSContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ModelUrlInput.xsl
  
  Index: ModelUrlInput.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Output a form for setting any model's url and method values
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="modelTitle"/>
    <xsl:param name="targetModel"/>
    <xsl:param name="widgetId"/>
  
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
    <xsl:param name="load"/>
  
      <!-- The name of the form for coordinate output -->
    <xsl:param name="modelUrl"/>
    <xsl:param name="formName">ModelUrlInputForm</xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/">
      <div class="tabbedContent">
        <form name="{$formName}" id="{$formName}" onsubmit="return config.objects.{$widgetId}.submitForm()">
          Select a Web Processing service from the menu on the left, 
          or enter the WPS GetCapabilities URL here:    
          <input name="modelUrl" type="text" size="30" value="{$modelUrl}"/>
          <a href="javascript:config.objects.{$widgetId}.submitForm();"><xsl:value-of select="$load"/></a>
        </form>
      </div>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/PCIwpsCaps.xml
  
  Index: PCIwpsCaps.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <Capabilities 
  
  xmlns="http://www.opengis.net/wps" 
  
  xmlns:ows="http://www.opengis.net/ows" 
  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  
  xmlns:xlink="http://www.w3.org/1999/xlink" 
  
  xsi:schemaLocation="http://www.opengis.net/wps file:///C:/Docume~1/adair/MYDOCU~1/wpsIE/schemas/0.2.4/wpsGetCapabilities.xsd"
  
  version="0.2.4">
  
  	<ows:ServiceIdentification>
  
  		<ows:ServiceType>OGC:WPS</ows:ServiceType>
  
  		<ows:ServiceTypeVersion>0.2.1</ows:ServiceTypeVersion>
  
  		<ows:Title>PCI Remote Sensing Calculations</ows:Title>
  
  		<ows:Abstract>Image processing tasks to be defined (Coordinate Transformation, filtering, classification,etc…)</ows:Abstract>
  
  		<ows:Keywords>
  
  			<ows:Keyword>PACE</ows:Keyword>
  
  		</ows:Keywords>
  
  		<ows:Fees>NONE</ows:Fees>
  
  		<ows:AccessConstraints>NONE</ows:AccessConstraints>
  
  	</ows:ServiceIdentification>
  
  	<ows:ServiceProvider>
  
  		<ows:ProviderName>PCI</ows:ProviderName>
  
  		<ows:ProviderSite xlink:type="simple" xlink:href="http://www.pcigeomatics.com/"/>
  
  		<ows:ServiceContact>
  
  			<ows:IndividualName>Steve Keens</ows:IndividualName>
  
  			<ows:PositionName>Systems Scientist</ows:PositionName>
  
  			<ows:ContactInfo>
  
  				<ows:Phone>
  
  					<ows:Voice>+01-905-336-4409</ows:Voice>
  
  					<ows:Facsimile>+01-905-336-4499</ows:Facsimile>
  
  				</ows:Phone>
  
  				<ows:Address>
  
  					<ows:DeliveryPoint>867 Lakeshore Road</ows:DeliveryPoint>
  
  					<ows:City>Burlington</ows:City>
  
  					<ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
  
  					<ows:PostalCode>L7R4A6</ows:PostalCode>
  
  					<ows:Country>Canada</ows:Country>
  
  					<ows:ElectronicMailAddress>tom.kralidis at ec.gc.ca</ows:ElectronicMailAddress>
  
  				</ows:Address>
  
  				<ows:OnlineResource xlink:type="simple" xlink:href="http://www.pcigeomatics.com/"/>
  
  				<ows:HoursOfService>0700h - 1500h (EST), Monday - Friday</ows:HoursOfService>
  
  				<ows:ContactInstructions>Just call or email</ows:ContactInstructions>
  
  			</ows:ContactInfo>
  
  			<ows:Role>Systems Scientist</ows:Role>
  
  		</ows:ServiceContact>
  
  	</ows:ServiceProvider>
  
  	<ows:OperationsMetadata>
  
  		<ows:Operation name="GetCapabilities">
  
  			<ows:DCP>
  
  				<ows:HTTP>
  
  					<ows:Get xlink:href="http://gws2.pcigeomatics.com/wps/wps?"/>
  
  				</ows:HTTP>
  
  			</ows:DCP>
  
  		</ows:Operation>
  
  		<ows:Operation name="DescribeProcess">
  
  			<ows:DCP>
  
  				<ows:HTTP>
  
  					<ows:Get xlink:href="http://gws2.pcigeomatics.com/wps/wps?"/>
  
  					<ows:Post xlink:href="http://gws2.pcigeomatics.com/wps/wps?"/>
  
  				</ows:HTTP>
  
  			</ows:DCP>
  
  		</ows:Operation>
  
  		<ows:Operation name="Execute">
  
  			<ows:DCP>
  
  				<ows:HTTP>
  
  					<ows:Get xlink:href="http://gws2.pcigeomatics.com/wps/wps?"/>
  
  				</ows:HTTP>
  
  			</ows:DCP>
  
  		</ows:Operation>
  
  	</ows:OperationsMetadata>
  
  	<ProcessOfferings>
  
  		<Process>
  
  			<Name>FIMPORT</Name>
  
  			<Description>
  
          Transfers all the image, and auxiliary information from a source file to a newly created PCIDSK file. All GDB supported file types may be imported.
  
        </Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>FIMPORT</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>SATMODEL</Name>
  
  			<Description>Calculate the model (SATMODEL).</Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>SATMODEL</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>REGPRO</Name>
  
  			<Description>
  
          Performs image registration of an input image to an output image.
  
        </Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>REGPRO</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>ORTHO</Name>
  
  			<Description>Ortho correct the file (ORTHO).</Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>ORTHO</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>FEXPORT</Name>
  
  			<Description>
  
          Transfers all the requested image, and auxiliary information from a source file to an output file. Only some supported GDB formats may be exported to.
  
        </Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>FEXPORT</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>CDSPOT5</Name>
  
  			<Description>CD SPOT 5 imports SPOT 5 data into pix.</Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>CDSPOT5</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  	</ProcessOfferings>
  
  </Capabilities>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/PCIwpsExecuteResponse.xml
  
  Index: PCIwpsExecuteResponse.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <ExecuteResponse xmlns="http://www.opengis.net/wps" xmlns:gml="http://www.opengs.net/gml" xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/wps http://gws2.pcigeomatics.com:80/sdlocation/ogc/wps/0.2.4/wpsExecute.xsd" version="0.2.4" statusLocation="http://gws2.pcigeomatics.com/wps/wps?service=WPS&amp;request=QuryProcessStatus&amp;processID=b26856d0-4415-4500-a751-9280b3d52959">
          <ProcessName>CoordinateTransform</ProcessName>
          <Status>
                  <ProcessAccepted/>
          </Status>
  </ExecuteResponse>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/PCIwpsProcessDesc.xml
  
  Index: PCIwpsProcessDesc.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <ProcessDescription xmlns="http://www.opengis.net/wps" xmlns:ows="http://www.opengis.net/ows" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" version="0.0.1">
    <Process>
      <name>SATMODEL</name>
      <label/>
      <description>Calculate the model (SATMODEL).</description>
      <Application>
        <ows:Keywords>
          <ows:Keyword>SATMODEL</ows:Keyword>
        </ows:Keywords>
      </Application>
      <Category>
        <ows:Keywords>
          <ows:Keyword>PACE</ows:Keyword>
        </ows:Keywords>
      </Category>
      <input>
        <Parameter>
          <name>mapunits</name>
          <label/>
          <description/>
          <minimumOccurs>1</minimumOccurs>
          <datatype>http://www.w3.org/2001/XMLSchema#string</datatype>
        </Parameter>
      </input>
      <input>
        <Parameter>
          <name>mmseg</name>
          <label/>
          <description/>
          <minimumOccurs>1</minimumOccurs>
          <datatype>http://www.w3.org/2001/XMLSchema#int</datatype>
        </Parameter>
      </input>
      <input>
        <Parameter>
          <name>mfile</name>
          <label/>
          <description/>
          <minimumOccurs>1</minimumOccurs>
          <datatype>http://www.w3.org/2001/XMLSchema#string</datatype>
        </Parameter>
      </input>
      <input>
        <Parameter>
          <name>report</name>
          <label/>
          <description/>
          <minimumOccurs>1</minimumOccurs>
          <datatype>http://www.w3.org/2001/XMLSchema#string</datatype>
        </Parameter>
      </input>
      <input>
        <Parameter>
          <name>orbit</name>
          <label/>
          <description/>
          <minimumOccurs>1</minimumOccurs>
          <datatype>http://www.w3.org/2001/XMLSchema#int</datatype>
        </Parameter>
      </input>
    </Process>
  </ProcessDescription>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ProcessArgumentsForm.js
  
  Index: ProcessArgumentsForm.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  
  /**
   * Widget to display the AOI box coordinates in a form.
   *
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function ProcessArgumentsForm(widgetNode, model) {
    WidgetBaseXSL.apply(this, new Array(widgetNode, model));
  
    this.executeProcess = function(processName) {
      var webServiceUrl = this.argsForm.action
      if (this.argsForm.action.indexOf("?")<0) webServiceUrl += "?";
      var queryString = "";
      for (var i=0; i<this.argsForm.elements.length; ++i) {
        var element = this.argsForm.elements[i];
        if (element.name.indexOf("_dataSelector")>0) continue;
        queryString += element.name + "=" + encodeURIComponent(element.value) + "&";
      }
      if (this.targetModel.method == "get") {
        webServiceUrl += queryString;
        this.targetModel.postData = null;
        if (this.debug) alert(webServiceUrl);
      } else {
        this.targetModel.postData = queryString;
        if (this.debug) alert(webServiceUrl+" posting:"+queryString);
      }
      config.loadModel( this.targetModel.id, webServiceUrl);
    }
  
    /**
     * Initialize dynamic properties.
     * @param toolRef Pointer to this object.
     */
    this.initMapModel = function(objRef) {
      //set the map model
      var mapModel = objRef.widgetNode.selectSingleNode("mb:mapModel");
      if (mapModel) {
        objRef.mapModel = eval("config.objects."+mapModel.firstChild.nodeValue);
        if ( !objRef.mapModel ) {
          alert("error finding mapModel:" + mapModel.firstChild.nodeValue + " for:" + objRef.id);
        }
      }
      objRef.stylesheet.setParameter("mapModelId", objRef.mapModel.id );
    }
    this.model.addListener("init", this.initMapModel, this);
  
    /**
     * Output the AOI coordinates to the associated form input elements.  This
     * method is registered as an AOI listener on the context doc.
     * @param objRef Pointer to this argsForm object.
     */
    this.displayAoiCoords = function(objRef) {
      objRef.argsForm = document.getElementById(objRef.formName);
      var aoi = objRef.mapModel.getParam("aoi");
      objRef.argsForm.westCoord.value = aoi[0][0];
      objRef.argsForm.northCoord.value = aoi[0][1];
      objRef.argsForm.eastCoord.value = aoi[1][0];
      objRef.argsForm.southCoord.value = aoi[1][1];
    }
  
    /**
     * Set the argument value as a param on the model
     * @param objRef Pointer to this argsForm object.
     */
    this.setArgument = function(event) {
      this.model.setParam(this.name,this.value);
    }
  
    /**
     * Handles user input from the form element.  This is an onblur handler for 
     * the input elements.
     * @param objRef Pointer to this CurorTrack object.
     */
    this.setAoi = function(event) {
      var aoi = this.mapModel.getParam("aoi");
      if (aoi) {
        var ul = aoi[0];
        var lr = aoi[1];
        switch(this.name) {
          case 'westCoord':
            ul[0] = this.value;
            break;
          case 'northCoord':
            ul[1] = this.value;
            break;
          case 'eastCoord':
            lr[0] = this.value;
            break;
          case 'southCoord':
            lr[1] = this.value;
            break;
        }
        this.mapModel.setParam("aoi",new Array(ul,lr) );
      }
    }
  
    /**
     * Refreshes the form onblur handlers when this widget is painted.
     * @param objRef Pointer to this argsForm object.
     */
    this.prePaint = function(objRef) {
      var serviceUrl = objRef.model.parentModel.getServerUrl("wps:Execute", "get");
      if (serviceUrl) {
        objRef.stylesheet.setParameter("webServiceUrl",serviceUrl);
        objRef.stylesheet.setParameter("webServiceMethod","get");
        objRef.targetModel.method = "get";
      } else {
        serviceUrl = objRef.model.parentModel.getServerUrl("wps:Execute", "post");
        objRef.stylesheet.setParameter("webServiceUrl",serviceUrl);
        objRef.stylesheet.setParameter("webServiceMethod","post");
        objRef.targetModel.method = "post";
      }
    }
  
    /**
     * Refreshes the form onblur handlers when this widget is painted.
     * @param objRef Pointer to this argsForm object.
     */
    this.postPaint = function(objRef) {
      objRef.argsForm = document.getElementById(objRef.formName);
      var argsArray = objRef.model.doc.selectNodes("/wps:ProcessDescription/wps:ProcessMember/wps:Process/wps:Input");
      var selectorIndex=0;
      for (var i=0; i<argsArray.length; ++i) {
        var input= argsArray[i];
        var argType = input.selectSingleNode("wps:Parameter/wps:Datatype/*").nodeName;
        var argName = input.selectSingleNode("wps:Parameter/wps:Name").firstChild.nodeValue;
        switch (argType) {
          case "Reference":
          case "wps:Reference":
            if (selectorIndex<2) {
              var selector = config.objects["dataSelector"+selectorIndex];
              ++selectorIndex;
              selector.stylesheet.setParameter("selectName",objRef.id+"_"+argName+"_dataSelector");
              selector.node = document.getElementById(objRef.id+"_"+argName+"_dataSelectorWidget");
              selector.outputNodeId = objRef.id+"_"+argName+"_dataSelectorWidget_outputNode";
              selector.paint(selector);
              selector.targetInput = objRef.argsForm[argName];
            }
            objRef.argsForm[argName].model = objRef.model;
            objRef.argsForm[argName].onblur = objRef.setArgument;
            objRef.argsForm[argName].onchange = objRef.setArgument;
            if (objRef.model.getParam(argName)) objRef.argsForm[argName].value = objRef.model.getParam(argName);
            break;
          case "BoundingBox":
          case "wps:BoundingBox":
            objRef.argsForm.westCoord.onblur = objRef.setAoi;
            objRef.argsForm.northCoord.onblur = objRef.setAoi;
            objRef.argsForm.eastCoord.onblur = objRef.setAoi;
            objRef.argsForm.southCoord.onblur = objRef.setAoi;
            objRef.argsForm.westCoord.model = objRef.model;
            objRef.argsForm.northCoord.model = objRef.model;
            objRef.argsForm.eastCoord.model = objRef.model;
            objRef.argsForm.southCoord.model = objRef.model;
            if (objRef.mapModel) objRef.mapModel.addListener('aoi', objRef.displayAoiCoords, objRef);
            break;
          case "LiteralValue":
          case "wps:LiteralValue":
            objRef.argsForm[argName].model = objRef.model;
            objRef.argsForm[argName].onblur = objRef.setArgument;
            if (objRef.model.getParam(argName)) objRef.argsForm[argName].value = objRef.model.getParam(argName);
            break;
          case "ComplexValue":
          case "wps:ComplexValue":
            objRef.argsForm[argName].model = objRef.model;
            objRef.argsForm[argName].onblur = objRef.setArgument;
            if (objRef.model.getParam(argName)) objRef.argsForm[argName].value = objRef.model.getParam(argName);
            break;
          default:
            alert("invalid argument datatype:"+argType);
            break;
        }
      }
    }
  
    //set some properties for the form output
    this.formName = "ProcessArgsForm_";// + mbIds.getId();
    this.stylesheet.setParameter("formName", this.formName);
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ProcessArgumentsForm.xsl
  
  Index: ProcessArgumentsForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>

<!--
Description: parses an OGC context document to generate an array of DHTML layers.
Author:      adair
Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .

$Id$
$Name$
-->

<xsl:stylesheet version="1.0" 
    xmlns:wps="http://www.opengis.net/wps"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
		xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:ows="http://www.opengis.net/ows"
		xmlns:gml="http://www.opengis.net/gml"
    xmlns:xlink="http://www.w3.org/1999/xlink">

  <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>

  <!-- The coordinates of the DHTML Layer on the HTML page -->
  <xsl:param name="modelId"/>
  <xsl:param name="modelUrl"/>
  <xsl:param name="widgetId"/>
  <xsl:param name="toolId"/>
  
  <xsl:param name="webServiceUrl"/>
  <xsl:param name="webServiceMethod"/>
  <xsl:param name="formName"/>
  
  <!-- template rule matching source root element -->
  <xs
 l:template match="/wps:ProcessDescription/wps:ProcessMember/wps:Process">
    <xsl:variable name="name"><xsl:value-of select="wps:Name"/></xsl:variable>
    <div>
    <form name="{$formName}" id="{$formName}" action="{$webServiceUrl}">
      <input type="hidden" name="request" value="Execute"/>
      <input type="hidden" name="service" value="WPS"/>
      <input type="hidden" name="version" value="0.2.4"/>
      <input type="hidden" name="ProcessName" value="{$name}"/>
    
    <p style="text-align:right;font:70%;margin:0"><a href="{$modelUrl}" target="modelXML">DescribeProcess response</a></p>
    <table cellspacing="0" border="1" width="100%">
      <tr>
        <th align="left">Set parameters for:<xsl:value-of select="$name"/></th>
        <th align="right"><a href="javascript:config.objects.{$widgetId}.executeProcess('{$name}')">Execute</a>
        (<xsl:value-of select="$webServiceMethod"/>)
        </th>
      </tr>
      <tr>
        <td colspan="2">
        <dl>
    
       <dt><xsl:value-of select="wps:Label"/></dt>
          <dd><xsl:value-of select="wps:Description"/></dd>
        </dl>
        </td>
      </tr>
      <tr>
        <td>Input parameters</td>
        <td>value</td>
      </tr>
      <xsl:apply-templates select="wps:Input"/>
    </table>
    </form>
    </div>
  </xsl:template>

  <xsl:template match="wps:Output/wps:Parameter"/>
  
  <xsl:template match="wps:Input/wps:Parameter">
    <xsl:variable name="paramName"><xsl:value-of select="wps:Name"/></xsl:variable>
    <tr>
      <td>
        <dl class="params">
          <dt><xsl:value-of select="wps:Label"/></dt>
          <dd><xsl:value-of select="wps:Description"/></dd>
          <dd>datatype: <xsl:value-of select="name(wps:Datatype/*)"/></dd>
          <xsl:if test="wps:Datatype/wps:Reference/@xlink:href">
          </xsl:if>
        </dl>
      </td>
      <td>
        <xsl:apply-templates select="wps:Datatype/*">
          <xsl:with-param name="paramName" select="$para
 mName"/>
        </xsl:apply-templates>
      </td>
    </tr>
  </xsl:template>

  <xsl:template match="wps:LiteralValue">
    <xsl:param name="paramName"/>
    <input type="text" name="{$paramName}" onblur="config.objects.{$modelId}.parentModel.setParam('{$paramName}',this.value)">
      <xsl:if test="string-length(wps:DefaultValue)>0">
        <xsl:attribute name="value"><xsl:value-of select="wps:DefaultValue"/></xsl:attribute>
      </xsl:if>
    </input>
    <br/>
    <span>type: <xsl:value-of select="@ows:type"/></span>
  </xsl:template>
  
  <xsl:template match="wps:Reference">
    <xsl:param name="paramName"/>
    <input type="text" size="30" name="{$paramName}" onblur="config.objects.{$modelId}.parentModel.setParam('{$paramName}',this.value)">
      <xsl:if test="string-length(@xlink:href)>0">
        <xsl:attribute name="value"><xsl:value-of select="@xlink:href"/></xsl:attribute>
      </xsl:if>
    </input>
    <br/>
    <span>format: <xsl:value-of select="ows:Form
 at"/></span>
    <div id="{$widgetId}_{$paramName}_dataSelectorWidget"></div>
  </xsl:template>
  
  <xsl:template match="wps:BoundingBox">
      use the set AOI button in the map to set the bbox
      <table>
        <tr>
          <td>
          </td>
          <td>
            north: <input NAME="northCoord" TYPE="text" SIZE="10" STYLE="font: 8pt Verdana, geneva, arial, sans-serif;"/>
          </td>
          <td>
          </td>
        </tr>
        <tr>
          <td>
            west: <input NAME="westCoord" TYPE="text" SIZE="10" STYLE="font: 8pt Verdana, geneva, arial, sans-serif;"/>
          </td>
          <td>
          </td>
          <td>
            east: <input NAME="eastCoord" TYPE="text" SIZE="10" STYLE="font: 8pt Verdana, geneva, arial, sans-serif;"/>
          </td>
        </tr>
        <tr>
          <td>
          </td>
          <td>
            south: <input NAME="southCoord" TYPE="text" SIZE="10" STYLE="font: 8pt Verdana, geneva, arial, sans-serif;
 "/>
          </td>
          <td>
          </td>
        </tr>
      </table>
  </xsl:template>

  <xsl:template match="text()|@*"/>

</xsl:stylesheet>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ResourceDropDown.js
  
  Index: ResourceDropDown.js
  ===================================================================
  /*
  Author:       Tom Kralidis
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display a list of resources in a context doc to be selected for use
   * as input to another form.
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  
  function ResourceDropDown(widgetNode, model) {
    WidgetBaseXSL.apply(this, new Array(widgetNode, model));
  
    /**
     * Change the AOI coordinates from select box choice of prefined locations
     * @param bbox the bbox value of the location keyword chosen
     */
  
    this.selectResource = function(selectedOption) {
      if (selectedOption.value.length>0) {
        var httpPayload = null;
        var feature = this.model.getFeatureNode(selectedOption.value);
        var resourceType = selectedOption.getAttribute("resourceType");
        switch(resourceType) {
          case "OGC:WFS":
            httpPayload = config.objects.wfsController.createHttpPayload(feature);//TBD: remove hard-coded ID
            break;
          case "OGC:WCS":
            httpPayload = config.objects.wcsController.createHttpPayload(feature);//TBD: remove hard-coded ID
            break;
          case "wms":
            alert("not implemented yet; this will populate the URI input box with the URI to:"+featureName);
            break;
          case "OGC:GML":
            httpPayload = new Object();
            httpPayload.url = feature.selectSingleNode("wmc:Server/wmc:OnlineResource/@xlink:href").nodeValue;
            break;
        }
        this.targetInput.value = httpPayload.url;
        this.targetInput.focus();
      }
    }
  
    this.setTargetListener = function(objRef) {
      objRef.targetModel.addListener("refresh",objRef.paint,objRef);
    }
    this.model.addListener("loadModel",this.setTargetListener,this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ResourceDropDown.xsl
  
  Index: ResourceDropDown.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parses an OGC context document to generate an array of DHTML layers.
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:ows="http://www.opengis.net/ows"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xlink="http://www.w3.org/1999/xlink" exclude-result-prefixes="wmc xlink">
  
    <xsl:output method="xml"/>
    <xsl:strip-space elements="*"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="selectName">resourceSelect</xsl:param>
  
    <!-- template rule matching source root element -->
    <xsl:template match="/wmc:OWSContext">
        <select name="{$selectName}" onchange="javascript:config.objects.{$widgetId}.selectResource(this.options[this.selectedIndex]);" >
          <option value="">Select a map resource</option>
          <xsl:apply-templates select="wmc:ResourceList/*"/>
        </select>
    </xsl:template>
    
    <!-- these handled outside of the stylesheet -->
    <xsl:template match="wmc:Coverage | wmc:FeatureType | wmc:Layer">
      <option>
        <xsl:attribute name="resourceType"><xsl:value-of select="wmc:Server/@service"/></xsl:attribute>
        <xsl:attribute name="value"><xsl:value-of select="wmc:Name"/></xsl:attribute>
        <b><xsl:value-of select="wmc:Server/@service"/></b> - <xsl:value-of select="wmc:Title"/>
      </option>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/SelectProcess.xsl
  
  Index: SelectProcess.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>

<!--
Description: parses an OGC context document to generate an array of DHTML layers.
Author:      adair
Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .

$Id$
$Name$
-->

<xsl:stylesheet version="1.0" 
    xmlns:wps="http://www.opengis.net/wps"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
		xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:ows="http://www.opengis.net/ows"
		xmlns:gml="http://www.opengis.net/gml"
    xmlns:xlink="http://www.w3.org/1999/xlink">

  <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>

  <!-- The coordinates of the DHTML Layer on the HTML page -->
  <xsl:param name="modelId"/>
  <xsl:param name="modelUrl"/>
  <xsl:param name="widgetId"/>
  
  <!-- template rule matching source root element -->
  <xsl:template match="/wps:Capabilities">
    <div>
      <p class="section">
        <xsl:value-of select="ows:ServiceIdentification/ows:Titl
 e"/>
      </p>
      <p style="text-align:right;font:70%;margin:0"><a href="{$modelUrl}" target="modelXML">capabilities document</a></p>
      <p>
        Abstract: <xsl:value-of select="ows:ServiceIdentification/ows:Abstract"/>
        <br/>
        provided by: 
        <a>
          <xsl:attribute name="href">
            <xsl:value-of select="ows:ServiceProvider/ows:ServiceContact/ows:ContactInfo/ows:OnlineResource/@xlink:href"/>
          </xsl:attribute>
          <xsl:value-of select="ows:ServiceProvider/ows:ProviderName"/>
        </a>
      </p>
      <dl>
        <xsl:apply-templates select="wps:ProcessOfferings/wps:Process"/>
      </dl>
    </div>
  </xsl:template>

  <!-- template rule matching source root element -->
  <xsl:template match="wps:Process">
    <xsl:variable name="name"><xsl:value-of select="wps:Name"/></xsl:variable>
    <dt>
      <a href="javascript:config.objects.{$modelId}.setParam('wps_DescribeProcess','{$name}')">
        <xsl:value-of sele
 ct="$name"/>
      </a>
    </dt>
    <dd>
      <xsl:value-of select="wps:Description"/>
    </dd>
  </xsl:template>

  <xsl:template match="text()|@*"/>

</xsl:stylesheet>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ShowProcessResult.js
  
  Index: ShowProcessResult.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display the AOI box coordinates in a form.
   *
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function ShowProcessResult(widgetNode, model) {
    WidgetBaseXSL.apply(this, new Array(widgetNode, model));
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/ShowProcessResult.xsl
  
  Index: ShowProcessResult.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>

<!--
Description: parses an OGC context document to generate an array of DHTML layers.
Author:      adair
Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .

$Id$
$Name$
-->

<xsl:stylesheet version="1.0" 
    xmlns:wps="http://www.opengis.net/wps"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
		xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:ows="http://www.opengis.net/ows"
		xmlns:gml="http://www.opengis.net/gml"
    xmlns:xlink="http://www.w3.org/1999/xlink">

  <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>

  <!-- The coordinates of the DHTML Layer on the HTML page -->
  <xsl:param name="modelId"/>
  <xsl:param name="modelUrl"/>
  <xsl:param name="widgetId"/>
  <xsl:param name="toolId"/>
  
  <!-- template rule matching source root element -->
  <xsl:template match="/">
    <div>
    <p style="text-align:right;font:70%;margin:0"><a href="{$modelUrl}" targe
 t="modelXML">ExecuteProcess response</a></p>
    <xsl:apply-templates/>
    </div>
  </xsl:template>
    
  <xsl:template match="wps:ExecuteResponse">
    <xsl:param name="statusLocation"><xsl:value-of select="@statusLocation"/></xsl:param>
    Process results for <xsl:value-of select="wps:ProcessName"/>: 
    <xsl:apply-templates select="wps:Status">
      <xsl:with-param name="statusURL" select="$statusLocation"/>
    </xsl:apply-templates>
    
    <table cellspacing="0" border="1" width="100%">
      <tr>
        <th colspan="2" align="left">Outputs</th>
      </tr>
      <tr>
        <td>parameter</td>
        <td>value</td>
      </tr>
      <xsl:apply-templates select="wps:Output"/>
    </table>
    <table cellspacing="0" border="1" width="100%">
      <tr>
        <th colspan="2" align="left">Inputs</th>
      </tr>
      <tr>
        <td>parameter</td>
        <td>value</td>
      </tr>
      <xsl:apply-templates select="wps:Input"/>
    </table>
  </xsl:template>
 
  
  <xsl:template match="wps:Status[wps:ProcessSucceeded]">
    Succeeded.<br/>
  </xsl:template>

  <xsl:template match="wps:Status[wps:ProcessFailed]">
    Failed.<br/>
    Exception message:<xsl:value-of select="wps:ExceptionReport/ows:ExceptionText"/>
  </xsl:template>

  <xsl:template match="wps:Status[wps:ProcessAccepted]">
    <xsl:param name="statusURL"/>
    Accepted.<br/>
    <a href="javascript:loadExecuteResponse('{$statusURL}')">Check the status here</a> 
  </xsl:template>

  <xsl:template match="wps:Status[wps:ProcessStarted]">
    <xsl:param name="statusURL"/>
    Started.<br/>
    <a href="javascript:loadExecuteResponse('{$statusURL}')">Check the status here</a> 
  </xsl:template>

  <xsl:template match="wps:Input/wps:ParameterValue | wps:Output/wps:ParameterValue">
    <xsl:variable name="paramName"><xsl:value-of select="wps:Name"/></xsl:variable>
    <tr>
      <td>
        <dl class="params">
          <dt><xsl:value-of select="wps:Label"/></dt>
          
 <dd><xsl:value-of select="wps:Description"/></dd>
        </dl>
      </td>
      <td>
        <xsl:apply-templates select="wps:LiteralValue | wps:BoundingBox | wps:ComplexValue | wps:Reference">
          <xsl:with-param name="paramName" select="$paramName"/>
        </xsl:apply-templates>
      </td>
    </tr>
  </xsl:template>

  <xsl:template match="wps:LiteralValue">
    <xsl:param name="paramName"/>
    <span>type: <xsl:value-of select="@ows:type"/></span>
    <br/>
    <xsl:value-of select="$paramName"/>=<xsl:value-of select="."/>
  </xsl:template>
  
  <xsl:template match="wps:Reference">
    <xsl:param name="paramName"/>
    <xsl:variable name="outputUrl" select="@xlink:href"/>
    <a href="{$outputUrl}"><xsl:value-of select="$paramName"/></a>
    <br/>
    <span>format: <xsl:value-of select="ows:Format"/></span>
  </xsl:template>
  
  <xsl:template match="wps:BoundingBox">
    <xsl:param name="paramName"/>
    <xsl:value-of select="$paramName"/> set to:<br/>
    lo
 wer corner: <xsl:value-of select="ows:LowerCorner"/><br/>
    upper corner: <xsl:value-of select="ows:UpperCorner"/><br/>
    CRS: <xsl:value-of select="@crs"/>
  </xsl:template>

  <xsl:template match="wps:ComplexValue">
    <xsl:param name="paramName"/>
    No XSL template yet.
  </xsl:template>
  
  <xsl:template match="text()|@*"/>

</xsl:stylesheet>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/eastOntBirds.xml
  
  Index: eastOntBirds.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  
  <OWSContext version="0.0.13"
  
      id="ows-context-tie"
  
      xmlns="http://www.opengis.net/context"
  
      xmlns:xlink="http://www.w3.org/1999/xlink"
  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  
      xmlns:sld="http://www.opengis.net/sld"
  
      xmlns:ogc="http://www.opengis.net/ogc"
  
      xmlns:ows="http://www.opengis.net/ows"
  
      xmlns:param="http;//www.opengis.net/param"
  
      xsi:schemaLocation="http://www.opengis.net/oc oc_0_0_13.xsd">
  
    <General>
  
      <Window width="400" height="337"/>
  
      <ows:BoundingBox crs="EPSG:42304">
  
        <ows:LowerCorner>1304462.08383873 -318095.60707587446</ows:LowerCorner>
  
        <ows:UpperCorner>1670675.6143887795 -9560.70758745767</ows:UpperCorner>
  
      </ows:BoundingBox>
  
      <Title>Eastern Ontario Bird data</Title>
  
      <KeywordList>
  
        <Keyword>bird</Keyword>
  
        <Keyword>Ontario</Keyword>
  
      </KeywordList>
  
      <Abstract>This is a map aggregating bird related data.</Abstract>
  
      <DescriptionURL format="text/html">
  
        <OnlineResource xlink:type="simple" xlink:href="http://www.opengis.org/press/?page=pressrelease&amp;view=20040525_ContextIE_PR"/>
  
      </DescriptionURL>
  
      <ows:ServiceProvider>
  
      <ows:ProviderName>Natural Resources Canada</ows:ProviderName>
  
      <ows:ProviderSite xlink:type="simple" xlink:href="http://geodiscover.cgdi.ca/"/>
  
      <ows:ServiceContact>
  
        <ows:IndividualName>Mike Adair</ows:IndividualName>
  
        <ows:PositionName>Systems Scientist</ows:PositionName>
  
        <ows:ContactInfo>
  
          <ows:Phone>
  
            <ows:Voice>+01-613-947-1342</ows:Voice>
  
            <ows:Facsimile>+01-613-947-2410</ows:Facsimile>
  
          </ows:Phone>
  
          <ows:Address>
  
            <ows:DeliveryPoint>650-615 Booth St.</ows:DeliveryPoint>
  
            <ows:City>Ottawa</ows:City>
  
            <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
  
            <ows:PostalCode>K1A0E9</ows:PostalCode>
  
            <ows:Country>Canada</ows:Country>
  
            <ows:ElectronicMailAddress>mike.adair at nrcan.gc.ca</ows:ElectronicMailAddress>
  
          </ows:Address>
  
          <ows:OnlineResource xlink:type="simple" xlink:href="http://www.ec.gc.ca/"/>
  
          <ows:HoursOfService>0700h - 1500h (EST), Monday - Friday</ows:HoursOfService>
  
          <ows:ContactInstructions>Just call or email</ows:ContactInstructions>
  
        </ows:ContactInfo>
  
        <ows:Role>Systems Scientist</ows:Role>
  
      </ows:ServiceContact>
  
    </ows:ServiceProvider>
  
    </General>
  
    <ResourceList>
  
  		<Layer queryable="1" hidden="0">
  
  			<Server service="OGC:WMS" version="1.1.1" title="Canada Centre for Remote Sensing Web Map Service">
  
  				<OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi"/>
  
  			</Server>
  
  			<Name>L7O_B743:CEOWARE2</Name>
  
  			<Title>Landsat 7 Orthorectified Imagery over Canada - band 743</Title>
  
  			<Abstract>The orthoimage data set is created with the most accurate control data available at the time of creation. The imagery has been corrected with either provincial and aerial triangulation data or, if not available, the most accurate NTDB data. The objective is to obtain accuracy of 30 metres or better in the South and 50 metres or better in the North for a 90% level of confidence. The accuracy is evaluated for each orthoimage dataset. The control data, which has been extracted from sources as mentioned above, can consist of road intersection vector data or lake/island centroids. In some cases the intersection of the centre line of surficial river may have been used. The control points are distributed homogeneously within the image in specific sectors. Sectors are located in the surround of the image, in the lowest and highest elevation area of the image, and in all other areas in which overlapping image base sectors are located.</Abstract>
  
  			<DataURL format="text/html">
  
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/download/landsat_7/ortho/"/>
  
  			</DataURL>
  
  			<MetadataURL format="text/html">
  
  				<OnlineResource xlink:type="simple" xlink:href="http://geogratis.cgdi.gc.ca/clf/en?action=entrySummary&amp;entryId=1583&amp;entryType=productCollection&amp;context=&amp;keymap=outlineCanada"/>
  
  			</MetadataURL>
  
  			<FormatList><Format current="1">image/png</Format></FormatList>
  
  			<StyleList>
  
  				<Style current="1">
  
  					<Name>default</Name>
  
  					<Title>default</Title>
  
  					<LegendURL width="16" height="16" format="image/gif">
  
  						<OnlineResource xlink:type="simple" xlink:href="http://ceoware2.ccrs.nrcan.gc.ca/cubewerx/cubeserv/cubeserv.cgi?VERSION=1.1.1&amp;REQUEST=GetLegendGraphic&amp;LAYER=L7O_B743%3ACEOWARE2&amp;FORMAT=image%2Fgif"/>
  
  					</LegendURL>    
  
  				</Style>
  
  			</StyleList>
  
  		</Layer>
  
      <Layer queryable="0" hidden="0">
  
        <Server service="wms" version="1.1.0" title="Atlas of Canada WMS">
  
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca:80/cgi-bin/atlaswms_en?"/>
  
        </Server>
  
        <Name>wa_2m</Name>
  
        <Title>Water areas (1:2 000 000)</Title>
  
        <Abstract>The surface area of oceans, lakes and large rivers intended for display at the scale of 1:2 000 000.</Abstract>
  
  			<FormatList><Format current="1">image/gif</Format></FormatList>
  
      </Layer>
  
      <Layer queryable="0" hidden="0">
  
        <Server service="wms" version="1.1.0" title="Atlas of Canada WMS">
  
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca:80/cgi-bin/atlaswms_en?"/>
  
        </Server>
  
        <Name>drain_2m</Name>
  
        <Title>Drainage (1:2 000 000)</Title>
  
        <Abstract>Coastline, rivers and lake shorelines intended for display at 1:2 000 000.</Abstract>
  
  			<FormatList><Format current="1">image/gif</Format></FormatList>
  
      </Layer>
  
      <Coverage hidden="0">
  
        <Server service="OGC:WCS" version="1.0.0" title="Boston Indexed Geotiff imagery">
  
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicwcs/coverage/BOSTONPOOL"/>
  
        </Server>
  
        <Name>MOD_Grid_L2g_2d</Name>
  
        <Title>MOD_Grid_L2g_2d Coverage Offering</Title>
  
        <Abstract>MOD_Grid_L2g_2d Coverage Offering, MOD09GHK data</Abstract>
  
        <MetadataURL format="text/xml">
  
          <OnlineResource xlink:type="simple" xlink:href="http://webservices.ionicsoft.com/ionicwcs/coverage/BOSTONPOOL/REQUEST/getdir/DIR/metadata/DATA/LPR/BOSTONPOOL/MOD_Grid_L2g_2d.xml"/>
  
        </MetadataURL>
  
        <SRS>EPSG:4326</SRS>
  
        <FormatList>
  
          <Format current="1">GeoTIFF</Format>
  
        </FormatList>
  
        <DimensionList>
  
          <Dimension name="time" units="ISO8601">2003-12-01T14:55:00Z/2003-12-03T20:50:00Z</Dimension>
  
        </DimensionList>
  
        <ParameterList>
  
          <Parameter>
  
            <param:kvp name="band" value="band1"/>
  
          </Parameter>
  
          <Parameter>
  
            <param:kvp name="interpolation" value="nearest neighbor"/>
  
          </Parameter>
  
        </ParameterList>
  
      </Coverage>
  
      <FeatureType hidden="0">
  
        <Server service="OGC:GML" version="2.1.2" title="NTS Lookup Service">
  
          <OnlineResource xlink:type="simple" xlink:href="http://geoservices.cgdi.ca/NTS/NTSLookup?request=GetMapsheet&amp;version=1.1.2&amp;mapsheet=31g"/>
  
        </Server>
  
        <Name>NTSLoookup</Name>
  
        <Title>Mapsheet 31G</Title>
  
        <Abstract>NTS map outline for mapsheet 31G</Abstract>
  
        <SRS>EPSG:4326</SRS>
  
      </FeatureType>
  
      <FeatureType hidden="0">
  
        <Server service="OGC:WFS" version="1.0.0" title="Bird Studies Canada">
  
          <OnlineResource method="GET" xlink:type="simple" xlink:href="http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?"/>
  
        </Server>
  
        <Name>BBS_PT</Name>
  
        <Title>Breeding Bird Survey Route Start Points</Title>
  
        <Abstract/>
  
        <Geometry>gml:PointProperty</Geometry>
  
        <SRS>EPSG:4326</SRS>
  
      </FeatureType>
  
    </ResourceList>
  
  </OWSContext>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/index.html
  
  Index: index.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
    <head>
      <title>Mapbuilder WPS Interoperability Experiment Client</title>
      <link rel='StyleSheet' type='text/css' href='/mapbuilder/lib/skin/default/docsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='/mapbuilder/lib/skin/default/mapStyle.css'>
      <link rel='StyleSheet' type='text/css' href='wpsStyle.css'>
      <link rel='StyleSheet' type='text/css' href='tabList.css'>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='wpsDemoConfig.xml';
        var selectedTabIndex = null;
  
        function loadProcess(capsUrl, contextUrl) {
          config.loadModel('wpsCapTemplate',capsUrl);
          if (contextUrl) config.loadModel('mainMap', contextUrl);
          //config.objects.mainTabs.selectTab(config.objects.selectProcess);
        }
        function loadProcessDescription(capsUrl) {
          config.loadModel('describeProcessTemplate',capsUrl);
          //config.objects.mainTabs.selectTab(config.objects.argsInput);
        }
        function loadExecuteResponse(capsUrl) {
          config.loadModel('executeProcessTemplate',capsUrl);
          //config.objects.mainTabs.selectTab(config.objects.results);
        }
      </script>
      <script type="text/javascript" src="/mapbuilder/lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <table style="width:800">
        <tr>
          <td style="width:200">
            <div>
              <div id="locatorMap"/>
            </div>
          </td>
          <td style="width:600">
            <h1>Mapbuilder WPS Client</h1>
            <p>A generic client to demonstrate Web Processing Services (WPS) from
            the OGC Interoperability Experiment.  (This works best in Firefox for now.)
            </p>
          </td>
        </tr>
        <tr>
          <td valign="top" style="padding:8px">
            <ul>
              Sample v0.2.4 documents
              <li>
              <a href="javascript:loadProcess('PCIwpsCaps.xml');">
              Capabilities doc</a>
              </li>
              <li>
              <a href="javascript:loadProcessDescription('DescribeProcess_MinValue.xml')">
              Describe Process response</a>
              </li>
              <li>
              <a href="javascript:loadExecuteResponse('PCIwpsExecuteResponse.xml')">
              Execute Process response</a>
              </li>
            </ul>
            <ul>
              Web processing services
              <li>
              <a href="javascript:loadProcess('http://gws2.pcigeomatics.com/wps/wps?service=WPS&acceptversions=0.2.4&request=GetCapabilities')">
              PCI Reprojection service (PCI)</a>
              </li>
              <li>
              <a href="javascript:loadProcess('http://geotech.lih.rwth-aachen.de/wps/wps?request=GetCapabilities&version=0.2.4&service=wps')">
              Intersection of GML themes (Aachen U.)</a>
              </li>
              <li>
              <a href="javascript:loadProcess('http://triangulum.uni-muenster.de:80/SCS/SCS?service=WPS&version=0.2.4&request=GetCapabilities','IFGITemp.xml')">
              Statistical Calculation Service (IFGI)</a>
              </li>
              <li>
              <a href="javascript:loadProcess('http://wms1.agr.gc.ca/GeoPS/gdas_GeoPS.php?request=GetCapabilities&service=WPS')">
              GDAS XML Stream Based Geoprocessing Service (AAFC)</a>
              </li>
              <li>
              <a href="javascript:loadProcess('http://ngistc1.agr.gc.ca/geoproc2/servlet/SpatialOperation?SERVICE=WPS&REQUEST=GetCapabilities')">
              Spatial Operation (AAFC)</a>
              </li>
              <li>
              <a href="javascript:loadProcess('http://ngistc1.agr.gc.ca/geoproc2/servlet/FeatureDataFormatConversion?&request=GetCapabilities&service=WPS')">
              Feature Data Format Conversion (AAFC)</a>
              </li>
              <li>
              <a href="javascript:loadProcess('http://ngistc1.agr.gc.ca/geoproc2/servlet/FeatureLocator?SERVICE=WPS&REQUEST=GetCapabilities')">
              ESRI Shapefile Feature Locator (AAFC)</a>
              </li>
            </ul>
            <ul>
              Web processing clients
              <li>
              <a href="http://wms1.agr.gc.ca/GeoPS/gdas_GeoPS_4_client.php">
              AAFC GDAS Based GeoPS Client</a>
              </li>
              <li>
              <a href="http://ngistc1.agr.gc.ca/geoproc2/index.jsp">
              AAFC client</a>
              </li>
              <li>
              <a href="http://gws2.pcigeomatics.com/wps/">
              PCI examples page</a>
              </li>
              <li>
              <a href="http://itrim4.demo.galdosinc.com/client/clientservlet">
              Galdos client</a>
              </li>
              <li>
              <a href="http://geotech.lih.rwth-aachen.de/wpsclient/">
              RWTH Aachen University/Wupperverband</a>
              </li>
            </ul>
            <ul>
              <li>
              <a href="http://portal.opengeospatial.org/wiki/twiki/bin/view/WPSie/WpsOverview">
              About the WPS IE</a>
              </li>
              <li>
              <a href="http://www.opengeospatial.org/press/?page=pressrelease&year=0&prid=211">
              OGC Press Release</a>
              </li>
              <li>
              <a href="../index.html">
              other mapbuilder demos</a>
              </li>
            </ul>
          </td>
          <td valign="top">
            <table width="100%">
              <tr>
                <td align="left">
                  <h2 id="mapTitle"></h2>
                </td>
              </tr>
              <tr>
                <td align="center">
                  <table>
                    <tr>
                      <td colspan="2">
                        <div id="mainMapPane"/>
                        <div id="loading">
                          <p>Loading Program<br/>
                          <img src="../../lib/skin/default/images/Loading.gif"/>
                          </p>
                        </div>
                      </td>
                    </tr>
                    <tr>
                      <td align="left">
                        <div id="mainButtonBar"/>
                      </td>
                      <td align="right" id="cursorTrack" />
                    </tr>
                  </table>
                </td>
              </tr>
              <!--tr>
                <td align="left" id="dataSelector">
                </td>
              </tr-->
              <tr>
                <td align="left" id="mainTabs">
                </td>
              </tr>
              <tr>
                <td id="workspace" align="left">
                </td>
              </tr>
            </table>
          </td>
        </tr>
  
      </table>
  
      <table class="footer">
        <tr>
          <td><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</td>
          <td width="60"><img src="/mapbuilder/lib/skin/default/images/Icon.gif"/></td>
        </tr>
      </table>
  
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/tabList.css
  
  Index: tabList.css
  ===================================================================
  ul.tablist
  
  {
  
     padding: 3px 0;
  
     width: 540;
  
     margin-top: 10px;
  
  }
  
  
  
  ul.tablist li
  
  {
  
     list-style: none;
  
     display: inline;
  
     margin: 0;
  
  }
  
  
  
  ul.tablist li a
  
  {
  
     text-decoration: none;
  
     padding: 3px 0.5em;
  
     margin-right: 3px;
  
     border: 1px solid #778;
  
     border-bottom: none;
  
     background: #6699CC;
  
     color: #FFF;
  
     font-weight: bold;
  
  }
  
  
  
  ul.tablist li a:hover/*, li a:focus*/
  
  {  
  
     background: #003466;
  
  }
  
  
  
  ul.tablist li a.current
  
  {
  
     background: #003466;
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/wpsCapabilities.xml
  
  Index: wpsCapabilities.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <Capabilities 
  
  xmlns="http://www.opengis.net/wps" 
  
  xmlns:ows="http://www.opengis.net/ows" 
  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  
  xmlns:xlink="http://www.w3.org/1999/xlink" 
  
  xsi:schemaLocation="http://www.opengis.net/wps file:///C:/Docume~1/adair/MYDOCU~1/wpsIE/schemas/0.2.4/wpsGetCapabilities.xsd"
  
  version="0.2.4">
  
  	<ows:ServiceIdentification>
  
  		<ows:ServiceType>OGC:WPS</ows:ServiceType>
  
  		<ows:ServiceTypeVersion>0.2.1</ows:ServiceTypeVersion>
  
  		<ows:Title>PCI Remote Sensing Calculations</ows:Title>
  
  		<ows:Abstract>Image processing tasks to be defined (Coordinate Transformation, filtering, classification,etc…)</ows:Abstract>
  
  		<ows:Keywords>
  
  			<ows:Keyword>PACE</ows:Keyword>
  
  		</ows:Keywords>
  
  		<ows:Fees>NONE</ows:Fees>
  
  		<ows:AccessConstraints>NONE</ows:AccessConstraints>
  
  	</ows:ServiceIdentification>
  
  	<ows:ServiceProvider>
  
  		<ows:ProviderName>PCI</ows:ProviderName>
  
  		<ows:ProviderSite xlink:type="simple" xlink:href="http://www.pcigeomatics.com/"/>
  
  		<ows:ServiceContact>
  
  			<ows:IndividualName>Steve Keens</ows:IndividualName>
  
  			<ows:PositionName>Systems Scientist</ows:PositionName>
  
  			<ows:ContactInfo>
  
  				<ows:Phone>
  
  					<ows:Voice>+01-905-336-4409</ows:Voice>
  
  					<ows:Facsimile>+01-905-336-4499</ows:Facsimile>
  
  				</ows:Phone>
  
  				<ows:Address>
  
  					<ows:DeliveryPoint>867 Lakeshore Road</ows:DeliveryPoint>
  
  					<ows:City>Burlington</ows:City>
  
  					<ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
  
  					<ows:PostalCode>L7R4A6</ows:PostalCode>
  
  					<ows:Country>Canada</ows:Country>
  
  					<ows:ElectronicMailAddress>tom.kralidis at ec.gc.ca</ows:ElectronicMailAddress>
  
  				</ows:Address>
  
  				<ows:OnlineResource xlink:type="simple" xlink:href="http://www.pcigeomatics.com/"/>
  
  				<ows:HoursOfService>0700h - 1500h (EST), Monday - Friday</ows:HoursOfService>
  
  				<ows:ContactInstructions>Just call or email</ows:ContactInstructions>
  
  			</ows:ContactInfo>
  
  			<ows:Role>Systems Scientist</ows:Role>
  
  		</ows:ServiceContact>
  
  	</ows:ServiceProvider>
  
  	<ows:OperationsMetadata>
  
  		<ows:Operation name="GetCapabilities">
  
  			<ows:DCP>
  
  				<ows:HTTP>
  
  					<ows:Get xlink:href="http://gws2.pcigeomatics.com/wps/wps?"/>
  
  				</ows:HTTP>
  
  			</ows:DCP>
  
  		</ows:Operation>
  
  		<ows:Operation name="DescribeProcess">
  
  			<ows:DCP>
  
  				<ows:HTTP>
  
  					<ows:Get xlink:href="http://gws2.pcigeomatics.com/wps/wps?"/>
  
  					<ows:Post xlink:href="http://gws2.pcigeomatics.com/wps/wps?"/>
  
  				</ows:HTTP>
  
  			</ows:DCP>
  
  		</ows:Operation>
  
  		<ows:Operation name="Execute">
  
  			<ows:DCP>
  
  				<ows:HTTP>
  
  					<ows:Get xlink:href="http://gws2.pcigeomatics.com/wps/wps?"/>
  
  				</ows:HTTP>
  
  			</ows:DCP>
  
  		</ows:Operation>
  
  	</ows:OperationsMetadata>
  
  	<ProcessOfferings>
  
  		<Process>
  
  			<Name>FIMPORT</Name>
  
  			<Description>
  
          Transfers all the image, and auxiliary information from a source file to a newly created PCIDSK file. All GDB supported file types may be imported.
  
        </Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>FIMPORT</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>SATMODEL</Name>
  
  			<Description>Calculate the model (SATMODEL).</Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>SATMODEL</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>REGPRO</Name>
  
  			<Description>
  
          Performs image registration of an input image to an output image.
  
        </Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>REGPRO</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>ORTHO</Name>
  
  			<Description>Ortho correct the file (ORTHO).</Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>ORTHO</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>FEXPORT</Name>
  
  			<Description>
  
          Transfers all the requested image, and auxiliary information from a source file to an output file. Only some supported GDB formats may be exported to.
  
        </Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>FEXPORT</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  		<Process>
  
  			<Name>CDSPOT5</Name>
  
  			<Description>CD SPOT 5 imports SPOT 5 data into pix.</Description>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>CDSPOT5</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>PACE</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  		</Process>
  
  	</ProcessOfferings>
  
  </Capabilities>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/wpsDemoConfig.xml
  
  Index: wpsDemoConfig.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="WFSDemoConfig" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
  	<!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
  	<models>
  		<OwsContext id="mainMap">
  			<!--defaultModelUrl>../owsContext/cite.xml</defaultModelUrl-->
  			<defaultModelUrl>../owsContext/oc_0_0_13r1.xml</defaultModelUrl>
  			<defaultModelUrl>../owsContext/oc_0_0_13r1.xml</defaultModelUrl>
  			<models>
  				<FeatureCollection id="gml2FeatureTemplate">
  					<method>get</method>
  					<widgets>
  						<!--ModelStatus id="gmlModelStatus"/-->
  						<GmlRendererWZ id="testGmlRenderer">
  							<htmlTagId>mainMapPane</htmlTagId>
  							<mapContainerId>mainMapContainer</mapContainerId>
  							<lineColor>#FF00FF</lineColor>
  							<lineWidth>2</lineWidth>
  							<pointDiameter>10</pointDiameter>
  						</GmlRendererWZ>
  					</widgets>
  				</FeatureCollection>
  				<Model id="coverageTemplate">
  					<method>get</method>
  				</Model>
  			</models>
  			<widgets>
  				<MapPane id="mainMapWidget">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/owsMapPane.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<loadHidden>false</loadHidden>
  				</MapPane>
  				<Loading id="loading"/>
  				<CursorTrack id="cursorTrack">
  					<mouseHandler>mainMap</mouseHandler>
  				</CursorTrack>
  				<AoiBoxDHTML id="aoiBox2">
  					<htmlTagId>mainMapPane</htmlTagId>
  					<stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
  					<mapContainerId>mainMapContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  				<ResourceDropDown id="dataSelector0">
  					<targetModel>describeProcessTemplate</targetModel>
  					<stylesheet>ResourceDropDown.xsl</stylesheet>
  					<scriptFile>ResourceDropDown.js</scriptFile>
  				</ResourceDropDown>
  				<ResourceDropDown id="dataSelector1">
  					<targetModel>describeProcessTemplate</targetModel>
  					<stylesheet>ResourceDropDown.xsl</stylesheet>
  					<scriptFile>ResourceDropDown.js</scriptFile>
  				</ResourceDropDown>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="mainAoi"/>
  				<DragPanHandler id="mainDragPan">
  					<enabled>false</enabled>
  				</DragPanHandler>
  				<WebServiceRequest id="wfsController">
  					<targetModel>gml2FeatureTemplate</targetModel>
  					<requestName>wfs:GetFeature</requestName>
  				</WebServiceRequest>
  				<WebServiceRequest id="wcsController">
  					<targetModel>gml2FeatureTemplate</targetModel>
  					<requestName>wcs:GetCoverage</requestName>
  				</WebServiceRequest>
  			</tools>
  			<nodeSelectXpath>/wmc:OWSContext/wmc:ResourceList</nodeSelectXpath>
  		</OwsContext>
  		<Context id="locator">
  			<defaultModelUrl>../data/context/locatorMap.xml</defaultModelUrl>
  			<widgets>
  				<MapPane id="locatorWidget">
  					<htmlTagId>locatorMap</htmlTagId>
  					<targetModel>mainMap</targetModel>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<fixedWidth>180</fixedWidth>
  				</MapPane>
  				<AoiBoxDHTML id="aoiBox3">
  					<htmlTagId>locatorMap</htmlTagId>
  					<mapContainerId>locatorContainer</mapContainerId>
  					<lineColor>#FF0000</lineColor>
  					<lineWidth>1</lineWidth>
  					<crossSize>15</crossSize>
  				</AoiBoxDHTML>
  			</widgets>
  			<tools>
  				<AoiMouseHandler id="locatorAoi"/>
  				<ZoomToAoi id="locatorZoomToAoi">
  					<targetModel>mainMap</targetModel>
  				</ZoomToAoi>
  			</tools>
  		</Context>
  		<!-- use this with a WPS capabilities model -->
  		<WpsCapabilities id="wpsCapTemplate">
  			<!--defaultModelUrl>PCIwpsCaps.xml</defaultModelUrl-->
  			<models>
  				<WpsDescribeProcess id="describeProcessTemplate">
  					<!--defaultModelUrl>DescribeProcess_MinValue.xml</defaultModelUrl-->
  					<widgets>
  						<ProcessArgumentsForm id="argsInput">
  							<targetModel>executeProcessTemplate</targetModel>
  							<stylesheet>ProcessArgumentsForm.xsl</stylesheet>
  							<scriptFile>ProcessArgumentsForm.js</scriptFile>
  							<mapModel>mainMap</mapModel>
  						</ProcessArgumentsForm>
  					</widgets>
  					<tools>
  						<WebServiceRequest id="wpsExecuteProcess">
  							<targetModel>executeProcessTemplate</targetModel>
  							<requestName>wps:Execute</requestName>
  						</WebServiceRequest>
  					</tools>
  					<namespace>xmlns:wps='http://www.opengis.net/wps'</namespace>
  					<nodeSelectXpath>/wps:ProcessDescription/wps:ProcessMember/wps:Process</nodeSelectXpath>
  				</WpsDescribeProcess>
  				<Model id="executeProcessTemplate">
  					<widgets>
  						<ShowProcessResult id="results">
  							<stylesheet>ShowProcessResult.xsl</stylesheet>
  							<scriptFile>ShowProcessResult.js</scriptFile>
  						</ShowProcessResult>
  					</widgets>
  					<namespace>xmlns:wps='http://www.opengis.net/wps'</namespace>
  				</Model>
  			</models>
  			<widgets>
  				<Widget id="selectProcess">
  					<stylesheet>SelectProcess.xsl</stylesheet>
  				</Widget>
  			</widgets>
  			<tools>
  				<WebServiceRequest id="wpsDescribeProcess">
  					<targetModel>describeProcessTemplate</targetModel>
  					<requestName>wps:DescribeProcess</requestName>
  				</WebServiceRequest>
  			</tools>
  			<namespace>xmlns:wps='http://www.opengis.net/wps'</namespace>
  			<nodeSelectXpath>/wps:Capabilities/wps:ProcessOfferings/wps:Process</nodeSelectXpath>
  		</WpsCapabilities>
  	</models>
  	<widgets>
  		<TabbedContent id="mainTabs">
  			<htmlWorkspace>workspace</htmlWorkspace>
  			<tab>urlInput</tab>
  			<tab>selectProcess</tab>
  			<tab>argsInput</tab>
  			<tab>results</tab>
  			<!--tab>moreData</tab-->
  		</TabbedContent>
  		<ZoomIn id="zoomIn">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<selected>true</selected>
  			<enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
  			<disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
  		</ZoomIn>
  		<ZoomOut id="zoomOut">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
  			<disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
  		</ZoomOut>
  		<DragPan id="dragPan">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainDragPan</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/PanEnable.gif</enabledSrc>
  			<disabledSrc>/images/PanDisable.gif</disabledSrc>
  		</DragPan>
  		<SetAoi id="setAoi">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<mouseHandler>mainAoi</mouseHandler>
  			<class>RadioButton</class>
  			<enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
  			<disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
  		</SetAoi>
  		<Reset id="reset">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
  		</Reset>
  		<Save id="save">
  			<buttonBar>mainButtonBar</buttonBar>
  			<targetModel>mainMap</targetModel>
  			<class>Button</class>
  			<disabledSrc>/images/SaveDisable.gif</disabledSrc>
  			<popupWindowName>modelXML</popupWindowName>
  		</Save>
  		<ModelUrlInput id="urlInput">
  			<targetModel>wpsCapTemplate</targetModel>
  			<stylesheet>ModelUrlInput.xsl</stylesheet>
  		</ModelUrlInput>
  		<Widget id="moreData">
  			<targetModel>wpsCapTemplate</targetModel>
  			<stylesheet>ModelUrlInput.xsl</stylesheet>
  		</Widget>
  	</widgets>
  	<!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
  	<skinDir>/mapbuilder/lib/skin/default</skinDir>
  	<widgetTextUrl>/widgetText.xml</widgetTextUrl>
  	<!-- relative to the skin dir -->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/wpsDescribeProcess.xml
  
  Index: wpsDescribeProcess.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <ProcessDescription 
  
      xmlns="http://www.pengis.net/wps" 
  
      xmlns:ows="http://www.opengis.net/ows" 
  
      xmlns:xlink="http://www.w3.org/1999/xlink" 
  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  
      xsi:schemaLocation="http://www.opengis.net/wps file:///C:/Docume~1/adair/MYDOCU~1/wpsIE/schemas/0.2.4/wpsDescribeProcess.xsd" 
  
      version="0.2.4">
  
  	<ProcessMember>
  
  		<Process store="false">
  
  			<Name>minValue</Name>
  
  			<Label>Minimum value</Label>
  
  			<Description>Identifies the minimum value of a given grid coverage</Description>
  
  			<Version>0.2.3</Version>
  
  			<Application>
  
  				<ows:Keywords>
  
  					<ows:Keyword>Grid processing</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Application>
  
  			<Category>
  
  				<ows:Keywords>
  
  					<ows:Keyword>Statistics</ows:Keyword>
  
  				</ows:Keywords>
  
  			</Category>
  
  			<Input>
  
  				<Parameter>
  
  					<Name>inputGridCoverage</Name>
  
  					<Label>Input Grid Coverage</Label>
  
  					<Description>Coverage that will be processed. This can be a reference URI to a GeoTiff or a WCS request when returning a GeoTiff</Description>
  
  					<MinimumOccurs>1</MinimumOccurs>
  
  					<Datatype>
  
  						<Reference xlink:href="anyURI">
  
  							<ows:Format>image/GeoTiff</ows:Format>
  
  						</Reference>
  
  					</Datatype>
  
  				</Parameter>
  
  			</Input>
  
  			<Input>
  
  				<Parameter>
  
  					<Name>bbox</Name>
  
  					<Label>Bounding Box</Label>
  
  					<Description>bounding box to be processed</Description>
  
  					<MinimumOccurs>1</MinimumOccurs>
  
  					<Datatype>
  
  						<BoundingBox crs="EPSG:4326">
  
  							<ows:LowerCorner>-71.10285218349743 42.261800717452054</ows:LowerCorner>
  
  							<ows:UpperCorner>-71.04767081931412 42.29490953596204</ows:UpperCorner>
  
  						</BoundingBox>
  
  					</Datatype>
  
  				</Parameter>
  
  			</Input>
  
  			<Input>
  
  				<Parameter>
  
  					<Name>image</Name>
  
  					<Label>image of interest</Label>
  
  					<Description>number of image of interest, needed in case more than one image is encoded in a GeoTIFF: initial value is 1</Description>
  
  					<MinimumOccurs>0</MinimumOccurs>
  
  					<Datatype>
  
  						<LiteralValue ows:type="integer"/>
  
  					</Datatype>
  
  				</Parameter>
  
  			</Input>
  
  			<Input>
  
  				<Parameter>
  
  					<Name>band</Name>
  
  					<Label>band of interest</Label>
  
  					<Description>and for which the statistics shall be provided: initial value is 1</Description>
  
  					<MinimumOccurs>0</MinimumOccurs>
  
  					<Datatype>
  
  						<LiteralValue ows:type="integer">
  
  							<DefaultValue>1</DefaultValue>
  
  						</LiteralValue>
  
  					</Datatype>
  
  				</Parameter>
  
  			</Input>
  
  			<Input>
  
  				<Parameter>
  
  					<Name>valueToIgnore</Name>
  
  					<Label>Value to ignore</Label>
  
  					<Description>Some values might be known to not be the minimum value. They should be ignored in output statistics (e.g. 0 or -9999), Example: valueToIgnore = -9999</Description>
  
  					<MinimumOccurs>0</MinimumOccurs>
  
  					<Datatype>
  
  						<LiteralValue ows:type="decimal"/>
  
  					</Datatype>
  
  				</Parameter>
  
  			</Input>
  
  			<Output>
  
  				<Parameter>
  
  					<Name>minValueResult</Name>
  
  					<Datatype>
  
  						<LiteralValue ows:type="decimal"/>
  
  					</Datatype>
  
  				</Parameter>
  
  			</Output>
  
  		</Process>
  
  	</ProcessMember>
  
  </ProcessDescription>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/demo/wpsIE/wpsStyle.css
  
  Index: wpsStyle.css
  ===================================================================
  /*
  P { font-size: 100%;  }
  UL { border-bottom: 1pt solid #3366cc; padding-bottom: 6px;}
  */
  .section { font-size: 100%; margin: 0; font-weight: bold; }
  .params { font-size: 100%; }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/arrow.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/footer.html
  
  Index: footer.html
  ===================================================================
  <table class="footer">
    <tr>
      <td><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</td>
      <td width="60"><img src="/mapbuilder/lib/skin/default/images/Icon.gif"/></td>
    </tr>
  </table>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/intro.html
  
  Index: intro.html
  ===================================================================
  <h2>Introduction</h2>
  
  <p>
  Mapbuilder is an open source project that implements a framework
  dynamic web page content from XML documents.
  The techniques used by this package are now being called 
  <a href="http://www.adaptivepath.com/publications/essays/archives/000385.php">AJAX</a> 
  which is shorthand for Asynchronous JavaScript + XML.
  </p>
  
  <p>
  Mapbuilder consists of a JavaScript library that 
  implements the Model-View-Controller (MVC) design pattern.
  The model, view and controller objects to be used in the web page are configured
  in an XML configuration file.
  The schema of the configuration file is derived from RDF and is fully described 
  in the <a href="?page=config/config">mapbuilder configuration documentation</a>.
  </p>
  
  <p>
  This User Guide explains how to configure and link Mapbuilder components into a web page.
  Several different Mapbuilder configurations will be demonstrated along with some
  ideas for how to include it in the web page layout.
  The target audience for this tutorial is those tasked with implementing an 
  application in HTML and have a basic understanding of HTML, XML and Javascript.
  Developer's seeking to extend or modify the code-base should consult 
  the mapbuilder <a href="?page=reference#mapbuilder">design documentation.</a> 
  </p>
  
  <p>
  One design goal of mapbuilder is to let page designers do page layout
  and design, and simply link in mapbuilder JavaScript code using HTML element IDs. 
  Being a JavaScript implementation, CSS and DHTML techniques are then used for
  manipulating these elements.
  </p>
  
  <p>
  Mapbuilder was originally conceived to render 
  <a href="?page=reference#ogc">Web Map Context documents</a> 
  to create interactive mapping applications on the web.
  However the modular design framework
  allows mapbuilder to be extended to handle almost any XML document type.
  </p>
  
  <p>
  The tutorial starts with the common steps required to code a mapbuilder
  application.
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/mapSources.html
  
  Index: mapSources.html
  ===================================================================
   
  <h2>Sources for maps</h2>
  
  <p>
  All maps used in mapbuilder are from OGC 
  <a href="?page=reference#ogc">Web Map Context documents.</a>
  A context document provides an interoperable way of storing and sharing 
  maps created using the various OGC web service specfications
  </p>
  
  <p>
  Sources for these maps:
  <ul>
    <li><span class="title">Create your own:</span>
    Use a text or XML editor to add and delete layers to an existing or new 
    context document. 
    This method is tedious and difficutl but can be used for simple changes.
    </li>
    <li><span class="title">owsview:</span>
    Currently, the best application for creating a context document is 
    <a href="http://cgdi-dev.geoconnections.org/prototypes/owsview/index.html" target="GetContext">owsview.</a>
    Functions include adding layers by browsing WMS capabilities doc and loading
    and saving context documents.
    </li>
    <li><span class="title">Search the GeoConnections Discovery Portal:</span>
    The Discovery Portal offers a 
    <a href="http://geodiscover.cgdi.ca/ceonetWeb/doc?dispatchServlet=/biz&servletName=bizServlet&service=searchForWebServiceData" target="GetContext">
    web service search</a> function which will 
    dynamically generate a context document based on search parameters.
    The limitiations of this method are that it depends on the web service
    providing good metadata in the capabilities document and a slow response of the 
    search engine.
    Look for improvments to this service as new registry technology is implemented.
    </li>
  </ul>
  </p>
  
  <p>
  If you know of any other map sources, please 
  <a href="mailto:mapbuilder-devel at lists.sourceforge.net">let us know.</a>
  </p>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/reference.html
  
  Index: reference.html
  ===================================================================
  <h2>References and useful links</h2>
  
  <ul>
    <a name="mapbuilder"></a>
  Mapbuilder links
    <li><a href="http://mapbuilder.sourceforge.net/">Mapbuilder Home page</a></li>  
    <li><a href="http://mapbuilder.sourceforge.net/docs/design/mapbuilder.html">Mapbuilder design documentation</a></li>  
    <li><a href="http://mapbuilder.sourceforge.net/docs/jsdoc/index.html">Mapbuilder JavaScript documentation</a></li>
    <li><a href="javascript:alert('full download instructions coming soon; in the meantime use CVS access')">Download Mapbuilder</a></li>
    <li><a href="mailto:mapbuilder-devel at lists.sourceforge.net">Mapbuilder mail list</a></li>
    <li><a href="http://java.sun.com/blueprints/patterns/MVC-detailed.html">Model-View-Controller design pattern</a></li>  
  </ul>
  
  <ul>
    <a name="ogc"></a>
    <a href="http://www.opengis.org">Open GIS Consortium</a> (OGC) specifications
    <li><a href="http://www.opengis.org/docs/03-036r2.pdf">Web Map Context document</a></li>  
    <li><a href="http://www.opengis.org/docs/01-068r2.pdf">Web Map Service (WMS)</a></li>  
    <li><a href="http://www.opengis.org/docs/02-058.pdf">Web Feature Service (WFS)</a></li>  
  </ul>
  
  
  <ul>
    <a name="html"></a>
    HTML and CSS
    <li><a href="http://www.w3.org/TR/CSS2/box.html">CSS box model</a></li>  
    <li><a href="http://www.w3.org/TR/CSS2/">CSS reference</a></li>  
    <li><a href="http://www.w3.org/TR/html401/">HTML reference</a></li>  
    <li><a href="http://www.w3.org/TR/xslt">XSLT reference</a></li>  
    <li><a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/Overview.html#contents">DOM reference</a></li>  
    <li><a href="http://devedge.netscape.com/viewsource/2003/xslt-js/">XSL programming in Mozilla</a></li>  
    <li><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmmscxmldomobjects.asp">XSL programming in IE</a></li>  
  </ul>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/sidebar.html
  
  Index: sidebar.html
  ===================================================================
  
  <DIV ID="sideBar">
  <BR />
  
  <table class="med">
  
    <tr>
      <td width="12"><img src="/mapbuilder/docs/arrow.gif"/></td>
      <td width="120" align="left" valign="top">
          <A HREF="?page=intro">Introduction</A><BR/>
      </td>
    </tr>
    <tr>
      <td width="12"><img src="/mapbuilder/docs/arrow.gif"/></td>
      <td width="120" align="left" valign="top">
          <A HREF="?page=start/start">Quick Start</A><BR/>
      </td>
    </tr>
    <tr>
      <td width="12" valign="top"><img src="/mapbuilder/docs/arrow.gif"/></td>
      <td width="120" align="left" valign="top">
          <A HREF="?page=samples/intro">Sample pages</A>
          <br/>&nbsp;<A HREF="?page=samples/tutorial1">Simple map</A>
          <br/>&nbsp;<A HREF="?page=samples/tutorial2">Multiple models</A>
          <br/>&nbsp;<A HREF="?page=samples/tutorial3">More widgets</A>
          <br/>&nbsp;<A HREF="?page=samples/tutorial4">Other models</A>
      </td>
    </tr>
    <tr>
      <td width="12" valign="top"><img src="/mapbuilder/docs/arrow.gif"/></td>
      <td width="120" align="left" valign="top">
        <UL class="sidebar">
          <a href="?page=config/config">Config file</a>
          <li><a href="?page=config/mvc">MVC design pattern</a></li>
          <li><a href="?page=config/opvRule">File structure</a></li>
          <li><a href="?page=config/patterns">Common properties</a></li>
          <li><a href="?page=config/skins">Skins and language</a></li>
          <li><a href="?page=config/listeners">Listeners</a></li>
          <li><a href="?page=config/extend">Extensions</a></li>
          <li><a href="docs/register">Component register</a></li>
        </UL>
      </td>
    </tr>
    <tr>
      <td width="12" valign="top"><img src="/mapbuilder/docs/arrow.gif"/></td>
      <td width="120" align="left" valign="top">
        <UL class="sidebar">
          <A HREF="?page=start/install">Install mapbuilder</A>
          <LI><A HREF="?page=start/tomcat">J2EE environment</A></LI>
          <LI><A HREF="?page=start/apache">Apache/PHP environment</A></LI>
          <LI><A HREF="?page=start/geoserver">GeoServer</A></LI>
          <LI><A HREF="?page=start/browsers">Browser support</A></LI>
          <LI><A HREF="?page=start/troubleshoot">Troubleshooting</A></LI>
        </UL>
      </td>
    </tr>
    <tr>
      <td width="12"><img src="/mapbuilder/docs/arrow.gif"/></td>
      <td width="120" align="left" valign="top">
          <A HREF="?page=mapSources">Map sources</A><BR/>
      </td>
    </tr>
    <tr>
      <td width="12"><img src="/mapbuilder/docs/arrow.gif"/></td>
      <td width="120" align="left" valign="top">
          <A HREF="?page=reference">References</A><BR/>
      </td>
    </tr>
  
  </table>
  
  <div id="dynSidebar" width="100%"></div>
  
  </DIV>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/userGuide.css
  
  Index: userGuide.css
  ===================================================================
  
  BODY { font-family: arial, helvetica, sans-serif; } 
  
  IMG { border-style: none; }
  
  P { font-size: 80%;  }
  
  /*
  TD { font: normal 100%; color:#000000; }
  UL { list-style: square; margin-bottom: 0%; line-height:1.3; }
  */
  
  UL { font-size: 80%; list-style: square; padding: 0 }
  OL { font-size: 80%; padding: 0 }
  UL LI { margin-left: 1em; }
  OL LI { margin-left: 1em; }
  
  UL.sidebar { font-size: 100%; list-style: none; padding: 0 }
  UL.sidebar LI { margin-left: 4px; }
  
  .title { font-weight: bold; }
  
  DL { font-size: 80%;  }
  DT { font-weight: bold; }
  
  PRE { background-color: silver; }
  LI PRE { font-size: 120%;  }
  
  A:active { color: #0000CC; }
  
  A:link { color: #0000CC; }
  
  A:visited { color: #336633; }
  
  A:hover { color: #FF0000; }
  
  A.banner { text-decoration: none; color: white; }
  
  INPUT.bareinput {
    border: 0px blue none;
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
    background-color: transparent;
  }
  
  
  .footer { 
    font-size: 80%;  
    color: #3366cc; 
    margin: 0; 
    margin-bottom: 10; 
    width: 100%; 
    border-top: 1pt solid #3366cc; 
    text-align: right
  }
  
  
  H1 { 
    font: normal 18pt;  
    color: #3366cc; 
    margin: 0; 
    margin-top: 10; 
    width: 100%; 
    border-bottom: 1pt solid #3366cc; 
    text-align: right}
  
  H2 {  font-size: 130%; font-weight: bold; padding-top: 10px;}
  
  H3 { font-size: 110%; font-weight: bold; }
  
  H4 { font-size: 100%; font-weight: bold; }
  
  H5 { font-size: 110%; font-weight: bold; }
  
  H6 { font-size: 100%; font-weight: bold; }
  
  .exsml { font-size: 70%; font-weight: normal; }
  
  .exsmlbld { font-size: 70%; font-weight: bold; }
  
  .sml { font-size: 70%; font-weight: normal; }
  
  .smlbld { font-size: 70%; font-weight: bold; }
  
  .med { font-size: 80%; font-weight: normal; }
  
  .medbld { font-size: 80%; font-weight: bold; }
  
  .medblditalic { font-size: 80%; font-weight: bold; font-style: italic; }
  
  .meditalic { font-size: 80%; font-style: italic; font-family: arial, helvetica, sans-serif;}
  
  .reg { font-size: 100%; font-weight: normal; }
  
  .regbld { font-size: 100%; font-weight: bold; }
  
  .lg { font-size: 110%; font-weight: normal; }
  
  .lgbld { font-size: 110%; font-weight: bold; }
  
  .exlg { font-size: 130%; font-weight: normal; }
  
  .exlgbld { font-size: 130%; font-weight: bold; }
  
  .lgbldt { font-size: 90%; font-weight: bold; font-family: tahoma, arial, helvetica, sans-serif; }
  
  .exlgbldt { font-size: 140%; font-weight: bold; font-family: tahoma, arial, helvetica, sans-serif; }
  
  .exlgbldblu { font-size: 170%; font-weight: bold; color:#3366CC; }
  
  
  
  @media print {
  
    @page         { margin: 10% }
  
    H1, H2, H3,
  
    H4, H5, H6    { page-break-after: avoid; page-break-inside: avoid }
  
    BLOCKQUOTE, 
  
    UL, OL, DL    { page-break-before: avoid }
  
  }
  
  
  
  
  
  
  
  @media speech {
  
  
  
    H1, H2, H3, 
  
  
  
    H4, H5, H6    { voice-family: paul, male; stress: 20; richness: 90 }
  
  
  
    H2            { pitch: x-low; pitch-range: 80 }
  
  
  
    H3            { pitch: low; pitch-range: 70 }
  
  
  
    H4            { pitch: medium; pitch-range: 60 }
  
  
  
    H5            { pitch: medium; pitch-range: 50 }
  
  
  
    H6            { pitch: medium; pitch-range: 40 }
  
  
  
    LI, DT, DD    { pitch: medium; richness: 60 }
  
  
  
    DT            { stress: 80 }
  
  
  
    STRONG        { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
  
  
  
    I             { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
  
  
  
    B             { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
  
  
  
    U             { richness: 0 }
  
  
  
    A:link        { voice-family: harry, male }
  
  
  
    A:visited     { voice-family: betty, female }
  
  
  
    A:active      { voice-family: betty, female; pitch-range: 80; pitch: x-high }
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/userGuideServlet.jsp
  
  Index: userGuideServlet.jsp
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  
  <%@ page contentType="text/html" %>
  <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
  <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  <html>
  
  <%
    String pageRequest = request.getParameter("page");
    if ( null == pageRequest ) pageRequest = "intro";
    request.setAttribute("page", pageRequest);
    request.setAttribute("mbConfigUrl", "/mapbuilder/docs/" + pageRequest + ".xml");
  %>
  
  <head>
  <title>Mapbuilder User Guide</title>
  <link rel='StyleSheet' type='text/css' href='/mapbuilder/docs/userGuide.css'>
  
  <%
    if ( pageRequest.startsWith("samples/tutorial") ) {
  %>
      <script>
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='<%= request.getAttribute("mbConfigUrl") %>';
        //var language="fr";
      </script>
      <script type="text/javascript" src="/mapbuilder/lib/Mapbuilder.js"></script>
  </head>
  <body onload='mbDoLoad()'>  
  <% } else { %>
  
  </head>
  <body>
  <% } %>
  
  <table width="800" border="0" cellspacing="0" cellpadding="0" summary="Table used for page layout">
  
    <tr>
      <td colspan="3">
          <h1>Mapbuilder User Guide</h1>
      </td>  
    </tr>
  
    <tr>
      <td width="160" valign="top">
        <c:import url="/docs/sidebar.html"/>
      </td>
  
      <td width="10"><img src="/mapbuilder/lib/skin/default/images/Spacer.gif"></td>  <!-- gutter -->
  
      <td width="630" valign="top">
        <a name="snav"></a>
  
        <div > 
  
          <c:set var="pageBody" value="/docs/${requestScope.page}.html"/>
  
          <c:if test="${fn:startsWith(requestScope.page, 'samples/tutorial')}">        
            <div style="width:100%; font-size:80%; text-align:right; margin:0">
              <a href='view-source:http://localhost:8080/mapbuilder/docs/<c:out value="${requestScope.page}"/>.html' target="HtmlSrcWin">view source</a> | <a href='<c:out value="${requestScope.mbConfigUrl}"/>' target="ConfigSrcWin">config file</a>
            </div>
          </c:if>
        </div>
  
        <c:import url="${pageBody}"/>
  
        <c:import url="/docs/footer.html"/>
  
      </td>
  
    </tr>
  </table>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/userGuideServletStatic.jsp
  
  Index: userGuideServletStatic.jsp
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  
  <%@ page contentType="text/html" %>
  <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
  <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  <html>
  
  <%
    String pageRequest = request.getParameter("page");
    if ( null == pageRequest ) pageRequest = "intro";
    request.setAttribute("page", pageRequest);
    request.setAttribute("mbConfigUrl", "/docs/" + pageRequest + ".xml");
  %>
  
  <head>
  <title>Mapbuilder User Guide</title>
  <link rel='StyleSheet' type='text/css' href='/mapbuilder/docs/userGuide.css'/>
  
  <c:if test="${fn:startsWith(param.page, 'samples/tutorial')}">
    <jsp:include page="/MapbuilderHead.jsp" flush="true"/>
  </c:if>
  
  </head>
  <body onload='mbDoLoad()'>  
  
  <table width="800" border="0" cellspacing="0" cellpadding="0" summary="Table used for page layout">
  
    <tr>
      <td colspan="3">
          <h1>Mapbuilder User Guide</h1>
      </td>  
    </tr>
  
    <tr>
      <td width="160" valign="top">
        <c:import url="/docs/sidebar.html"/>
      </td>
  
      <td width="10"><img src="/mapbuilder/lib/skin/default/images/Spacer.gif"></td>  <!-- gutter -->
  
      <td width="630" valign="top">
        <a name="snav"></a>
  
        <div > 
  
          <c:set var="pageBody" value="/docs/${requestScope.page}.html"/>
  
          <c:if test="${fn:startsWith(requestScope.page, 'samples/tutorial')}">        
            <div style="width:100%; font-size:80%; text-align:right; margin:0">
              <a href='view-source:<c:out value="${pageBody}"/>' target="HtmlSrcWin">view source</a> | <a href='<c:out value="${requestScope.pageConfig}"/>' target="ConfigSrcWin">config file</a>
            </div>
          </c:if>
        </div>
  
        <c:import url="${pageBody}"/>
  
        <c:import url="/docs/footer.html"/>
  
      </td>
  
    </tr>
  </table>
  
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/config/config.html
  
  Index: config.html
  ===================================================================
  <h2>Mapbuilder Configuration file</h2>
  
  <p>
  This document explains how to configure a mapbuilder application. 
  The mapbuilder configuration file controls what components are included
  in your application and how the components interact with each other.
  This guide is targeted at website builders who have a basic 
  understanding of HTML, XML and Javascript.
  </p>
  
  <p>
  The following sections explain the basic principles behind the config file 
  structure.
  The structure of a Mapbuilder config file is 
  <a href="lib/schemas/config.xsd">described by an XML Schema</a>
  and a config file that validates against this schema is guaranteed to
  load correctly.
  </p>
  
  <ul>
    <li><a href="?page=config/mvc">Model-View-Controller design pattern</a></li>
    <li><a href="?page=config/opvRule">Object-Property-Value rule</a></li>
    <li><a href="?page=config/patterns">common configuration properties</a></li>
    <li><a href="?page=config/skins">skins and multilingual support</a></li>
    <li><a href="?page=config/listeners">listeners and the Javascript API</a></li>
    <li><a href="?page=config/extend">extending mapbuilder</a></li>
    <li><a href="register">component register</a></li>
  </ul>
  
  <p>
  A common way to get started is to copy an existing config file.
  You can start with the <a href="/mapbuilder/demo/simple/simpleConfig.xml">configuration</a>
  for the <a href="/mapbuilder/demo/simple">simple demo</a> and add in components, 
  or start with a more complex demo and remove components.
  At some point, we intend to produce a Configuration Wizard which will provide
  an intuitive graphical interface for assembling the components for an application.
  </p>
  
  <p align="right">
  <a href="?page=samples/intro">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="?page=config/mvc">next</a>
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/config/extend.html
  
  Index: extend.html
  ===================================================================
  <h2>Extending with new objects</h2>
  
  <p>
  The widgets and models provided in the Mapbuilder distribution are 
  intended to meet most application requirements,
  however they certainly can't meet all requirements.
  Fortunately, the modular design makes it very easy to customize and extend 
  the library to meet your requirements.
  </p>
  
  <p>
  Both widgets and models can be specified in the config file using generic 
  &lt;Widget&gt; and &lt;Model&gt; objects where no specialized 
  JavaScript code is required.
  The &lt;stylesheet&gt; property must be specified for generic Widget objects.
  </p>
  
  <p>
  The widget &lt;stylesheet&gt; property can also be specified for any widget 
  to replace the stylesheet supplied in the Mapbuilder distribution.
  The typical way to use this is to copy the default stylesheet into your 
  application's directory and customize it as required, 
  and setting the path to this new file in the config file.
  </p>
  
  <p>
  For widgets, all properties in the config file are automatically set as a
  stylesheet parameter.
  For example, if the widget has a &lt;lineColor&gt; property in config, 
  the stylesheet for that widget can declare a "lineColor" parameter and use
  that to get the value set in the config file:
  </p>
  <pre>
    &lt;xsl:param name="lineColor" select="'red'"/&gt;
    &lt;xsl:template match="/"&gt;
      line color:&lt;xsl:value-of select="$lineColor"/&gt;
    &lt;/xsl:template&gt;
  </pre>
  
  <p>
  The file naming convention in Mapbuilder is that each JavaScript object in
  config has a corresponding .js file in the mapbuilder/lib directory with 
  the same name as the object name.
  You can override this by specifying a &lt;scriptFile&gt; property 
  in the config file which gives a path to a Javascript file to define the object. 
  </p>
  
  <p>
  Using these techniques, developers and implementers can code, debug, and test 
  their applications independent of the core Mapbuilder library.
  However the models, widgets and tools that you develop could be useful 
  for a wider audience and you are encouraged to contribute these back to 
  the Mapbuilder project so that we can all benefit from each other's efforts.
  </p>
  
  <p align="right">
  <a href="?page=config/listeners">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="docs/register">next</a>
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/config/listeners.html
  
  Index: listeners.html
  ===================================================================
  <h2>Listeners and object methods</h2>
  
  <p>
  More advanced applications will likely want to add functionality by
  performing specific actions in response to user input.
  There are a few methods provided in Mapbuilder to customize your application.
  </p>
  
  <p>
  An important aspect of the MVC design pattern is that it is event driven.
  Almost everything that happens over the course of the application execution
  is the result of an event being triggered on a model, which then calls listener
  functions registered with that model.
  This allows the models, widgets and tools to remain independant of each other 
  and makes Mapbuilder very modular - objects can be added and removed from the
  configuration without affecting the other objects.
  </p>
  
  <p>
  There is a global "config" object that can be referenced from anywhere.
  You can retrieve a reference to all other objects by using the config.objects property.
  For example, a model with an ID of "model_x" would be referenced as 
  config.objects.model_x, or config.objects["model_x"].
  </p>
  
  <p>
  The following functions are available for carrying out user actions:
  </p>
  
  <dl>
  <dt>config.loadModel(modelId,docUrl)</dt>
  <dd>This method will load the model with the specified <i>modelId</i> from
  the <i>docUrl</i> provided.
  This will also trigger a "loadModel" event for that model.
  </dd>
  <dt>model.setParam(param,value)</dt>
  <dd>This method updates a parameter and call all interested listeners. 
  For example, you can set an area of interest on a Context document by 
  setting the "aoi" parameter.
  Any listeners registered to listen for the "aoi" event would then be called and
  the value is passed to the listener functions as an argument.
  The value can be any Javascript object, e.g. a string, integer, array, or object.
  </dd>
  <dt>model.setXpath(xpath,value)</dt>
  <dd>Updates the value of a node in the model's XML document and
  triggers a "refresh" event for this model.
  The node updated is specified by the xpath argument.
  </dd>
  <dt>button action property</dt>
  <dd>Buttons in the configuration file accept an &lt;action&gt; property
  which specifies an object method to be called when a button is selected. 
  </dd>
  </dl>
  
  <p>
  The way to use these functions is to set them as the HREF element of an anchor tag:
  </p>
  <pre>
  &lt;a href="javascript:config.loadModel(...)"/&gt;
  </pre>
  <p>
  or as an event handler (onclick, onmouseover, etc.) on any HTML element that allows it:
  </p>
  <pre>
  &lt;td onclick="config.loadModel(...)"/&gt;
  </pre>
  </p>
  
  <p>
  </p>
  
  <p align="right">
  <a href="?page=config/skins">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="?page=config/extend">next</a>
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/config/mvc.html
  
  Index: mvc.html
  ===================================================================
  <h2>Model-View-Controller design pattern</h2>
  
  <p>
  A Mapbuilder configuration file closely follows the Model-View-Controller (MVC)
  design pattern.
  There are many descriptions of the MVC design pattern 
  <a href="http://www.google.ca/search?hl=en&q=Model+View+Controller+design+pattern">available;</a>
  a brief description of it as it applies to Mapbuilder is provided below.
  It is a very useful design pattern for web applications because it provides
  good separation between the information content, the presentation of that
  information and the application state.
  </p>
  
  <div id="mainMapPane" style="float:right">
  <img src="http://mapbuilder.sourceforge.net/mapbuilder/docs/design/images/mvc.gif"/>
  </div>
  
  <p>
  A <span class="regbld">Model</span> represents the information of the application,
  typically in the form of an XML document retreived from a web service or in the
  the form of a static file at a URL.
  Models provide "get" methods to retrieve particular pieces of information or 
  state and "set" methods to update the information and state of the model.
  When set methods are used, views are notified of the change by calling 
  listeners that can be registered with the model.
  </p>
  
  <p>
  A <span class="regbld">View</span> is a representation of the information 
  in a model.
  Views can register themselves with a model to be notified of changes in the model
  that may affect the view.
  This is typically using "listener" callback methods which are called for 
  various event types.
  Views may also provide means to send user gestures (e.g. mouse clicks) to a 
  controller.
  In Mapbuilder, views are called widgets.
  </p>
  
  <p>
  A <span class="regbld">Controller</span> translates interactions with the view 
  into actions to be performed by the model.
  Controllers modify the information and state of a model.
  In Mapbuilder, views are called tools.
  </p>
  
  <p>
  The separation of model and view allows multiple views to use the same model. 
  Consequently, model components are easier to implement, test, and maintain, 
  since all access to the model goes through these components.
  This also makes it easy to extend because you can simply write a view and 
  some controller logic and wire them into the existing application.
  </p>
  
  <p>
  Mapbuilder can dynamically retrieve and store many different models within the 
  same web application.
  In order to provide some structure to the various models that can be realized, 
  a model may contain an array of other models in a parent-child replationship.
  For example, a WFS DescribeFeatureType response model can be logically represented
  as a child of a WFS GetCapabilities model since they are initimately related.
  </p>
  
  <p>
  In the Mapbuilder object-oriented design, models, widgets and tools are all 
  realized as object instances in Javascript.
  The list of objects to be created and the relationship between them is
  specified in the configuration file.  
  Properties are also optionally assigned to each object in the configuration file.
  The actual objects that mapbuilder supports and the properties that can be 
  assigned to them is detailed in the <a href="docs/register">Component register.</a>
  </p>
  
  <p>
  </p>
  
  <p align="right">
  <a href="?page=config/config">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="?page=config/opvRule">next</a>
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/config/opvRule.html
  
  Index: opvRule.html
  ===================================================================
  <h2>Config file structure</h2>
  
  <p>
  A Mapbuilder configuration document follows the Object-Property-Value 
  rule which is borrowed from RDF and GML3.
  As a rule of thumb, this means that elements in the config file
  alternate between UpperCamelCase and lowerCamelCase, 
  UpperCamelCase is for objects and lowerCamelCase is for properties. 
  An object can only contain another object through a property value and the 
  property name should reflect the relationship or role that the 
  contained Object plays.
  </p>
  
  <p>
  A more complete description of the object-property-value rule
  can be found in section 2.1 of the document: 
  <a href="http://www.geoconnections.org/developersCorner/devCorner_devNetwork/components/GML_bpv1.3_E.pdf">
  Developing and Managing GML Application Schemas</a>
  </p>
  
  <p>
  The benefits of using this naming convention is that it clearly distinguishes
  between Objects and their properties. 
  Objects in the configuration file map directly to Mapbuilder Javascript objects
  and it makes the configuration file much easier to parse.
  </p>
  
  <p>
  Practically all object properties are optional.
  </p>
  
  <p>
  In addition to simple properties, Models may have &lt;models&gt;, &lt;widgets&gt;
  and &lt;tools&gt; properties which list the objects of those types that act
  on that model.
  A Model object will therefore look like:
  </p>
  <pre>
  &lt;Model_a&gt;
    &lt;property_1&gt;pvalue&lt;/property_1&gt;
    &lt;property_2&gt;pvalue&lt;/property_2&gt;
    ...
    &lt;models&gt;
      ...(model objects)...
    &lt;/models&gt;
    &lt;widgets&gt;
      ...(widget objects)...
    &lt;/widgets&gt;
    &lt;tools&gt;
      ...(tool objects)...
    &lt;/tools&gt;
  &lt;/Model_a&gt;
  </pre>
  
  <p>
  Widgets and Tools only contain simple property values, so these will look like:
  </p>
  <pre>
  &lt;Widget_i&gt;
    &lt;property_1&gt;pvalue&lt;/property_1&gt;
    &lt;property_2&gt;pvalue&lt;/property_2&gt;
    ...
  &lt;/Widget_i&gt;
  </pre>
  <p>
  and:
  </p>
  <pre>
  &lt;Tool_x&gt;
    &lt;property_1&gt;pvalue&lt;/property_1&gt;
    &lt;property_2&gt;pvalue&lt;/property_2&gt;
    ...
  &lt;/Tool_x&gt;
  </pre>
  
  <p>
  Keeping in mind that the config is itself a Model object, 
  the basic structure of a Mapbuilder configuration file will look like this:
  </p>
  <pre>
  &lt;MapbuilderConfig&gt;
    &lt;property_1&gt;pvalue&lt;/property_1&gt;
    &lt;property_2&gt;pvalue&lt;/property_2&gt;
    ...
    &lt;models&gt;
      &lt;Model_a&gt;...&lt;/Model_a&gt;
      &lt;Model_b&gt;...&lt;/Model_b&gt;
      ...
    &lt;/models&gt;
    &lt;widgets&gt;
      &lt;Widget_i&gt;...&lt;/Widget_i&gt;
      &lt;Widget_j&gt;...&lt;/Widget_j&gt;
      ...
    &lt;/widgets&gt;
    &lt;tools&gt;
      &lt;Tool_x&gt;...&lt;/Tool_x&gt;
      &lt;Tool_y&gt;...&lt;/Tool_y&gt;
    &lt;/tools&gt;
  &lt;/MapbuilderConfig&gt;
  </pre>
  
  <p>
  The actual objects that mapbuilder supports and the properties that can be 
  assigned to them is detailed in the <a href="docs/register">Component register.</a>
  </p>
  
  <p align="right">
  <a href="?page=config/mvc">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="?page=config/patterns">next</a>
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/config/patterns.html
  
  Index: patterns.html
  ===================================================================
  <h2>Common properties in config</h2>
  
  <p>
  There are some object properties that are commonly used in the config file.
  All common properties are optional and if they are missing, a reasonable default 
  behaviour is provided.
  Specific Objects may define additional properties and these may be required.
  </p>
  
  <p>
  Every Object in the config file must have a unique ID assigned to it.
  ID's are assigned to the objects as an attribute, not as a property.
  </p>
  
  <h3>Model properties</h3>
  <dl>
  <dt>defaultModelUrl</dt>
  <dd>The URL where the model gets loaded from.  
    If the method is HTTP GET, then include the full query string in the URL.  
    If present, the model will be loaded when the application loads.
  </dd>
  </dl>
  
  <h3>Tool properties</h3>
  <dl>
  <dt>targetModel</dt>
  <dd>The id of a model object which this tool acts on.  
  If absent the action happens on the parent model of this tool.
  </dd>
  </dl>
  
  <h3>Widget properties</h3>
  <dl>
  <dt>htmlTagId</dt>
  <dd>The ID of the HTML element in the web page where this widget's output 
  should be placed.  
  If this property is missing, the widget's ID attribute will be used instead.
  </dd>
  <dt>targetModel</dt>
  <dd>The id of a model object which this tool acts on.  
  If absent the action happens on the parent model of this tool.
  </dd>
  <dt>stylesheet</dt>
  <dd>This property specifies a relative or absolute URL to a stylesheet that 
  can replace the default stylesheet.  
  The stylesheet must be served from the same domain as the mapbuilder applicaiton.  
  </dd>
  <dt>debug</dt>
  <dd>An empty property element to show debugging output during widget processing.
  </dd>
  </dl>
  
  <h3>Specialized widgets</h3>
  <p>
  There are a few specialized widget types that are extensons of the basic Widgets: 
  MapContainers and Buttons.  
  These widgets can have all the above properties but also define some properties 
  of their own.
  </p>
  
  <h3>MapContainer widgets</h3>
  <p>
  A MapContainer widget is one that renders geography in 2 dimensions.
  </p>
  
  <dl>
  <dt>mapContainerId</dt>
  <dd>The ID of a &lt;DIV&gt; element that will be created to hold the output of widgets
  that render in 2 dimensions, maps in particular.
  A MapContainer will overlay the output of all widgets that have the same 
  mapContainerId in the order that they are encountered in the config file.
  </dd>
  </dl>
  
  <h3>Button widgets</h3>
  <p>
  Buttons are widgets whose output is a linked image which executes a function
  when clicked.
  A radio button will swap it's image for another one when selected.
  </p>
  
  <dl>
  <dt>buttonBar</dt>
  <dd>Equivalent to the htmlTagId property for placing buttons in a page.  
  Buttons get appended to this HTML element in sequence.
  </dd>
  <dt>class</dt>
  <dd>Specifies the type of button.  
  Permitted values include "Button" and "RadioButton".  
  A Button class will execute it's action immediately when pressed.  
  A "RadioButton" has enabled and disabled state and only one button 
  in a buttonBar group can be enabled at any one time.
  </dd>
  <dt>disabledSrc</dt>
  <dd>Partial skin path to graphic source when this button is not selected.
  Must be supplied for all buttons.
  </dd>
  <dt>enabledSrc</dt>
  <dd>Partial skin path to graphic source when this button is selected.
  Must be supplied for RadioButtons.
  </dd>
  <dt>selected</dt>
  <dd>Boolean value (true or false) to inidicate the initial state of this button.
  </dd>
  <dt>mouseHandler</dt>
  <dd>The id of a tool object on which to register mouse events.  
  Optional, if absent mouse events are not handled and the action is the doSelect function.
  </dd>
  <dt>action</dt>
  <dd>An objectID.method() to be called when the button is selected.
  </dd>
  </dl>
  
  
  <p align="right">
  <a href="?page=config/opvRule">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="?page=config/skins">next</a>
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/config/skins.html
  
  Index: skins.html
  ===================================================================
  <h2>Skins, CSS and multilingual support</h2>
  
  <p>
  It's relatively easy to change the way your application looks, 
  including the text and images output by the widgets.  
  This is accomplished using a "skin" concept in addition to 
  Cascading Stylesheets (CSS).
  </p>
  
  <h3>The skin directory</h3>
  <p>
  The skin directory is a property of the config file and points to a directory 
  on the web server where images and other items coded into widget stylesheets
  can be located.
  The directory can be an absolute path or relative to the base directory
  of the page being loaded.
  </p>
  
  <p>
  Currently only Button images come from the skin dir, but all future Mapbuilder
  extensions using images will come from this directory.
  To create the SRC URL for a button image, the button enabled/disabledSrc path in
  config is appended to the skin directory.
  This directory is also used as the root for the widget text file (see below).
  </p>
  
  <p>
  Unless you want to keep the default look and feel of Mapbuilder, you should 
  create your own skin directory and set the path to it in the config file.
  This directory should be outside of the mapbuilder directory so that you can
  easily upgrade to newer versions of the package by simply replacing it.
  (This is recommended for your applications as well.)
  </p>
  
  <h3>Multilingual support</h3>
  <p>
  All text that is output by widget stylesheets should be passed in to the 
  stylesheet as a stylesheet param, and there are two ways to do this 
  automatically in Mapbuilder.
  The first way is is to set the text values as a widget property in config, 
  however this will only support one language.
  </p>
  
  <p>
  To support multiple languages, you can set a &lt;widgetTextUrl&gt; property
  on the config model.
  This property is a partial path to a file containing language dependant text.
  The full path to the file is created from the skinDir value plus language code
  value plus the partial path to the text file.
  </p>
  
  <p>
  The language code is a standard language code values, e.g. "en", "fr", etc., 
  and can be set as a parameter passed to the page when it loads,
  or set as a JavaScript "language" variable in the page head.
  This value can be retrieved at any time through the config.lang property.
  </p>
  
  <p>
  The widget text file has a structure very similar to the config file, except
  that it only contains Widget elements and the text values to be set as
  parameters for the stylesheet.
  The property name is the same as the stylesheet parameter name.
  </p>
  
  <h3>Use of CSS in mapbuilder</h3>
  <p>
  CSS can and should be used to modify how your page looks.
  This is typically done by using the widget ID (or htmlTagId value) from config
  as a CSS selector.
  As an example, the complete demo uses this piece of CSS to give the mainMapContainer
  element an olive 1 pixel border and change the cursor to a crosshair:
  </p>
  
  <pre>
  #mainMapContainer {
    border: 1px solid olive;
    cursor: crosshair;
  }
  </pre>
  
  <p>
  The CSS file is typically stored in the skin directory as well, 
  but this isn't a requirement.
  It must be included manually in the page head, that is CSS files are not
  loaded automatically by Mapbuilder.
  </p>
  
  
  
  <p align="right">
  <a href="?page=config/patterns">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="?page=config/listeners">next</a>
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/developersguide/README
  
  Index: README
  ===================================================================
  $Id$
  
  This Developer's Guide is derived from a Master Developers Guide at
  http://generguide.sourceforge.net using the Generguide scripts and
  local configuration files:
    entities.ent
    generconfig.xml
  
  Refer to http://generguide.sourceforge.net for details on how to build
  a guide.
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/developersguide/entities.ent
  
  Index: entities.ent
  ===================================================================
  <!-- The name of this project, starting with a capital letter -->
  <!ENTITY project_name "Community Map Builder">
  
  <!-- The owner of this project - probably the Project Management Committee -->
  <!ENTITY pmc "&project_name; Project Management Committee">
  
  <!-- Owner of the documentation licencse -->
  <!ENTITY doc_license_owner "&pmc;">
  
  <!-- Owner of the source licencse -->
  <!ENTITY src_license_owner "&pmc;">
  
  <!-- Generguide version -->
  <!ENTITY version "0.0.3">
  
  <!-- This project's root directory, usually the name of the project in lower case -->
  <!ENTITY project_home "mapbuilder">
  <!-- Directory in &project_home; where source code is kept -->
  <!ENTITY project_src "">
  <!-- Directory within &project_src; where code is kept.  Used by java projects -->
  <!ENTITY project_package_dir "net/sourceforge/generguide">
  <!ENTITY project_package "net.sourceforge.generguide">
  
  <!-- URL of a webpage describing how to access CVS -->
  <!ENTITY cvs_url "http://sourceforge.net/cvs/?group_id=35246">
  
  <!-- IRC -->
  <!-- Meeting time for IRC meetings -->
  <!ENTITY irc_time "weekly at (time to be specified) UTC">
  <!ENTITY irc_server "irc.eu.freenode.net">
  <!ENTITY irc_channel "#some_channel">
  <!ENTITY irc_port "6667">
  <!-- URL location where IRC logs are stored -->
  <!ENTITY irc_logs "(to be specified)">
  
  <!-- Jump point url for project email lists -->
  <!ENTITY email_url "http://sourceforge.net/mail/?group_id=35246">
  
  <!-- Jump point url for project bug tracker -->
  <!ENTITY bug_track_url "http://sourceforge.net/tracker/?group_id=35246">
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/developersguide/generconfig.xml
  
  Index: generconfig.xml
  ===================================================================
  <generconfig>
    <nodeset filter="BLACK">
      <node id="identification" filter="BLACK"/>
      <node id="systemoverview" filter="BLACK"/>
      <node id="doclicense" filter="EXCLUDE"/>
      <node id="sourcelicense" filter="EXCLUDE"/>
      <node id="dependancies" filter="EXCLUDE"/>
      <node id="requirementtracing" filter="EXCLUDE"/>
      <node id="language" filter="WHITE"/>
      
      <node id="javascript" filter="BLACK"/>
      <node id="configurationmanagement" filter="BLACK"/>
      
      
      
      
      
      
      
      
      
      
      <node id="communication" filter="BLACK"/>
      <node id="irc" filter="EXCLUDE"/>
      <node id="email" filter="BLACK"/>
      <node id="bugtracking" filter="BLACK"/>
      <node id="inlinetasktracking" filter="EXCLUDE"/>
      <node id="build" filter="WHITE"/>
      
      
      <node id="jscompression" filter="BLACK"/>
      <node id="design" filter="BLACK"/>
      
      <node id="inlinedocumentation" filter="WHITE"/>
      
      <node id="jsdoc" filter="BLACK"/>
      
      <node id="poseidon" filter="BLACK"/>
      <node id="ide" filter="EXCLUDE"/>
      
      
      <node id="codingconventions" filter="WHITE"/>
      
      
      
      
      
      <node id="directorynames" filter="BLACK"/>
      <node id="classnames" filter="BLACK"/>
      <node id="refactoring" filter="WHITE"/>
      
      <node id="codeprofiling" filter="WHITE"/>
      
      <node id="testing" filter="WHITE"/>
      
      
      <node id="documentation" filter="BLACK"/>
    </nodeset>
  </generconfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/developersguide/index.html
  
  Index: index.html
  ===================================================================
  <html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Community Map Builder Software Developers' Guide</title><meta name="generator" content="DocBook XSL Stylesheets V1.62.4"><meta name="description" content="A generic software developers' guide which draws upon
        the best open source convensions, processes and tools. Note, this guide is still in alpha state. This guide was built with generguide version
        $Name$."></head><body bgcolor="white" text="black" link="#0000ff" vlink="#840084" alink="#0000ff"><div class="article" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="index"></a>Community Map Builder Software Developers' Guide</h2></div><div><div class="abstract"><p class="title"><b>Abstract</b></p><p>A generic software developers' guide which draws upon
        the best open source convensions, processes and tools.</p><p>Note, this guide is still in alpha state.</p><p>This guide was built with <a href="http://generguide.sourceforge.net/" target="_top">generguide</a> version
        $Name$.</p></div></div></div><div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="#introduction">1. Introduction</a></span></dt><dd><dl><dt><span class="section"><a href="#identification">1.1. Identification</a></span></dt><dt><span class="section"><a href="#systemoverview">1.2. System overview</a></span></dt></dl></dd><dt><span class="section"><a href="#language">2. Language</a></span></dt><dd><dl><dt><span class="section"><a href="#javascript">2.1. Javascript</a></span></dt></dl></dd><dt><span class="section"><a href="#configurationmanagement">3. Configuration Management</a></span></dt><dd><dl><dt><span class="section"><a href="#cvs">3.1. CVS</a></span></dt><dt><span class="section"><a href="#components">3.2. Release Components</a></span></dt><dt><span class="section"><a href="#versionnumbers">3.3. Version numbers</a></span></dt><dt><span class="section"><a href="#taggingreleases">3.4. Tagging releases</a></span
 ></dt><dt><span class="section"><a href="#release">3.5. Release Process</a></span></dt></dl></dd><dt><span class="section"><a href="#teamorg">4. Team Organisation</a></span></dt><dd><dl><dt><span class="section"><a href="#userrole">4.1. Users</a></span></dt><dt><span class="section"><a href="#contributorrole">4.2. Contributors</a></span></dt><dt><span class="section"><a href="#committerrole">4.3. Committers</a></span></dt><dt><span class="section"><a href="#pmcrole">4.4. Project Management Committee (PMC)</a></span></dt></dl></dd><dt><span class="section"><a href="#communication">5. Communication</a></span></dt><dd><dl><dt><span class="section"><a href="#email">5.1. Email lists</a></span></dt></dl></dd><dt><span class="section"><a href="#bugtracking">6. Bug Tracking</a></span></dt><dt><span class="section"><a href="#build">7. Build</a></span></dt><dd><dl><dt><span class="section"><a href="#jscompression">7.1. Javascript Compression</a></span></dt></dl></dd><dt><span class="s
 ection"><a href="#design">8. Design</a></span></dt><dd><dl><dt><span class="section"><a href="#designdocumentation">8.1. Design Document</a></span></dt><dt><span class="section"><a href="#inlinedocumentation">8.2. Inline Documentation</a></span></dt><dd><dl><dt><span class="section"><a href="#jsdoc">8.2.1. Jsdoc</a></span></dt></dl></dd><dt><span class="section"><a href="#uml">8.3. Unified Modeling Language (UML)</a></span></dt><dd><dl><dt><span class="section"><a href="#modellingwebapps">8.3.1. Modelling Web Applications</a></span></dt><dt><span class="section"><a href="#poseidon">8.3.2. Poseidon UML</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#codingconventions">9. Coding Conventions</a></span></dt><dd><dl><dt><span class="section"><a href="#directorynames">9.1. Directory Names</a></span></dt><dt><span class="section"><a href="#classnames">9.2. Class Naming Conventions</a></span></dt></dl></dd><dt><span class="section"><a href="#refactoring">10. R
 efactoring</a></span></dt><dt><span class="section"><a href="#codeprofiling">11. Code Profiling</a></span></dt><dt><span class="section"><a href="#testing">12. Test</a></span></dt><dt><span class="section"><a href="#documentation">13. Documentation</a></span></dt><dd><dl><dt><span class="section"><a href="#quickstart">13.1. Quick Start</a></span></dt><dt><span class="section"><a href="#whydocbook">13.2. Why Docbook?</a></span></dt><dt><span class="section"><a href="#modulardocumentation">13.3. Modular documentation</a></span></dt><dt><span class="section"><a href="#publishingdocbook">13.4. Publishing docbook files</a></span></dt><dd><dl><dt><span class="section"><a href="#publishmasterdocs">13.4.1. Publishing using xsltproc</a></span></dt><dt><span class="section"><a href="#publishingwithant">13.4.2. Publishing using ant/maven</a></span></dt><dt><span class="section"><a href="#publishusingmaven">13.4.3. Publishing using maven</a></span></dt><dt><span class="section"><a href=
 "#documentationpublishwithjava">13.4.4. Publishing using java tools.</a></span></dt><dd><dl><dt><span class="section"><a href="#documentationpublishwithxsl">13.4.4.1. Joining document parts using XSL template defined in
            selectivexinclude.xsl.</a></span></dt></dl></dd></dl></dd><dt><span class="section"><a href="#docbookeditors">13.5. Docbook Editors</a></span></dt><dt><span class="section"><a href="#docbookreferences">13.6. Docbook References</a></span></dt></dl></dd></dl></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="introduction"></a>1.&nbsp;Introduction</h2></div></div><div></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="identification"></a>1.1.&nbsp;Identification</h3></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div></div></div></div><div></div></div><p>This document provides comprehensive software development processes
      tailored for open source projects. It covers processes, conventions, and
      recommended tools. The guide aims to help developers quickly get up to speed
      with best practises.</p><p>You are not expected to read this guide cover-to-cover. You probably
      should be familiar with the contents and reference the appropriate section
      when you need it. Documentation aims to be concise with references elsewhere
      on the web for details like installation instructions.</p><p>This guide is written in a modular fashion so that different projects
      can easily add, delete, or modify sections. It is hoped that this guide will
      become the de-facto standard software developers guide for java based open
      source projects.</p><p>For this guide to be useful it needs to be continually added to and
      improved as tools are developed, processes improved and projects grow.
      Please consider improving or adding a section if you feel it is
      required.</p><p>Ideally, all recommended tools would be open source, however we have
      included some no-cost tools where there are gaps in the open source tool
      set. Where applicable,
      widely accepted conventions and open standards are used. It has been
      satisfying to discover the breadth of quality open source tools
      which support software development. It is hoped that this document will
      highlight areas where tools can be improved or developed and encourage
      developers to focus on these areas.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="systemoverview"></a>1.2.&nbsp;System overview</h3></div></div><div></div></div><p>This section should be replaced and explain your project.</p></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="language"></a>2.&nbsp;Language</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div></div></div></div><div></div></div><p>This section describes the language(s) and compilers used by this
    project.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="javascript"></a>2.1.&nbsp;Javascript</h3></div></div><div></div></div><p>This project contains Javascript code which requires XML functions. In
    order to run these functions you will require generation 6 browsers. Ie,
    Internet Explorer 6 or Netscape 6 or greater.</p></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="configurationmanagement"></a>3.&nbsp;Configuration Management</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div></div></div></div><div></div></div><p>Software configuration management involves recording 
        and retreiving all versions of software in a system.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="cvs"></a>3.1.&nbsp;CVS</h3></div></div><div></div></div><p>Concurrent Versions System (CVS) is a version control system that
    allows multiple developers to work on the same files at the same time.</p><p>Information on how to download and edit this project's source code
      are provided at: <a href="http://sourceforge.net/cvs/?group_id=35246" target="_top">http://sourceforge.net/cvs/?group_id=35246</a>.</p><p>Note, before you can edit files, you will need to be granted write
    access from the Community Map Builder Project Management Committee.</p><p>An excellent CVS manual can be found at <a href="http://cvsbook.red-bean.com/" target="_top">http://cvsbook.red-bean.com/</a>.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="components"></a>3.2.&nbsp;Release Components</h3></div></div><div></div></div><p>This section describes the terms used when building a release. This
    section is explained in more detail at <a href="https://sourceforge.net/docman/display_doc.php?docid=6445&amp;group_id=1#componentoverview" target="_top">https://sourceforge.net/docman/display_doc.php?docid=6445&amp;group_id=1#componentoverview</a>.</p><div class="variablelist"><dl><dt><span class="term">Project</span></dt><dd><p>A project represents a web site, and group of people working on
          the same functionality. For instance, <a href="http://generguide.sourceforge.net/" target="_top">http://generguide.sourceforge.net</a>
          is the web site for the Generguide project.</p></dd><dt><span class="term">Package</span></dt><dd><p>A package is a bundle of software being developed within a
          project. A project may develop multiple packages. For instance, the
          Generguide project may develop the packages: generguide-lib and
          developersguide.</p></dd><dt><span class="term">Release</span></dt><dd><p>A release is a snapshot in the development of a package. It is
          represented by the package name and release number. For instance,
          generguide-0.1, or generguide-0.2.</p></dd><dt><span class="term">File</span></dt><dd><p>Each release will probably contain multiple files. A file is
          expected to have multiple versions, however only one version of a file
          can be in a release.</p></dd></dl></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="versionnumbers"></a>3.3.&nbsp;Version numbers</h3></div></div><div></div></div><p>Release version numbers are based on 3 main digits and an optional
    release candidate digit :
    <span class="emphasis"><em>&lt;major&gt;.&lt;minor&gt;.&lt;patch&gt;-rc&lt;release
    candidate&gt;</em></span>. It looks like <span class="emphasis"><em>2.3.4</em></span> or
    <span class="emphasis"><em>2.3.4-rc5 </em></span>.</p><div class="variablelist"><dl><dt><span class="term">major version</span></dt><dd><p>Major version number should be incremented to indicate that
          project has lost full compatibility with earlier versions. So you can
          safely upgrade to later versions of a module so long as the major
          version has not changed.</p></dd><dt><span class="term">minor version</span></dt><dd><p>The second digit (minor) is incremented whenever new features
          are added. The project is forward compatible across minor versions,
          but usually not backward compatible.</p></dd><dt><span class="term">patch version</span></dt><dd><p>The third digit is for patches (bug fixes). It is used to
          indicate fixes in bugs only. No new features were made and full
          compatibility is preserved.</p><p>This digit is optional.</p></dd><dt><span class="term">release candidate</span></dt><dd><p>A project may optionally produce release candidate releases for
          beta testing before the main release.</p></dd></dl></div><p>For projects that use <tt class="filename">maven</tt>, the version number
    is stored in the <tt class="literal">&lt;currentVersion&gt;</tt> tag in maven's
    <tt class="filename">project.xml</tt> file.</p><p>To do: We need to discuss the meaning of:</p><div class="itemizedlist"><ul type="disc"><li><p>alpha</p></li><li><p>beta</p></li></ul></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="taggingreleases"></a>3.4.&nbsp;Tagging releases</h3></div></div><div></div></div><p>Every time the version number is incremented, you need to tag the
    relevant files in the repository. This ensures that previous releases can be
    recreated for future debugging.</p><p>Tag names are based on the module version and look like
    <span class="emphasis"><em>&lt;package_name&gt;-&lt;major&gt;_&lt;minor&gt;_&lt;patch&gt;-rc&lt;release
    candidate&gt;.</em></span> Eg: generguide-lib-2_3_4-rc5 .</p><p>Note that full stops from the version number are replaced with
    underscores. This is because CVS doesn't allow full stops in tags.</p><p>Typically, you would create a release tag with the following
    statements in CVS:</p><pre class="programlisting">cd mapbuilder
  cvs tag generguide-lib-2_3_4</pre></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="release"></a>3.5.&nbsp;Release Process</h3></div></div><div></div></div><p>This section describes the steps to follow when building a
    release.</p><div class="variablelist"><dl><dt><span class="term">Notify developers that you are about to make a release</span></dt><dd><p>At least 24 hours before building a release, email the
          developers to notify them you are about to build a release. This
          should allow them to ensure their fixes are in the code base.</p></dd><dt><span class="term">Check all code back into CVS</span></dt><dd><p>If you have not done so already, check all the code you have
          been editing into CVS.</p><pre class="programlisting">cvs commit -m"Fixed xxx bugs" &lt;filenames&gt;</pre></dd><dt><span class="term">Get latest updates from CVS</span></dt><dd><p>Ensure you have the latest files from CVS.</p><pre class="programlisting">cd generguide/
  cvs update -d .</pre></dd><dt><span class="term">Update README file</span></dt><dd><p>Ensure the README file is still relevant. This file should be in
          the base directory.</p></dd><dt><span class="term">Update the CHANGES file</span></dt><dd><p>Update and commit CHANGES file with updates between the last
          release and this one. This file should be in the base
          directory.</p><p>The CHANGES file should contain a heading for each release, most
          recent release at the top. Under each heading should be a description
          of the changes since the last release.</p><p>All notable outstanding issues should be included. (This might
          be a list of the high priority bugs of the list is too long). You
          should be able to copy the bug ID and title from the Bug
          Tracker.</p><p>All notable issues fixed since last release should be included.
          Again, copy the bug ID and title from the Bug Tracker.</p><pre class="programlisting">&lt;package&gt; Release Information
  =============================
  $Id<span class="emphasis"><em>:</em></span>$
  This file contains information about updates to each release:
  
  &lt;package&gt;_0.2 (beta quality)
  ============================
  * Added extra gismos.
  * Fixed bugs related to the crash of last release.
  
  Outstanding Issues:
  -------------------
  962714 Slow load with no user feedback
  
  Issues addressed since last release:
  ------------------------------------
  962718 Crash of system using Mozilla
  
  &lt;package&gt;_0.1 (alpha quality)
  =============================
  * Initial release</pre></dd><dt><span class="term">Tag the release</span></dt><dd><p>Tag the files that should be in the release. (Usually, not all
          files in CVS are included in a release).</p><pre class="programlisting">cd generguide/
  cvs tag &lt;tag&gt; dir1 dir2 dir/file1 ...</pre></dd><dt><span class="term">Create a temporary directory</span></dt><dd><pre class="programlisting">mkdir ~/tmp</pre></dd><dt><span class="term">Export the release</span></dt><dd><p>Exporting code from CVS is the same as checking it out, except
          that the CVS/ directories are not checked out as well.</p><pre class="programlisting">cd ~/tmp
  export CVS_RSH=ssh
  export CVSROOT=:ext:camerons at cvs.sourceforge.net:/cvsroot/generguide
  cvs export -r &lt;tag&gt; generguide</pre></dd><dt><span class="term">Build/Import Non-CVS files</span></dt><dd><p>Many projects will include files in their release which are not
          contained in CVS. For instance:</p><div class="itemizedlist"><ul type="disc"><li><p>Libraries imported from another project.</p></li><li><p>Automatically generated documentation (like javadocs).
              </p></li><li><p>Documentation that needs to be converted from Docbook to
              HTML.</p></li></ul></div><p>These files need to be built and copied into the release
          directory.</p></dd><dt><span class="term">Add tag name to generguide directory</span></dt><dd><pre class="programlisting">cd ~/tmp
  mv generguide/ generguide-0.2</pre></dd><dt><span class="term">Zip up release</span></dt><dd><pre class="programlisting">zip -r generguide-0_2.zip generguide-0.2
  tar -zcvf generguide-0_2.tar.gz generguide-0.2</pre></dd><dt><span class="term">Ftp release file Sourceforge</span></dt><dd><p>Refer to the Sourceforge <a href="http://sourceforge.net/docman/display_doc.php?docid=6445&amp;group_id=1#frsinterface" target="_top">File
          Release System</a> for more information.</p><div class="itemizedlist"><ul type="disc"><li><p>ftp to upload.sourceforge.net</p></li><li><p>login as "anonymous"</p></li><li><p>use email address as password</p></li><li><p>set ftp client to binary mode</p></li><li><p>cd /incoming (on the server)</p></li><li><p>upload release file(s).</p></li></ul></div></dd><dt><span class="term">Copy to generguide release directory</span></dt><dd><p>From the <a href="http://sourceforge.net/projects/generguide" target="_top">http://sourceforge.net/projects/generguide</a>,
          select <tt class="literal">Admin</tt>, <tt class="literal">File Releases</tt>,
          <tt class="literal">Add Release</tt>.</p><p>Walk through the various forms.</p><div class="itemizedlist"><ul type="disc"><li><p>For the release name, use the tag name: eg
              generguide-0.2</p></li><li><p>For release notes and change log, extract this information
              from the comments added to the CHANGES file above.</p></li></ul></div></dd><dt><span class="term">Download and test</span></dt><dd><p>Download the release from sourceforge, uncompress it, and check
          it. (This can be covered by the following step).</p></dd><dt><span class="term">Email release message</span></dt><dd><p>Send an email notification to the project's announce email
          list.</p></dd><dt><span class="term">Update release information on Freshmeat</span></dt><dd><p></p></dd></dl></div></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="teamorg"></a>4.&nbsp;Team Organisation</h2></div><div><div class="authorgroup"><h3 class="corpauthor"><a href="http://jakarta.apache.org/site/roles.html" target="_top">The Jakarta Project</a>
      </h3><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div><div class="author"><h3 class="author"><span class="firstname">James</span> <span class="surname">Macgill</span></h3></div></div></div></div><div></div></div><p>The roles and responsibilities that people can assume in this project
    are based on merit. Everybody can help no matter what their role. Those who
    have been long term or valuable contributors to the project obtain the right
    to vote and commit directly to the source repository.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="userrole"></a>4.1.&nbsp;Users</h3></div></div><div></div></div><p>Users are the people who use the products of the Project. People in this
      role aren't contributing code, but they are using the products,
      reporting bugs, making feature requests, and such. This is by far the most
      important category of people as, without users, there is no reason for the
      Project.</p><p>When a user starts to contribute code or documentation patches, they
      become a Contributor.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="contributorrole"></a>4.2.&nbsp;Contributors</h3></div></div><div></div></div><p>Contributors are the people who write code or documentation patches or
      contribute positively to the project in other ways. A volunteer's
      contribution is always recognized. In source code, all volunteers who
      contribute to a source file may add their name to the list of authors for
      that file.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="committerrole"></a>4.3.&nbsp;Committers</h3></div></div><div></div></div><p>Contributors who give frequent and valuable contributions to a
      subproject of the Project can have their status promoted to that of a
      "Committer" for that subproject. A Committer has write access to the
      source code repository and gains voting rights allowing them to affect the
      future of the subproject.</p><p>In order for a Contributor to become a Committer, another Committer can
      nominate that Contributor or the Contributor can ask for it.</p><p>Once a Contributor is nominated, all existing committers will vote. If
      there are at least 3 positive votes and no negative votes, the Contributor
      is converted into a Committer and given write access to the source code
      repository. This is an example offer letter that should be sent to the
      volunteer after 3 positive votes have been received:</p><div class="blockquote"><blockquote class="blockquote"><p>Dear Contributor,</p><p>Our project would like to offer you commit privileges. We have been
        impressed with your contributions up till now, and believe that your
        involvement will improve the quality of the code we produce. If you are
        interested in having commit privileges, please set up an account with
        <a href="http://sourceforge.net/" target="_top"> http://sourceforge.net</a> and
        let us know your account name.</p><p>We all hope that you accept this invitation.</p><p>The Community Map Builder Project Management Committee.</p></blockquote></div><p>Committers are asked to coordinate their efforts with the maintainers of
      the modules they wish to modify/extend.</p><p>At times, Committers may go inactive for a variety of reasons. A
      Committer that has been inactive for 6 months or more may lose their status
      as a Committer. Getting access back is as simple as re-requesting it on the
      project's Developer mailing list.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pmcrole"></a>4.4.&nbsp;Project Management Committee (PMC)</h3></div></div><div></div></div><p>Committers who frequently participate with valuable contributions may
      have their status promoted to that of a <span class="emphasis"><em>Project Management
        Committee Member</em></span>. This committee is the official managing body
      of the Project and is responsible for setting overall project direction. In
      order to become a Member, someone on the PMC must nominate the Committer.
      The individual may then be approved with a 3/4 majority of the PMC.</p></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="communication"></a>5.&nbsp;Communication</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div></div></div></div><div></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="email"></a>5.1.&nbsp;Email lists</h3></div></div><div></div></div><p>Email lists provide an effective form of communication. Details about
        this project's email lists can be found at: http://sourceforge.net/mail/?group_id=35246.</p></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="bugtracking"></a>6.&nbsp;Bug Tracking</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div></div></div></div><div></div></div><p>During alpha development, issues are embedded into the code using <a href="#">@task</a> tags which can be read from the
      maven output files.</p><p>Once code has been released, bugs are tracked using this project's bug tracking
      system: http://sourceforge.net/tracker/?group_id=35246.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="build"></a>7.&nbsp;Build</h2></div></div><div></div></div><p>Building involves processing source files to produce target files.  For example,
    compiling and linking source code, or converting docbook to html documentation.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="jscompression"></a>7.1.&nbsp;Javascript Compression</h3></div></div><div></div></div><p>Javascript files need to be uploaded across potentially slow internet
      connections.  Consequently, it is desirable to keep file sizes to a minimum.</p><p>Javascript files can be compressed with
      <a href="http://www.creativyst.com/Prod/3/" target="_top">The Creativyst CSS and JavaScript
        Compressor</a>.</p><p>To do: Find an open source compression algorithm.  The above algorithm
      removes white spaces and comments, but does not compress file names, which could
      reduce file size even more.
    </p></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="design"></a>8.&nbsp;Design</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div></div></div></div><div></div></div><p>A design describes how to implement a product. A design is useful
    during development and maintainance as it provides developers with a quick
    high level understanding of the product being developed.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="designdocumentation"></a>8.1.&nbsp;Design Document</h3></div></div><div></div></div><p>A design document should provide a brief overview of the design to help
      developers gain a quick understanding of the system. The design
      documentation is enhanced by using more diagrams and less text.</p><p>Text in the design document should be written in docbook format. Refer
      to the documentation section for more details about using docbook.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="inlinedocumentation"></a>8.2.&nbsp;Inline Documentation</h3></div></div><div></div></div><p>Documentation about procedures and classes should be embedded in the
    source code and then extracted into Detailed Design documentation using an
    external parser.</p><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="jsdoc"></a>8.2.1.&nbsp;Jsdoc</h4></div></div><div></div></div><p><a href="http://jsdoc.sourceforge.net/" target="_top">Jsdoc</a> is a tool
    that parses inline documentation in JavaScript source files, and produces a
    HTML summary. Refer to the Code Convensions section to see how comments
    should be written.</p></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="uml"></a>8.3.&nbsp;Unified Modeling Language (UML)</h3></div></div><div></div></div><p><a href="http://www.uml.org/" target="_top">UML</a> is a standard notation
      used to specify, visualise, construct and document the components of an
      object-oriented software-intensive system. UML diagrams are used as part
      of design documentation.</p><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="modellingwebapps"></a>8.3.1.&nbsp;Modelling Web Applications</h4></div></div><div></div></div><p>Web applications are modelled in accordance with <a href="http://www.rational.com/products/whitepapers/100462.jsp?SMSESSION=NO" target="_top">Modeling
    Web Application Design with UML, by Jim Conallen</a>. This white paper
    describes class stereo types to model web components. Class stereotypes
    provided are:</p><div class="itemizedlist"><ul type="disc"><li><p>Server Page</p></li><li><p>Client Page</p></li><li><p>Form</p></li><li><p>Frameset</p></li><li><p>Target</p></li><li><p>Scriplet</p></li><li><p>XML</p></li></ul></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="poseidon"></a>8.3.2.&nbsp;Poseidon UML</h4></div></div><div></div></div><p><a href="http://www.gentleware.com/products/index.php3" target="_top">Poseidon</a>
    is a UML editor which extends the open source <a href="http://argouml.tigris.org/" target="_top">Argo UML</a>. It provides a no-cost
    version which is more polished than Argo UML.</p><p>Note that some of ArgoUML's features are disabled in Poseidon. In
    particular, Poseidon 2.1 disables reverse engineering of java code.</p><p>You can reverse engineer code using <a href="http://argouml.tigris.org/" target="_top">Argo UML</a>, then import the project
    into Poseidon.</p><p>Poseidon can be installed into <span class="emphasis"><em>Netbeans</em></span> as a
    module. Refer to Poseidon download instructions for more details.</p></div></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="codingconventions"></a>9.&nbsp;Coding Conventions</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div></div></div></div><div></div></div><p>Coding conventions describe the coding styles developers should use when
      writing code. For example, whether you use 2, 4, or 8 space indents.
      Standardizing on a coding style across a project improves legibility of the
      code, and automatic code formatters make conforming to these standards
      easy.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="directorynames"></a>9.1.&nbsp;Directory Names</h3></div></div><div></div></div><p>Directory names shall be all lower case with no spaces. Some versions of
      windows do not distinguish between upper and lower case, and in unix,
      writing spaces in filenames is painful.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="classnames"></a>9.2.&nbsp;Class Naming Conventions</h3></div></div><div></div></div><p>to do: need to fill out this section.</p></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="refactoring"></a>10.&nbsp;Refactoring</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div></div></div></div><div></div></div><p>Refactoring is the process of restructuring/renaming your code to ensure
      your design remains clean as your requirements and functionality change and
      grow with time.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="codeprofiling"></a>11.&nbsp;Code Profiling</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Andrea</span> <span class="surname">Aime</span></h3></div></div></div></div><div></div></div><p>Code profilers are tools which analyse performance and memory of
      applications.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="testing"></a>12.&nbsp;Test</h2></div></div><div></div></div><p>As you code, you should write a unit test for each class to test the
      functionality and robustness of the class.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both;"><a name="documentation"></a>13.&nbsp;Documentation</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Cameron</span> <span class="surname">Shorter</span></h3></div><div class="author"><h3 class="author"><span class="firstname">Artur</span> <span class="surname">Hefczyc</span></h3></div></div></div></div><div></div></div><p>This section describes how to create modular simple docbook files.</p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="quickstart"></a>13.1.&nbsp;Quick Start</h3></div></div><div></div></div><p>This <tt class="literal">quick start</tt> section will get you editing
      simple docbook sections quickly and easilly. For more detailed
      information, refer to the rest of the documentation section.</p><div class="orderedlist"><p class="title"><b>Simple steps for docbook editing</b></p><ol type="1"><li><p>Download and install a Java Virtual Machine if you have not
          already done so.</p></li><li><p>Download and install <a href="http://www.xmlmind.com/xmleditor/" target="_top">XXE</a>, a What You See is
          What You Mean (WYSIWYM) docbook editor.</p></li><li><p>If you creating a new section, then copy an existing section and
          modify it. If you are updating an existing section - well, that is
          even easier.</p><div class="example"><a name="id2806672"></a><p class="title"><b>Example&nbsp;1.&nbsp;Edit a docbook section file</b></p><pre class="programlisting">cp doclicense.xml yoursection.xml
  xxe yoursection.xml</pre></div></li><li><div class="figure"><a name="id2806683"></a><p class="title"><b>Figure&nbsp;1.&nbsp;Editing with XXE</b></p><div class="mediaobject"><img src="index_files/xxescreenshot.html" alt="Editing with XXE"></div></div><p>XXE is similar to any GUI editor. You type in the main panel and
          most of the list/table/paragraph/section/figure formatting options are
          selectable from the toolbar. Remember that simple docbook is
          structured XML. You will often need to select an XML node so you can
          specify whether the next paragraph should be part of this section or a
          new section. Select XML nodes with arrow icons:
          <span class="inlinemediaobject"><img src="index_files/xxeselecticons.html"></span></p></li><li><p>Commit your changes back into the source repository.</p></li><li><p>To publish your document after editing, either tell the main
          document author and get them to do it, or read the rest of the
          documentation section.</p></li></ol></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="whydocbook"></a>13.2.&nbsp;Why Docbook?</h3></div></div><div></div></div><p>Documentation for this project is written using <a href="http://www.oasis-open.org/committees/docbook/xml/simple/" target="_top">Simplified
      Docbook</a> format. Simplified Docbook is a subset of Docbook XML, a
      versatile format used by the <a href="http://www.linuxdoc.org/" target="_top">Linux
      Documentation Project</a> (among others).</p><p>Docbook can be easily converted into numerous output formats, like
      HTML, PDF, etc.</p><p>Using Docbook ensures documentation content is kept separate from
      presentation so content can written once and published in numerous formats
      and styles.</p><p>There are a few GUI editors for docbook now, with more editors
      promising to support docbook in the future.</p><p>According to <a href="http://www.tldp.org/HOWTO/Software-Release-Practice-HOWTO/documentation.html" target="_top">
      The Software Release's Howto</a>, docbook is the open source
      format of the future, and most of the high profile open source projects
      have moved or are moving to docbook as their coding standards. So we are
      saving ourselves pain in the future by embracing Docbook now.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="modulardocumentation"></a>13.3.&nbsp;Modular documentation</h3></div></div><div></div></div><p>Modular DocBook means content is broken up into smaller file modules
      that are recombined for publication. The advantages of modular
      documentation include:</p><div class="itemizedlist"><ul type="disc"><li><p>Reusable content units.</p></li><li><p>Smaller file units to load into an editing program.</p></li><li><p>Distributed authoring.</p></li><li><p>Finer grain version control.</p></li></ul></div><p>This project uses modular documents for it's documentation.</p><div class="example"><a name="id2806819"></a><p class="title"><b>Example&nbsp;2.&nbsp;Including sections into a master document</b></p><div class="variablelist"><dl><dt><span class="term"><tt class="filename">design.xml</tt></span></dt><dd><pre class="programlisting">&lt;?xml version='1.0' encoding='UTF-8'?&gt;
  &lt;!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
  "http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd"&gt;
  &lt;article
  id="index"&gt;
    &lt;articleinfo&gt;
      &lt;title&gt;Software Design Description&lt;/title&gt;
    &lt;/articleinfo&gt;
  
    &lt;section id="scope"&gt;
      &lt;title&gt;Scope&lt;/title&gt;
  
      &lt;xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
      href="doclicense.xml"/&gt;
    &lt;/section&gt;
  &lt;/article&gt;</pre></dd><dt><span class="term"><tt class="filename">doclicense.xml</tt></span></dt><dd><pre class="programlisting">&lt;?xml version='1.0' encoding='UTF-8'?&gt;
  &lt;!DOCTYPE section PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
  "http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd"&gt;
  &lt;section id="licence"&gt;
    &lt;title&gt;License.&lt;/title&gt;
  
    &lt;para&gt;Copyright (c) 2002 Cameron Shorter. Permission is granted to copy,
    distribute and/or modify this document under the terms of the &lt;ulink
    url="http://www.fsf.org/copyleft/fdl.html"&gt;GNU Free Documentation License&lt;/ulink&gt;,
    Version 1.1 or any later version published by the Free Software Foundation;
    with the Invariant Sections being with no Invariant Sections, with the
    Front-Cover Texts being no Front-Cover Texts, and with the Back-Cover Texts
    being no Back-Cover Texts.&lt;/para&gt;
  &lt;/section&gt;</pre></dd></dl></div></div><p>If you want to document a new module, you need to write a new
      <tt class="filename">module.xml</tt> section file, and then add an
      <tt class="literal">&lt;xi:include&gt;</tt> tag into <tt class="filename">design.xml</tt>.</p><p>Notice in the above example that <span class="emphasis"><em>&lt;section&gt;</em></span>
      tags contain an <span class="emphasis"><em>id</em></span> attribute. This means the URL of
      published sections will be human readable, something like
      <tt class="filename">http://net.sourceforge.generguide/docs/design.html#licence</tt> instead
      of <tt class="filename">http://net.sourceforge.generguide/docs/design.html#id2754172</tt>.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="publishingdocbook"></a>13.4.&nbsp;Publishing docbook files</h3></div></div><div></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="publishmasterdocs"></a>13.4.1.&nbsp;Publishing using xsltproc</h4></div></div><div></div></div><p>Publishing modular documents is possible with xsltproc. At the time
          of writing, other XSLT engines don't process modular documents yet
          because the &lt;xi:include&gt; tags cause the XML to be invalid. (To
          do, check to see if Saxon and Xalan support &lt;xi:include&gt;
          yet.)</p><p>Instructions on installing and using xsltproc can be found at:
          <a href="http://www.sagehill.net/xml/docbookxsl" target="_top">http://www.sagehill.net/xml/docbookxsl</a>.</p><div class="example"><a name="id2806946"></a><p class="title"><b>Example&nbsp;3.&nbsp;Using xsltproc to publish modular docbook files</b></p><pre class="programlisting">xsltproc --xinclude --novalid -o index.html
            docbook-xsl/html/docbook.xsl  main.xml</pre></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="publishingwithant"></a>13.4.2.&nbsp;Publishing using ant/maven</h4></div></div><div></div></div><p><tt class="filename">ant</tt> can publish standard simple docbook files
          but cannot publish modular docbook files because they are not valid XML.
          Hopefully this will change in future.</p><p>In version 1.5, ant has a bug which prevents it from publishing more
          than one docbook document at a time. The workaround is to run
          <tt class="filename">ant</tt> a number of times. Earlier versions of
          <tt class="filename">ant</tt> have more bugs and less functionality.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="publishusingmaven"></a>13.4.3.&nbsp;Publishing using maven</h4></div></div><div></div></div><p>Maven allows uses to process docbook to (arnika/velocity?) and then
          to html. Since maven is based on ant, it also cannot process modular
          docbook files yet and at the time of writing, this functionality was
          still very bug ridden. Hopefully it will improve soon.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="documentationpublishwithjava"></a>13.4.4.&nbsp;Publishing using java tools.</h4></div></div><div></div></div><p></p><div class="section" lang="en"><div class="titlepage"><div><div><h5 class="title"><a name="documentationpublishwithxsl"></a>13.4.4.1.&nbsp;Joining document parts using XSL template defined in
            <tt class="filename">selectivexinclude.xsl</tt>.</h5></div></div><div></div></div><p>To process XML files containing xinclude elements you need only 2
            things:</p><div class="orderedlist"><ol type="1"><li><p>XSL template containing transformation including external
                documents parts. Good implementation is in
                <tt class="filename">selectivexinclude.xsl</tt> file available at address on
                <a href="http://dev.w3.org/cvsweb/%7Echeckout%7E/2002/issues/xsl/selectivexinclude.xsl?rev=1.1&amp;content-type=text/plain" target="_top">dev.w3.org</a> 
                site.</p></li><li><p>Any XSL processor. Described above
                <tt class="filename">xsltproc</tt> available from <a href="http://xmlsoft.org/XSLT/index.html.orig" target="_top">xmlsoft</a> or
                <tt class="systemitem">saxon</tt> available from
                <a href="http://saxon.sourceforge.net/" target="_top">saxon site</a> or
                <tt class="systemitem">xalan</tt> which is one of
                projects on <a href="http://xml.apache.org/xalan-j/index.html" target="_top">xml.apache.org</a>. 
                All these tools are good for simple cases. However each of them
                offers different extensions so you choice depends of your unusual
                needs. However the use of <tt class="filename">xsltproc</tt> to join
                parts of modular documentation with
                <tt class="filename">selectivexinclude.xsl</tt> seems to not make great sense
                because of built-in support for XInclude into xsltproc.</p><p>Java users often ask a question: <tt class="systemitem">saxon</tt> or <tt class="systemitem">xalan</tt>? As I said above, if you need
                only standard XSLT processing they both are the same, they both
                (current stable versions: xalan-2.5.1, saxon-6.5.3) implement full
                XSLT 1.0 version and XPath 1.0 version. Current saxon development
                version: 7.6.5 implements XSLT-2.0 and XPath-2.0 and it is worth
                to note that the author of <tt class="systemitem">saxon</tt> library - Michael Kay is
                editor of the XSLT-2.0 spec. On the other side <tt class="systemitem">xalan</tt> is accepted library by SUN
                and is included with their JDK-1.4 and above what, on the third
                side, causes some problems when you want to use more recent
                <tt class="systemitem">xalan</tt> version than the
                one included in JDK.</p></li></ol></div><p>Below are presented sample commands for each of 2 java tools for
            generating target, one XML document from modular documentation. These
            samples are tested with the most recent versions: <tt class="systemitem">saxon-7.6.5</tt> and <tt class="systemitem">xalan-2.5.1</tt> and some parameters may not
            work with earlier versions.</p><div class="itemizedlist"><ul type="disc"><li><p><tt class="filename">masterxmlfile.xml</tt> is source file
                containing XInclude elements.</p></li><li><p><tt class="filename">targetalldoc.xml</tt> is target file
                containing included content of external files in place of XInclude
                elements.</p></li><li><p><tt class="filename">selectivexinclude.xsl</tt> is XSL template containing
                transformation definition for including content from external
                files.</p></li><li><p><tt class="systemitem">LIB</tt> is an
              environment variable pointing to directory on your disk where you
                keep <tt class="filename">JAR</tt> files.</p></li></ul></div><p>Below are 2 kinds of commands. The simpler showing XSL inclusion
            only and a little bit more complex presenting also how to use
            <tt class="systemitem">CATALOGS</tt> with these tools.
            There are some additional elements in these commands: <tt class="filename">resolver.jar</tt> - library resolving URL
            to DTDs stored on your local file system and <tt class="filename">$PROJECTS_HOME/sgml</tt> - a directory where
            is placed <tt class="filename">CatalogManager.properties</tt> - file
            providing the same function as <tt class="systemitem">SGML_CATALOG_FILES</tt> environment
            variable. More information about using <tt class="systemitem">CATALOGS</tt> you can find in section
            <i class="citetitle">Tools and methods for XML processing.</i></p><div class="example"><a name="id2807286"></a><p class="title"><b>Example&nbsp;4.&nbsp;Sample <tt class="systemitem">bash</tt> command
              for <tt class="systemitem">saxon</tt>.</b></p><pre class="programlisting">export SAXON_CLASSPATH=$LIBS/saxon.jar
  java -cp $SAXON_CLASSPATH net.sf.saxon.Transform \
      -w0 -u \
      -o targetalldoc.xml \
      masterxmlfile.xml selectivexinclude.xsl</pre></div><div class="example"><a name="id2807314"></a><p class="title"><b>Example&nbsp;5.&nbsp;Sample <tt class="systemitem">bash</tt> command
              for <tt class="systemitem">saxon</tt> using <tt class="systemitem">CATALOGS</tt>.</b></p><pre class="programlisting">export SAXON_CLASSPATH=$SAXON_CLASSPATH:$LIBS/resolver.jar:$PROJECTS_HOME/sgml
  java -cp $SAXON_CLASSPATH net.sf.saxon.Transform \
      -x org.apache.xml.resolver.tools.ResolvingXMLReader \
      -y org.apache.xml.resolver.tools.ResolvingXMLReader \
      -r org.apache.xml.resolver.tools.CatalogResolver \
      -w0 -u \
      -o targetalldoc.xml \
       masterxmlfile.xml selectivexinclude.xsl</pre></div><p>Please remark below examples. If you work with <tt class="systemitem">JDK-1.4</tt> or later you can not use
            <tt class="systemitem">CLASSPATH</tt> to point to your
            <tt class="systemitem">xalan</tt> jar file. There is some
            <tt class="systemitem">xalan</tt> version included with
            <tt class="systemitem">JDK-1.4</tt>, unfortunately
            outdated, and it is loaded first before classes given in <tt class="systemitem">CLASSPATH</tt>. To enforce the use of your
            classes you must put them in <tt class="systemitem">BOOTCLASSPATH</tt> as presented
            below.</p><div class="example"><a name="id2807408"></a><p class="title"><b>Example&nbsp;6.&nbsp;Sample <tt class="systemitem">bash</tt> command
              for <tt class="systemitem">xalan</tt>.</b></p><pre class="programlisting">export XALAN_CLASSPATH=$LIBS/xalan.jar:$LIBS/xercesImpl.jar:$LIBS/xsml-apis.jar
  java -Xbootclasspath/p:$XALAN_CLASSPATH org.apache.xalan.xslt.Process \
      -in masterxmlfile.xml -xsl selectivexinclude.xsl \
      -out targetalldoc.xml</pre></div><div class="example"><a name="id2807436"></a><p class="title"><b>Example&nbsp;7.&nbsp;Sample <tt class="systemitem">bash</tt> command
              for <tt class="systemitem">xalan</tt> using <tt class="systemitem">CATALOGS</tt>.</b></p><pre class="programlisting">export XALAN_CLASSPATH=$XALAN_CLASSPATH:$LIBS/resolver.jar:$PROJECTS_HOME/sgml
  java -Xbootclasspath/p:$XALAN_CLASSPATH org.apache.xalan.xslt.Process \
      -ENTITYRESOLVER org.apache.xml.resolver.tools.CatalogResolver \
      -URIRESOLVER org.apache.xml.resolver.tools.CatalogResolver \
      -in masterxmlfile.xml -xsl selectivexinclude.xsl \
      -out targetalldoc.xml</pre></div></div></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="docbookeditors"></a>13.5.&nbsp;Docbook Editors</h3></div></div><div></div></div><p>You can edit docbook with the following free tools:</p><div class="itemizedlist"><ul type="disc"><li><p><a href="http://www.xmlmind.com/xmleditor/" target="_top">XXE</a> is a
          java based, <span class="emphasis"><em>What You See Is What You Mean (WYSIWYM)</em></span>
          editor. It provides a slightly clunky but workable GUI interface for
          editing Docbook documents. It is well worth trying.</p></li><li><p><a href="http://www.netbeans.org/" target="_top">Netbeans</a>: Simple
          Docbook is XML, so XML editors work well. Netbeans has a nice XML
          plugin which I use.</p></li><li><p><a href="http://www.vim.org/" target="_top">vim</a> and <a href="http://www.gnu.org/software/emacs/emacs.html" target="_top">emacs</a>, or
          any text editor can be used.</p></li><li><p>There are a number of WYSIWYM editors developing Docbook
          export/import functionality at the time of writing. Of note, <a href="http://www.openoffice.org/" target="_top">Open Office</a> and <a href="http://localhost/cgi-bin/www.lyx.org" target="_top">Lyx</a> look promising.</p></li><li><p>Viewing Docbook: Tomas has written a useful web page for viewing
          Docbook pages at <a href="http://localhost/cgi-bin/processconfig.pl???" target="_top">http://www.cartesia.org/modules.php?op=modload&amp;name=NS-Docbook&amp;file=index</a>.</p></li></ul></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="docbookreferences"></a>13.6.&nbsp;Docbook References</h3></div></div><div></div></div><p>There are a few references worth knowing:</p><div class="itemizedlist"><ul type="disc"><li><p><a href="http://www.tldp.org/LDP/LDP-Author-Guide/" target="_top">The Linux
          Documentation Project Author Guide</a> provides an introduction to
          Docbook and some of the key tags.  Note that this project uses
          Simplified Docbook which is XML based. There are numerous versions of
          Docbook which makes things confusing.</p></li><li><p><a href="http://www.docbook.org/tdg/simple/en/html/sdocbook.html" target="_top">Simplified
          Docbook, the Definitive Guide</a> provides comprehensive
          documentation about all the Simplified Docbook tags.</p></li><li><p><a href="http://www.sagehill.net/xml/docbookxsl/index.html" target="_top">Using
          the Docbook XSL Stylesheets</a>, in particular, the section on
          <a href="http://www.sagehill.net/xml/docbookxsl/ModularDoc.html" target="_top">writing
          modular docbook files</a>.</p></li><li><p><a href="http://xincluder.sourceforge.net/" target="_top">Xincluder</a>
          is a java open source project for processing <span class="emphasis"><em>xinlcude</em></span>
          tags, which might be able to be used to by maven to publish modular
          docbook documents.</p></li></ul></div></div></div></div></body></html>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/developersguide/release.xml
  
  Index: release.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE section PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
  "http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd">
  <section>
    <title>mapbuilder-lib release process</title>
  
    <para>This article describes the steps to follow when building a
    mapbuilder-lib release.</para>
  
    <variablelist>
      <varlistentry>
        <term>Install programs required for build</term>
  
        <listitem>
          <para>In order to build the documentation, you will need the following
          installed:</para>
  
          <orderedlist>
            <listitem>
              <para>xsltproc, install procedure at: <ulink
              url="http://www.sagehill.net/docbookxsl/InstallingAProcessor.html#InstallXsltproc">http://www.sagehill.net/docbookxsl/InstallingAProcessor.html#InstallXsltproc</ulink>.</para>
            </listitem>
  
            <listitem>
              <para>perl and the Template.PM perl module which is used by jsdoc.
              Refer to install instructions at: <ulink
              url="http://jsdoc.sourceforge.net/#install">http://jsdoc.sourceforge.net/#install</ulink>.</para>
            </listitem>
          </orderedlist>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Notify developers that you are about to make a release</term>
  
        <listitem>
          <para>At least 24 hours before building a release, send an email to
          the mapbuilder-lib developers notifying them you are about to cut a
          release. This should allow them to ensure their fixes are in the code
          base.</para>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Check all code back into CVS</term>
  
        <listitem>
          <para>If you have not done so already, check all the code you have
          been editing into CVS.</para>
  
          <programlisting>cvs commit -m"Fixed xxx bugs" &lt;filenames&gt;</programlisting>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Update the CHANGES file</term>
  
        <listitem>
          <para>Update and commit CHANGES file with updates between the last
          release and this one. These files should be in the base
          directory.</para>
  
          <para>Each update should contain:</para>
  
          <itemizedlist>
            <listitem>
              <para>Release name.</para>
            </listitem>
  
            <listitem>
              <para>Status - alpha, beta, stable</para>
            </listitem>
  
            <listitem>
              <para>Description of changes.</para>
            </listitem>
  
            <listitem>
              <para>List of problems fixed since last build:</para>
  
              <itemizedlist>
                <listitem>
                  <para>Select Bugs on sourceforge site: <ulink
                  url="https://sourceforge.net/tracker/?group_id=35246&amp;atid=413775">https://sourceforge.net/tracker/?group_id=35246&amp;atid=413775</ulink></para>
                </listitem>
  
                <listitem>
                  <para>Select Status=Closed, Group=[last release], Sort
                  By=Priority</para>
                </listitem>
              </itemizedlist>
            </listitem>
  
            <listitem>
              <para>List of known outstanding problems.</para>
  
              <itemizedlist>
                <listitem>
                  <para>Select Bugs on sourceforge site: <ulink
                  url="https://sourceforge.net/tracker/?group_id=35246&amp;atid=413775">https://sourceforge.net/tracker/?group_id=35246&amp;atid=413775</ulink></para>
                </listitem>
  
                <listitem>
                  <para>Select Status=Open, Group=[last release]</para>
                </listitem>
              </itemizedlist>
            </listitem>
  
            <listitem>
              <para>Commit CHANGES back into CVS.</para>
            </listitem>
          </itemizedlist>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Get latest updates from CVS</term>
  
        <listitem>
          <para>Ensure you have the latest files from CVS.</para>
  
          <programlisting>cd mapbuilder/
  cvs update -d .</programlisting>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Tag the release</term>
  
        <listitem>
          <para>Tag the files that should be in the release. (Usually, not all
          files in CVS are included in a release).</para>
  
          <para>The &lt;tag&gt; should be of the form:
          <literal>mapbuilder-lib-[number]-[status]</literal></para>
  
          <para>For example:</para>
  
          <itemizedlist>
            <listitem>
              <para>mapbuilder-lib-0_1</para>
            </listitem>
  
            <listitem>
              <para>mapbuilder-lib-0_1-rc3</para>
            </listitem>
  
            <listitem>
              <para>mapbuilder-lib-0_2-alpha</para>
            </listitem>
          </itemizedlist>
  
          <programlisting>cd mapbuilder/
  cvs tag &lt;tag&gt; bin CHANGES demo design docs LGPL index.html lib LICENSE metrics README server</programlisting>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Create a temporary directory</term>
  
        <listitem>
          <programlisting>mkdir ~/tmp
  </programlisting>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Export the release</term>
  
        <listitem>
          <para>Exporting code from CVS is the same as checking it out, except
          that the CVS/ directories are not checked out as well.</para>
  
          <programlisting>cd ~/tmp
  export CVS_RSH=ssh
  export CVSROOT=:ext:camerons at cvs.sourceforge.net:/cvsroot/mapbuilder
  cvs export -r &lt;tag&gt; mapbuilder</programlisting>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Build the distribution</term>
  
        <listitem>
          <programlisting>cd ~/tmp/mapbuilder/bin
  ant dist
  </programlisting>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Check WAR file</term>
  
        <listitem>
          <programlisting>$CATALINA_HOME/bin/shutdown.sh
  cp ~/tmp/dist/mapbuilder-lib-[version]-war.zip $CATALINA_HOME/webapps
  unzip mapbuilder-lib-[version]-war.zip
  $CATALINA_HOME/bin/startup.sh</programlisting>
  
          <para>In a broswer, view all the demos at <ulink
          url="http://localhost:8080/mapbuilder/demo">http://localhost:8080/mapbuilder/demo</ulink></para>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Ftp release file Sourceforge</term>
  
        <listitem>
          <para>Refer to the Sourceforge <ulink
          url="http://sourceforge.net/docman/display_doc.php?docid=6445&amp;group_id=1#frsinterface">File
          Release System</ulink> for more information.</para>
  
          <itemizedlist>
            <listitem>
              <para>ftp to upload.sourceforge.net</para>
            </listitem>
  
            <listitem>
              <para>login as "anonymous"</para>
            </listitem>
  
            <listitem>
              <para>use email address as password</para>
            </listitem>
  
            <listitem>
              <para>set ftp client to binary mode</para>
            </listitem>
  
            <listitem>
              <para>cd /incoming (on the server)</para>
            </listitem>
  
            <listitem>
              <para>upload release file(s)</para>
            </listitem>
          </itemizedlist>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Move to mapbuilder release directory</term>
  
        <listitem>
          <itemizedlist>
            <listitem>
              <para>From the <ulink
              url="http://sourceforge.net/projects/generguide">https://sourceforge.net/projects/mapbuilder</ulink>,
              select <literal>Admin</literal>, <literal>File Releases</literal>,
              <literal>Add Release (for mapbuilder-lib)</literal>.</para>
            </listitem>
  
            <listitem>
              <para>Walk through the various forms. For description of changes,
              use the text from the CHANGES file.</para>
  
              <variablelist>
                <varlistentry>
                  <term>Select release name</term>
  
                  <listitem>
                    <para>Something like: mapbuilder-lib-0.2-alpha . Note that
                    underscores have been replaced with full stops.</para>
                  </listitem>
                </varlistentry>
  
                <varlistentry>
                  <term>Step 1</term>
  
                  <listitem>
                    <para>Notes comes from the description of release and
                    Outstanding Bugs in the mapbuilder/CHANGES file.</para>
  
                    <para>Changes comes from the Bugs Fixed in
                    mapbuilder/CHANGES file.</para>
                  </listitem>
                </varlistentry>
  
                <varlistentry>
                  <term>Step 2</term>
  
                  <listitem>
                    <para></para>
                  </listitem>
                </varlistentry>
  
                <varlistentry>
                  <term>Step 3</term>
  
                  <listitem>
                    <para>Processor=Any, File Type=.zip</para>
                  </listitem>
                </varlistentry>
  
                <varlistentry>
                  <term>Step 4</term>
  
                  <listitem>
                    <para></para>
                  </listitem>
                </varlistentry>
              </variablelist>
            </listitem>
          </itemizedlist>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Download and test</term>
  
        <listitem>
          <para>Download the release from sourceforge, uncompress it, and check
          it.</para>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Copy to Sourceforge demo directory</term>
  
        <listitem>
          <programlisting>scp ~/tmp/mapbuilder/dist/mapbuilder-lib-[version].zip \
    username at mapbuilder.sf.net
  ssh -l username mapbuilder.sf.net
  unzip mapbuilder-lib-[version].zip
  mv mapbuilder /home/groups/m/ma/mapbuilder/htdocs/mapbuilder-lib-[version]
  cd /home/groups/m/ma/mapbuilder/htdocs
  rm mapbuilder
  ln -s mapbuilder-lib-[version] mapbuilder</programlisting>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Update links on the mapbuilder demo's webpage</term>
  
        <listitem>
          <para>Edit links on <ulink
          url="http://mapbuilder.sourceforge.net/?q=taxonomy/term/5">http://mapbuilder.sourceforge.net/?q=taxonomy/term/5</ulink></para>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Install release on the Demonstration server</term>
  
        <listitem>
          <programlisting>scp ~/tmp/mapbuilder/dist/mapbuilder-lib-0.3.1-alpha-war.zip bikemap.openearth.com.au:
  ssh bikemap.openearth.com.au
  unzip mapbuilder-lib-0.3.1-alpha-war.zip
  mv mapbuilder.war $CATALINA_HOME/webapps/mapbuilder-lib-0.3.1-alpha.war</programlisting>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Email release message</term>
  
        <listitem>
          <para>Send an email notification to
          mapbuilder-announce at lists.sourceforge.net with text from the CHANGES
          file.</para>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Create a new group in in the Sourceforge bug list</term>
  
        <listitem>
          <para>Note: This step requires Administrator prividges on the
          Sourceforge Mapbuilder project.</para>
  
          <para>Select Bugs-&gt;Admin-&gt;Bugs-&gt;Add/Update Group</para>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Select all the Open bugs</term>
  
        <listitem>
          <para>Select Bugs, then</para>
  
          <para>Assignee=Any</para>
  
          <para>Status=Open</para>
  
          <para>Catagory=mapbuilder-lib</para>
  
          <para>Group=Any</para>
  
          <para>Then press the Browse button.</para>
        </listitem>
      </varlistentry>
  
      <varlistentry>
        <term>Set all Open bugs to the new release group</term>
  
        <listitem>
          <para>Down the bottom of the bug list, select "Check All" to select
          all Open bugs.</para>
  
          <para>Select Group=The new release group.</para>
  
          <para>Select "Mass Update"</para>
        </listitem>
      </varlistentry>
    </variablelist>
  </section>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/help/IEActiveXSettings.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/help/IESetup.html
  
  Index: IESetup.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  
  <HTML>
    <HEAD>
      <TITLE>Mapbuilder: Help for  IE security configuration</TITLE>
      <link rel='StyleSheet' type='text/css' href='/mapbuilder/lib/skin/default/docsStyle.css'>
    </HEAD>
    <BODY>
      <H1>Mapbuilder: Help for  IE security configuration</H1>
      <p>
        It appears that your security settings in MS Internet Explorer are set to high to allow this application to run.
        The problem is that ActiveX controls aren't being permitted to run.
        In order to see this application run (and it's worth seeing!) you can:
      </p>
      <dl>
        <dt style="clear:both">Use Firefox (or other Mozilla-based browsers)
        </dt>
        <dd>
  <a href="http://www.spreadfirefox.com/?q=affiliates&amp;id=0&amp;t=67">
  <img border="0" alt="Get Firefox!" title="Get Firefox!" src="http://sfx-images.mozilla.org/affiliates/Buttons/88x31/trust.gif" style="float:left;clear:left"/></a>
  works out of the box ;-)
      </dd>
        <dt style="clear:both">Add this site to the "Trusted sites" list for IE.</dt>
        <dd><img border="0" src="IETrusted.png" style="float:left;clear:left"/>
  Click on the "Tools" menu item, then "Internet Options", then select the "Security" tab.
        Then select the "Trusted Sites" zone and the "Sites" button.
        Add the URL for this web site to the list.
        Reload the page that you came from.
      </dd>
        <dt style="clear:both">Change your security settings for the Internet zone</dt>
        <dd><img border="0" src="IEActiveXSettings.png" style="float:left;clear:left"/>
  Click on the "Tools" menu item, then "Internet Options", then select the "Security" tab.
        Then select the "Internet" zone and the "Custom level" button.
        Scroll to find the section for "ActiveX controls and plugins".
        Make sure that all the radio buttons are set to either "prompt" or "enable".
        If you set the state to "prompt", you will be asked if ActiveX controls should be allowed
        to run whenever they are required.
        If you trust the site, allow them to run when prompted.
      </dd>
      </dl>
      
    
    </BODY>
  </HTML>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/help/IETrusted.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/presentations/OSG05TechSession.ppt
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/presentations/StateOfPlay.xml
  
  Index: StateOfPlay.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
  "http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd">
  <article>
    <title>Community Mapbuilder State Of Play - June 2005</title>
  
    <abstract>
      <para>I think that we have reached a stage in the Mapbuilder project where
      we should look at what we have achieved, look at the state of the software
      world around us, and plan our future.</para>
  
      <para>We have recently seen a number of new names join the Mapbuilder
      email list and I invite all our you to contribute to this
      discussion.</para>
    </abstract>
  
    <section>
      <title>Where have we come from?</title>
  
      <para>The Community Mapbuilder website started in 2001 as my idea to build
      a Geo-Wiki and was originally planned to bring together WMS/WFS-T
      components into one easy to configure application. The only thing missing
      was a WFS-T client and I started working on the developing Geotools
      library to create a Java client.</para>
  
      <para>In 2003 Raj Singh demonstrated the potential of a web based client
      by producing the first prototype web based feature entry client which
      talked directly to a database. From then we started mapbuilder-lib,
      initially a WMS client, then a WFS-T client which conformed to OGC
      standards.</para>
  
      <para>As we developed further, we joined efforts with Nedjo Rodgers, Mike
      Adair, Tom Kralidis and Tom Schuller who were all working on similar
      projects. Mapbuider-lib broadened it's scope from being a geo-wiki to
      being a robust client to OGC services.</para>
  
      <para>In mid 2005, Geoserver, an open source WFS-T included mapbuilder-lib
      in it's distribution and Mapbuilder started gaining more interest and
      attracted more developers.</para>
    </section>
  
    <section>
      <title>What are Mapbuilder's Strengths?</title>
  
      <variablelist>
        <varlistentry>
          <term>WMS/WFS-T in a browser</term>
  
          <listitem>
            <para>Mapbuilder runs in a standard web browser without requiring
            any plug ins. This makes Mapbuilder easy to use for non-technical
            users.</para>
  
            <para>Clients are fast and feature rich because most code is stored
            in the client, accessing Web Services using Asynchronous Javascript
            And XML (AJAX).</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Modular design</term>
  
          <listitem>
            <para>Mapbuilder's modular design makes it easy to add extra
            functionality.</para>
  
            <para>Tailored clients are kept small by only including the required
            modules.</para>
  
            <para>We have the opportunity to factor out core modules (like our
            projection libraries) to be used and improved by other
            projects.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Standards compliant</term>
  
          <listitem>
            <para>Standards compliance means that Mapbuilder can build upon the
            great work done in the Open GIS services projects.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Strong user community</term>
  
          <listitem>
            <para></para>
          </listitem>
        </varlistentry>
      </variablelist>
    </section>
  
    <section>
      <title>What software industry developments effect us?</title>
  
      <para>The advantage of working with Open Source software is that we don't
      need to look at competing projects as threats, they are potential
      partners. Together we can help each other become better.</para>
  
      <section>
        <title>Asynchronous Javascript And XML (AJAX)</title>
  
        <para>AJAX describes a way for web browsers to refresh themselves
        quickly using asynchronous javascript functions. This functionality has
        been available for a couple of years but has only recently become
        popular since it's use by high profile Google web sites.</para>
  
        <para>Recently, a hand full of AJAX library projects have started and
        have a strong user base behind them. These project are young and
        Mapbuilder still contains a significant amount of AJAX functionality
        beyond that provided by the libraries. In particular, Mapbuilder's
        Model/View/Controller design pattern and dynamic loading of widgets
        would be a useful addition to the AJAX libraries.</para>
  
        <para>The Mapbuilder project should consider factoring out it's AJAX
        libraries and merging them into one of the existing AJAX library
        projects.</para>
      </section>
  
      <section>
        <title>Other Web Based Geographic Clients</title>
  
        <para>Mapbuilder currently has a number of features not yet provided by
        other Web Mapping Clients, however, there are some features from other
        projects that would be nice to include. Where possible, we should try to
        collaborate with these projects and merge our efforts. We can do this by
        factoring out and sharing common libraries or merging our efforts into
        one project.</para>
      </section>
  
      <section>
        <title>Geoserver</title>
  
        <para>Geoserver, the Open Source WMS/WFS has incorporated Mapbuilder
        into it's release. This is a good relationship for us because:</para>
  
        <itemizedlist>
          <listitem>
            <para>We are getting exposure with our core potential user
            base.</para>
          </listitem>
  
          <listitem>
            <para>We are seeing developers join Mapbuilder from the Geoserver
            project.</para>
          </listitem>
        </itemizedlist>
  
        <para>Gabriel Roland pointed out that we can make cross development
        easier by using similar tools. In particular, we should consider moving
        some functionality from Sourceforge to <ulink
        url="http://www.codehaus.org/">http://www.codehaus.org/</ulink>.</para>
      </section>
  
      <section>
        <title>Geographic Wiki</title>
  
        <para>Significant interest is developing for a Geographic Wiki, where
        many people can collaboratively build geographic maps. Mapbuilder would
        be an ideal client for a Geographic Wiki and we should aim be involved
        in any such project.</para>
  
        <para>This will introduce a many new challenges, like handling user
        authentication.</para>
      </section>
  
      <section>
        <title>Content Management Systems (CMS)</title>
  
        <para>Content Management Systems are one of the big potential users of
        Map Viewers and Feature Entry Clients. Unfortunately there are hundreds
        of CMS products and there doesn't seem to be a standard
        interface.</para>
  
        <para>Java CMS seem to be a better position with standard portlet
        specifications and we may be able to target these first.</para>
  
        <para>Nedjo Rodgers notes that Mapbuilder contains many components
        needed by CMSs and that different CMSs will all face similar problems.
        We should encourage the development of a CMS integration toolkit.</para>
      </section>
  
      <section>
        <title>Browser support for SVG</title>
  
        <para>It seems that version 7 browsers will provide SVG support by
        default. This means that we can make use of SVG's more powerful
        rendering and we can expect average users will still be able to use our
        web pages.</para>
      </section>
  
      <section>
        <title>Use stable release numbers</title>
  
        <para>Mike Adair notes that potential users are scared by our "alpha"
        version numbers. We should create a 1.0 release and advertise the
        existence of applications using Mapbuilder.</para>
      </section>
    </section>
  
    <section>
      <title>Opportunities for improvement</title>
  
      <section>
        <title>Testing</title>
  
        <para>With only two core developers, and while software was still in
        alpha state we were able to get away without automated testing. However
        we are now at a stage where we should consider automated testing
        frameworks like jsunit.</para>
  
        <para>Advantages of automated testing includes:</para>
  
        <itemizedlist>
          <listitem>
            <para>We can easily test Mapbuilder against new browsers and
            platforms as they become available.</para>
          </listitem>
  
          <listitem>
            <para>We can test our updates don't break another part of the code.
            This is more important as the software becomes more complex and
            there are more developers working on sections we are not familiar
            with.</para>
          </listitem>
  
          <listitem>
            <para>Software can be released more frequently because the head
            version of the software should always be working.</para>
          </listitem>
  
          <listitem>
            <para>Our releases should become more robust.</para>
          </listitem>
        </itemizedlist>
      </section>
  
      <section>
        <title>Design Patterns</title>
  
        <para>There are a number of areas in Mapbuilder which could be improved
        by the introduction of design patterns. Good use of design patterns will
        simplify the code and make it easier to maintain. We should review then
        refactor our code for this.</para>
      </section>
  
      <section>
        <title>Memory Leaks</title>
  
        <para>Memory leaks in a browser can cause a browser to crash or
        significantly slow a computer down. We were not considering Memory Leaks
        when writing the code, so they probably exist. We should be able to
        minimise Memory Leaks if we use an AJAX library which addresses
        leaks.</para>
      </section>
  
      <section>
        <title>Documentation</title>
  
        <para>While we have made a start our documentation needs to be updated.
        Good documentation is essential for attracting and keeping potential
        developers.</para>
  
        <para>Nedjo Rodgers and others noted that we need concrete guides for
        developers. For example, A guide for creating widgets. This should be
        combined with mentoring from core developers.</para>
  
        <para>Chris Holmes noted that it is easier to build documentation in a
        wiki as it is continuously updated by users. In particular we should
        consider using Codehaus.</para>
      </section>
  
      <section>
        <title>Professional Look and Feel</title>
  
        <para>Feedback I've been getting often includes "The technology is
        great, but we need a sexy interface to sell Mapbuilder to decision
        makers". We need to provide a sexy interface to Mapbuilder and we need
        to ensure we have a stable demonstration release.</para>
      </section>
    </section>
  
    <section>
      <title>Recommendations</title>
  
      <variablelist>
        <varlistentry>
          <term>AJAX</term>
  
          <listitem>
            <para>Contact AJAX library projects, suggest working toward a common
            AJAX library then coordinate exporting Mapbuilder functionality into
            one of these projects.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Projection Libraries</term>
  
          <listitem>
            <para>Export the projection libraries into a separate project so it
            can be used by other projects.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Review design</term>
  
          <listitem>
            <para>Review the design, introduce design patterns, refactor
            code.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Update documentation</term>
  
          <listitem>
            <para>In particular, concrete examples of how developers should do
            specific tasks (like creating a widget).</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Produce a Professional Look and Feel</term>
  
          <listitem>
            <para></para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Codehaus</term>
  
          <listitem>
            <para>We should ask if we can get Mapbuilder hosted on
            http://www.codehaus.org. It provides subversion, better bug
            tracking, a wiki for documentation, and is used by Geoserver and
            Geotools, projects which we aim to align ourselves with.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>SVG</term>
  
          <listitem>
            <para>We should encourage developers who may be interested in adding
            SVG support.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>CMS</term>
  
          <listitem>
            <para>We should encourage the development of a CMS integration HOWTO
            and collaboration from people integrating Mapbuilder into different
            CMSs.</para>
          </listitem>
        </varlistentry>
  
        <varlistentry>
          <term>Create a 1.0 release</term>
  
          <listitem>
            <para>We should create a 1.0 release and advertise the existence of
            applications using Mapbuilder.</para>
          </listitem>
        </varlistentry>
      </variablelist>
    </section>
  </article>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/presentations/TimeSeriesEOGEO05.ppt
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/ObjectDetails.xsl
  
  Index: ObjectDetails.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:out="http://www.w3.org/dummyXSL" >
  
  <!--
  Description: Generate the component register from the config XML schema.
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8" indent="yes"/>
    <xsl:param name="objectType">AoiBoxType</xsl:param>
    <xsl:variable name="docRoot" select="/xs:schema"/>
  
  	<xsl:template match="/xs:schema">
      <dl>
        <h3><xsl:value-of select="$objectType"/></h3>
        <xsl:apply-templates select="xs:complexType[@name=$objectType]"/>
      </dl>
  	</xsl:template>
    
  	<xsl:template match="xs:complexType">
      <xsl:apply-templates select="xs:sequence/xs:element"/>
      <xsl:apply-templates select="xs:complexContent/xs:extension"/>
  	</xsl:template>
    
  	<xsl:template match="xs:extension">
      <xsl:param name="objectType" select="substring-after(@base,':')"/>
      <xsl:apply-templates select="xs:sequence/xs:element"/>
      <xsl:apply-templates select="$docRoot/xs:complexType[@name=$objectType]"/>
  	</xsl:template>
    
  	<xsl:template match="xs:element">
      <dt><xsl:value-of select="@name"/> (<xsl:value-of select="@type"/>)</dt>
      <dd><xsl:value-of select="xs:annotation/xs:documentation"/></dd>
  	</xsl:template>
    
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/ObjectList.js
  
  Index: ObjectList.js
  ===================================================================
  /*
  Author:       Tom Kralidis
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * Widget to display predefined locations (as per schema at lib/model/schemas/locations.xsd)
   * into a HTML select box. Changing a location will set the AOI of the targetModel.
   * TBD: projection coordinate conversion still to be implemented.
   * @constructor
   * @base WidgetBase
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  
  function ObjectList(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
  /**
   * Change the AOI coordinates from select box choice of prefined locations
   * @param bbox the bbox value of the location keyword chosen
   * @param targetModel the model on which to set the AOI
   */
    this.showDetails = function(objectType) {
      var details = config.objects.objectDetails;
      details.stylesheet.setParameter("objectType",objectType);
      details.paint(details);
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/ObjectList.xsl
  
  Index: ObjectList.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:out="http://www.w3.org/dummyXSL" >
  
  <!--
  Description: Generate the component register from the config XML schema.
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8" indent="yes"/>
    
    <xsl:param name="widgetId"/>
    <xsl:param name="listType">modelsType</xsl:param>
    <xsl:param name="subType"/>
    
    <xsl:variable name="docRoot" select="/xs:schema"/>
  
  	<xsl:template match="/xs:schema">
      <dl>
        <xsl:for-each select="xs:complexType[@name=$listType]/xs:choice/*">
          <xsl:variable name="typeName" select="substring-after(@type,':')"/>
          <xsl:variable name="typeDef" select="$docRoot/xs:complexType[@name=$typeName]"/>
          <xsl:if test="string-length($subType)=0 or $typeDef/xs:complexContent/xs:extension/@base=$subType">
            <dt><a href="javascript:config.objects.{$widgetId}.showDetails('{$typeName}')"><xsl:value-of select="@name"/></a></dt>
            <dd><xsl:value-of select="$typeDef/xs:annotation/xs:documentation"/></dd>
          </xsl:if>
        </xsl:for-each>
      </dl>
  	</xsl:template>
    
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/components.xml
  
  Index: components.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="register.xsl"?>
  <!--
    Description and usage examples of mapbuilder components.
  -->
  <Components xmlns="http://mapbuilder.sourceforge.net/mapbuilder">
    <widgets>
      <Widget>
        <name>MapTitle</name>
        <componentType>Widget</componentType>
        <description>Shows the title of a Web Map Context Document.</description>
        <examples>
          <Example>
            <title>MapTitle</title>
            <description>The mapTitle, often put inside a heading tag.</description>
            <divId>mapTitle</divId>
            <html>&lt;div id="mapTitle"/&gt;</html>
            <configSnippet>
            </configSnippet>
          </Example>
        </examples>
      </Widget>
  
      <Widget>
        <name>MapPane</name>
        <componentType>Widget</componentType>
        <description> The MapPane widget converts a Web Map
        Context (WMC) document into geographic layers using HTML &lt;DIV&gt;
        tags. Each layer corresponds to a WMS layer. </description>
        <examples>
          <Example>
            <title>Simple MapPane</title>
            <description>A static MapPane</description>
            <divId>mainMapPane</divId>
            <html>&lt;div id="mainMapPane"/&gt;</html>
  
            <configSnippet> &lt;MapPane id="mainMapWidget"&gt;
            &lt;htmlTagId&gt;mainMapPane&lt;/htmlTagId&gt; &lt;tools&gt;
            &lt;AoiMouseHandler/&gt; &lt;AoiBox&gt;
            &lt;lineColor&gt;#FF0000&lt;/lineColor&gt;
            &lt;lineWidth&gt;2&lt;/lineWidth&gt;
            &lt;crossSize&gt;1&lt;/crossSize&gt; &lt;/AoiBox&gt;
            &lt;DragPanHandler&gt; &lt;enabled&gt;false&lt;/enabled&gt;
            &lt;/DragPanHandler&gt; &lt;MouseClickHandler/&gt; &lt;/tools&gt;
            &lt;mapContainerId&gt;mainMapContainer&lt;/mapContainerId&gt;
            &lt;/MapPane&gt; </configSnippet>
          </Example>
        </examples>
      </Widget>
    </widgets>
    <tools>
    </tools>
  </Components>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <?xml-stylesheet type="text/xsl" href="register.xsl"?>
  <!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Mike Adair (NRCAN CCRs) -->
  <MapbuilderConfig version="0.2.1" id="referenceTemplate" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <models>
      <Context id="mainMap">
        <defaultModelUrl>context/atlasWorld.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <tools>
              <AoiMouseHandler/>
              <!--
              <AoiBox>
                <lineColor>#FF0000</lineColor>
                <lineWidth>2</lineWidth>
                <crossSize>1</crossSize>
              </AoiBox>
              -->
              <DragPanHandler>
                <enabled>false</enabled>
              </DragPanHandler>
              <MouseClickHandler/>
            </tools>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBox2 id="aoiBox2">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>../../lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#00FF00</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBox2>
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap.mainMapWidget</mouseHandler>
          </CursorTrack>
          <Legend id="legend">
          </Legend>
          <Widget id="abstract">
            <stylesheet>../../lib/widget/Abstract.xsl</stylesheet>
          </Widget>
          <Widget id="mapTitle">
            <stylesheet>../../lib/widget/MapTitle.xsl</stylesheet>
          </Widget>
          <AoiForm id="aoiForm">
          </AoiForm>
          <MapScaleText id="mapScaleText">
          </MapScaleText>
          <SaveModel id="saveModel">
            <htmlTagId>saveModel</htmlTagId>
            <serializeUrl>/mapbuilder/writeXml</serializeUrl>
          </SaveModel>
          <WmsCapabilitiesImport id="wmsCapabilitiesImport">
          </WmsCapabilitiesImport>
          <!--SearchForm id="searchForm">
          </SearchForm-->
        </widgets>
      </Context>
      <Context id="locator">
        <defaultModelUrl>context/locatorMap.xml</defaultModelUrl>
        <widgets>
          <MapPane id="locatorWidget">
            <htmlTagId>locatorMap</htmlTagId>
            <targetModel>mainMap</targetModel>
            <tools>
              <AoiBox>
                <lineColor>red</lineColor>
                <lineWidth>1</lineWidth>
                <crossSize>15</crossSize>
              </AoiBox>
              <AoiMouseHandler/>
              <ZoomToAoi>
              </ZoomToAoi>
            </tools>
            <mapContainerId>locatorContainer</mapContainerId>
            <fixedWidth>180</fixedWidth>
          </MapPane>
          <ModelUrlInput id="urlInput">
          </ModelUrlInput>
        </widgets>
      </Context>
      <ContextCollection id="collectionGroup">
        <defaultModelUrl>context/demoCollection.xml</defaultModelUrl>
        <widgets>
          <CollectionList id="collectionList">
            <targetModel>mainMap</targetModel>
          </CollectionList>
        </widgets>
      </ContextCollection>
      <Gml2 id="gml2">
        <widgets>
          <FeatureList id="featureList">
          </FeatureList>
        </widgets>
      </Gml2>
      <Model id="locations">
        <defaultModelUrl>locations/Global.xml</defaultModelUrl>
        <widgets>
          <Locations id="locationsSelect">
            <targetModel>mainMap</targetModel>
            <tools>
              <ZoomToAoi>
              </ZoomToAoi>
            </tools>
          </Locations>
        </widgets>
      </Model>
      <!--Model id="testGml">
        <defaultModelUrl>gml/Test.xml</defaultModelUrl>
        <widgets>
          <GmlRenderer id="testGmlRenderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
          </GmlRenderer>
        </widgets>
      </Model-->
      <Gml2 id="ntsGml">
        <!--defaultModelUrl>gml/NTSLookup.xml</defaultModelUrl-->
        <widgets>
          <GmlRenderer id="testGml2Renderer">
            <htmlTagId>mainMapPane</htmlTagId>
            <targetModel>mainMap</targetModel>
            <mapContainerId>mainMapContainer</mapContainerId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <pointDiameter>10</pointDiameter>
         </GmlRenderer>
        </widgets>
      </Gml2>
      <Logger id="eventLogDoc">
        <serializeUrl>/mapbuilder/writeXml</serializeUrl>
        <widgets>
          <Widget id="eventLog">
            <stylesheet>../../lib/widget/EventLog.xsl</stylesheet>
          </Widget>
        </widgets>
      </Logger>
     </models>
    <widgets>
      <ButtonBar id="buttonBar">
        <targetModel>mainMap</targetModel>
        <tools>
          <ZoomIn id="zoomIn">
            <mouseHandler>mainMap.mainMapWidget</mouseHandler>
            <dependsOn>mainMap.mainMapWidget.AoiMouseHandler</dependsOn>
            <class>RadioButton</class>
            <selected>true</selected>
            <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
            <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
            <tooltip xml:lang="en">click and drag to zoom in</tooltip>
            <tooltip xml:lang="fr">cliquer et faire glisser la souris pour agrandir</tooltip>
          </ZoomIn>
          <ZoomOut id="zoomOut">
            <mouseHandler>mainMap.mainMapWidget</mouseHandler>
            <dependsOn>mainMap.mainMapWidget.AoiMouseHandler</dependsOn>
            <class>RadioButton</class>
            <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
            <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
            <tooltip xml:lang="en">click to zoom out</tooltip>
            <tooltip xml:lang="fr">cliquer pour réire</tooltip>
          </ZoomOut>
          <DragPan id="dragPan">
            <mouseHandler>mainMap.mainMapWidget</mouseHandler>
            <dependsOn>mainMap.mainMapWidget.DragPanHandler</dependsOn>
            <class>RadioButton</class>
            <enabledSrc>/images/PanEnable.gif</enabledSrc>
            <disabledSrc>/images/PanDisable.gif</disabledSrc>
            <tooltip xml:lang="en">click and drag to pan</tooltip>
            <tooltip xml:lang="fr">cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
          </DragPan>
          <SetAoi id="setAoi">
            <mouseHandler>mainMap.mainMapWidget</mouseHandler>
            <dependsOn>mainMap.mainMapWidget.AoiMouseHandler</dependsOn>
            <class>RadioButton</class>
            <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
            <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
            <tooltip xml:lang="en">click and drag to set the area of interest</tooltip>
            <tooltip xml:lang="fr">cliquer et faire glisser la souris pour positionner une réon d'intét</tooltip>
          </SetAoi>
          <Reset id="reset">
            <class>Button</class>
            <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
            <tooltip xml:lang="en">reset the map to full extent</tooltip>
            <tooltip xml:lang="fr">redonner à la carte ses dimensions complès</tooltip>
          </Reset>
          <GetFeatureInfo id="getFeatureInfo">
            <mouseHandler>mainMap.mainMapWidget</mouseHandler>
            <dependsOn>mainMap.mainMapWidget.MouseClickHandler</dependsOn>
            <class>RadioButton</class>
            <enabledSrc>/images/QueryEnable.gif</enabledSrc>
            <disabledSrc>/images/QueryDisable.gif</disabledSrc>
            <tooltip xml:lang="en">click on feature for more info</tooltip>
            <tooltip xml:lang="fr">cliquer pour obtenir plus d'information pour cette couche</tooltip>
            <targetFeatureCollection>gml2</targetFeatureCollection>
          </GetFeatureInfo>
        </tools>
      </ButtonBar>
      <WebServiceForm id="ntsLookupForm">
        <targetModel>ntsGml</targetModel>
        <stylesheet>../../lib/widget/NtsForm.xsl</stylesheet>
        <webServiceUrl>http://geoservices.cgdi.ca/NTS/NTSLookup</webServiceUrl>
      </WebServiceForm>
    </widgets>
    <skinDir>../../lib/skin/default</skinDir>
    <!-- Url of LOCAL redirection script, required to access external URLs -->
    <!--proxyUrl>../../server/proxy/proxy.php?url=</proxyUrl-->
    <!--proxyUrl>/mapbuilder/proxy?url=</proxyUrl-->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/index.html
  
  Index: index.html
  ===================================================================
  <html xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Mapbuilder Components Register</title>
      <link rel="stylesheet" href="registerStyle.css" type="text/css">
      <link rel="stylesheet" href="../../lib/skin/default/tabList.css" type="text/css">
      <script>
      // URL of Mapbuilder configuration file.
      var mbConfigUrl='registerConfig.xml';
      </script>
      <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
    </head>
    <body onload="mbDoLoad()">
      <h1>Mapbuilder Components Register</h1>
      <table>
        <tr width="100%">
          <td id="tabList"></td>
          <td valign="bottom"><h3>Object properties for:</h3></td>
        </tr>
        <tr>
          <td id="workspace" valign="top" width="40%"></td>
          <td id="objectDetails" valign="top" style="border-left:thin solid #3366cc"></td>
        </tr>
      </table>
      <table class="footer">
        <tr>
          <td><a href="http://mapbuilder.sourceforge.net">Community Map Builder</a><br/>$Name$</td>
          <td width="60"><img src="/mapbuilder/lib/skin/default/images/Icon.gif"/></td>
        </tr>
      </table>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/register.xsl
  
  Index: register.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!--
  Description: Build a HTML register of components from a Mapbuilder
               Config file.
               Descriptions for the components are extracted from the
               config.xsd schema document.
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
    <xsl:output method="html"/>
  
    <!-- Root node.  -->
    <xsl:template match="/">
      <html>
        <head>
          <title>Mapbuilder Components Register</title>
  
          <link rel="stylesheet" href="../../lib/skin/default/html.css" type="text/css"/>
  
          <script>
            // URL of Mapbuilder configuration file.
            var mbConfigUrl='config.xml';
          </script>
          <script type="text/javascript" src="../../lib/Mapbuilder.js"></script>
        </head>
  
        <body onload="mbDoLoad()">
          <h1>Mapbuilder Components Register</h1>
          <xsl:apply-templates select="//mb:widgets/*"/>
        </body>
      </html>
    </xsl:template>
  
    <!-- Widget -->
    <xsl:template match="mb:widgets/*">
      <xsl:variable
        name="widgetName"
        select="name(.)"/>
      <xsl:variable
        name="componentType"
        select="substring-after(document('../../lib/schemas/config.xml')//xs:element[@name=$widgetName]/@type,':')"/>
  
      <h2><xsl:value-of select="name(.)"/> Widget</h2>
      <ul>
        <table border="1">
          <tr>
            <th>Description</th>
            <td>
              <p>
                <!-- Print component description -->
                <xsl:apply-templates select="document('../../lib/schemas/config.xml')//xs:complexType[@name=$componentType]/xs:annotation/xs:documentation"/>
              </p>
  
            </td>
          </tr>
          <xsl:if test="mb:stylesheet">
            <tr>
              <th>Stylesheet</th>
              <td><xsl:value-of select="mb:stylesheet"/></td>
            </tr>
          </xsl:if>
          <tr>
            <th>Example</th>
            <td>
              <div>
                <xsl:attribute name="id">
                  <xsl:choose>
                    <xsl:when test="mb:htmlTagId">
                      <xsl:value-of select="mb:htmlTagId"/>
                    </xsl:when>
                    <xsl:otherwise>
                      <xsl:value-of select="@id"/>
                    </xsl:otherwise>
                  </xsl:choose>
                </xsl:attribute>
              </div>
            </td>
          </tr>
        </table>
      </ul>
    </xsl:template>
    <!-- Example -->
    <xsl:template match="mb:Example">
      <tr>
        <td>
          <h3><xsl:value-of select="mb:title"/></h3>
          <p><xsl:value-of select="mb:description"/></p>
        </td>
        <td>
          <div>
            <xsl:attribute name="id">
              <xsl:value-of select="mb:divId"/>
            </xsl:attribute>
          </div>
        </td>
        <td><xsl:value-of select="mb:html"/></td>
        <td><xsl:value-of select="mb:configSnippet"/></td>
      </tr>
    </xsl:template>
  
    <!-- complex type-->
    <xsl:template match="xs:complexType">
      <i>ComplexType:<xsl:value-of select="."/></i>
    </xsl:template>
  
    <!-- Schema documentation -->
    <xsl:template match="xs:documentation">
      <i><xsl:value-of select="."/></i>
    </xsl:template>
  
   
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/registerConfig.xml
  
  Index: registerConfig.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <MapbuilderConfig version="0.2.1" id="registerConfig" xmlns="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ..//mapbuilder/lib/schemas/config.xsd">
    <!--
      Description: This configuration file determines what components from the
                   Mapbuilder library are to be included in a Main Mapbuilder web
                   page.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
    <models>
      <Model id="mbConfigSchema">
        <defaultModelUrl>../../lib/schemas/config.xml</defaultModelUrl>
        <!--nodeSelectXpath>/wmc:OWSContext/wmc:ResourceList</nodeSelectXpath-->
        <models>
        </models>
        <widgets>
          <ObjectList id="toolsListWidget">
            <scriptFile>ObjectList.js</scriptFile>
            <stylesheet>ObjectList.xsl</stylesheet>
            <listType>toolsType</listType>
          </ObjectList>
          <ObjectList id="widgetsListWidget">
            <scriptFile>ObjectList.js</scriptFile>
            <stylesheet>ObjectList.xsl</stylesheet>
            <listType>widgetsType</listType>
            <subType>mb:AbstractWidgetType</subType>
          </ObjectList>
          <ObjectList id="xslListWidget">
            <scriptFile>ObjectList.js</scriptFile>
            <stylesheet>ObjectList.xsl</stylesheet>
            <listType>widgetsType</listType>
            <subType>mb:AbstractXslWidgetType</subType>
          </ObjectList>
          <ObjectList id="mapContainerListWidget">
            <scriptFile>ObjectList.js</scriptFile>
            <stylesheet>ObjectList.xsl</stylesheet>
            <listType>widgetsType</listType>
            <subType>mb:AbstractMapWidgetType</subType>
          </ObjectList>
          <ObjectList id="buttonListWidget">
            <scriptFile>ObjectList.js</scriptFile>
            <stylesheet>ObjectList.xsl</stylesheet>
            <listType>widgetsType</listType>
            <subType>mb:AbstractButtonType</subType>
          </ObjectList>
          <ObjectList id="modelsListWidget">
            <scriptFile>ObjectList.js</scriptFile>
            <stylesheet>ObjectList.xsl</stylesheet>
            <listType>modelsType</listType>
          </ObjectList>
          <Widget id="objectDetails">
            <stylesheet>ObjectDetails.xsl</stylesheet>
          </Widget>
        </widgets>
        <tools>
        </tools>
      </Model>
    </models>
    <widgets>
      <TabbedContent id="tabList">
        <htmlWorkspace>workspace</htmlWorkspace>
        <tab label="Models">modelsListWidget</tab>
        <tab label="XSL Widgets">xslListWidget</tab>
        <tab label="Map Widgets">mapContainerListWidget</tab>
        <tab label="Other Widgets">widgetsListWidget</tab>
        <tab label="Buttons">buttonListWidget</tab>
        <tab label="Tools">toolsListWidget</tab>
      </TabbedContent>
    </widgets>
    <!--
      All static images should be relative to this URL.
      This dir is relative the dir of the main html file.
    -->
    <skinDir>../../lib/skin/default</skinDir>
    <widgetTextUrl>/widgetText.xml</widgetTextUrl> <!-- relative to the skin dir -->
    <!--proxyUrl>/mapbuilder/proxy</proxyUrl-->
    <!--serializeUrl>/mapbuilder/writeXml</serializeUrl-->
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/registerStyle.css
  
  Index: registerStyle.css
  ===================================================================
  
  BODY { font-size: 80%; font-family: arial, helvetica, sans-serif; } 
  
  IMG { border-style: none; }
  
  P { font-size: 80%;  }
  /*
  TD { font-size: 80% }
  UL { list-style: square; margin-bottom: 0%; line-height:1.3; }
  */
  
  UL { font-size: 80%; list-style: square; padding: 0 }
  OL { font-size: 80%; padding: 0 }
  UL LI { margin-left: 1em; }
  OL LI { margin-left: 1em; }
  
  UL.sidebar { font-size: 100%; list-style: none; padding: 0 }
  UL.sidebar LI { margin-left: 4px; }
  
  .title { font-weight: bold; }
  
  DT { font-weight: bold; }
  DL { font-size: 80%;  }
  
  PRE { font-size: 120% }
  
  A:active { color: #0000CC; }
  
  A:link { color: #0000CC; }
  
  A:visited { color: #336633; }
  
  A:hover { color: #FF0000; }
  
  A.banner { text-decoration: none; color: white; }
  
  
  H1 { 
    font: normal 18pt;  
    color: #3366cc; 
    margin: 0; 
    margin-top: 10; 
    width: 100%; 
    border-bottom: 1pt solid #3366cc; 
    text-align: left}
  
  H2 {  font-size: 130%; font-weight: bold; padding-top: 10px;}
  
  H3 { font-size: 110%; font-weight: bold; }
  
  H4 { font-size: 100%; font-weight: bold; }
  
  H5 { font-size: 110%; font-weight: bold; }
  
  H6 { font-size: 100%; font-weight: bold; }
  
  .footer { 
    font-size: 80%;  
    color: #3366cc; 
    margin: 0; 
    margin-bottom: 10; 
    width: 100%; 
    border-top: 1pt solid #3366cc; 
    text-align: right;
  }
  
  .exsml { font-size: 70%; font-weight: normal; }
  
  .exsmlbld { font-size: 70%; font-weight: bold; }
  
  .sml { font-size: 70%; font-weight: normal; }
  
  .smlbld { font-size: 70%; font-weight: bold; }
  
  .med { font-size: 80%; font-weight: normal; }
  
  .medbld { font-size: 80%; font-weight: bold; }
  
  .medblditalic { font-size: 80%; font-weight: bold; font-style: italic; }
  
  .meditalic { font-size: 80%; font-style: italic; font-family: arial, helvetica, sans-serif;}
  
  .reg { font-size: 100%; font-weight: normal; }
  
  .regbld { font-size: 100%; font-weight: bold; }
  
  .lg { font-size: 110%; font-weight: normal; }
  
  .lgbld { font-size: 110%; font-weight: bold; }
  
  .exlg { font-size: 130%; font-weight: normal; }
  
  .exlgbld { font-size: 130%; font-weight: bold; }
  
  .lgbldt { font-size: 90%; font-weight: bold; font-family: tahoma, arial, helvetica, sans-serif; }
  
  .exlgbldt { font-size: 140%; font-weight: bold; font-family: tahoma, arial, helvetica, sans-serif; }
  
  .exlgbldblu { font-size: 170%; font-weight: bold; color:#3366CC; }
  
  
  
  @media print {
  
    @page         { margin: 10% }
  
    H1, H2, H3,
  
    H4, H5, H6    { page-break-after: avoid; page-break-inside: avoid }
  
    BLOCKQUOTE, 
  
    UL, OL, DL    { page-break-before: avoid }
  
  }
  
  
  
  
  
  
  
  @media speech {
  
  
  
    H1, H2, H3, 
  
  
  
    H4, H5, H6    { voice-family: paul, male; stress: 20; richness: 90 }
  
  
  
    H2            { pitch: x-low; pitch-range: 80 }
  
  
  
    H3            { pitch: low; pitch-range: 70 }
  
  
  
    H4            { pitch: medium; pitch-range: 60 }
  
  
  
    H5            { pitch: medium; pitch-range: 50 }
  
  
  
    H6            { pitch: medium; pitch-range: 40 }
  
  
  
    LI, DT, DD    { pitch: medium; richness: 60 }
  
  
  
    DT            { stress: 80 }
  
  
  
    STRONG        { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
  
  
  
    I             { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
  
  
  
    B             { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
  
  
  
    U             { richness: 0 }
  
  
  
    A:link        { voice-family: harry, male }
  
  
  
    A:visited     { voice-family: betty, female }
  
  
  
    A:active      { voice-family: betty, female; pitch-range: 80; pitch: x-high }
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/register/context/atlasWorld.xml
  
  Index: atlasWorld.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
  <ViewContext version="1.0.0" id="atlas_world" xmlns="http://www.opengis.net/context" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd">
    <General>
      <Window width="400" height="200"/>
      <BoundingBox SRS="EPSG:4326" minx="-180" miny="-90" maxx="180" maxy="90"/>
      <Title>World Base Map</Title>
      <KeywordList>
        <Keyword>world</Keyword>
        <Keyword>atlas</Keyword>
      </KeywordList>
      <Abstract>Atlas of Canada, World Base Map. Small scale vector based map served by Mapserver WMS.</Abstract>
      <LogoURL width="34" height="35" format="image/jpg">
        <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/site/english/atlas_identifier.jpg"/>
      </LogoURL>
      <DescriptionURL format="text/html">
        <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/"/>
      </DescriptionURL>
      <ContactInformation>
        <ContactPersonPrimary>
          <ContactPerson>Michael Adair</ContactPerson>
          <ContactOrganization>Canada Centre for Remote Sensing</ContactOrganization>
        </ContactPersonPrimary>
        <ContactPosition>Systems Scientist</ContactPosition>
        <ContactAddress>
          <AddressType>postal</AddressType>
          <Address>615 Booth Street, room 650</Address>
          <City>Ottawa</City>
          <StateOrProvince>Ontario</StateOrProvince>
          <PostCode>K1A 0E9</PostCode>
          <Country>Canada</Country>
        </ContactAddress>
        <ContactVoiceTelephone>+1 613 947 1342</ContactVoiceTelephone>
        <ContactFacsimileTelephone>+1 613 947 2410</ContactFacsimileTelephone>
        <ContactElectronicMailAddress>mike.adair at ccrs.nrcan.gc.ca</ContactElectronicMailAddress>
      </ContactInformation>
    </General>
    <LayerList>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>ocean</Name>
        <Title>ocean area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>land</Name>
        <Title>land area</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
        </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>lake_fill</Name>
        <Title>lakes</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>lake_outline</Name>
        <Title>lake outlines</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>coast</Name>
        <Title>coastline</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>rivers</Name>
        <Title>rivers</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>boundaries</Name>
        <Title>boundaries</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="1">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>capital</Name>
        <Title>capitals</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="0">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>country_names</Name>
        <Title>country names</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
      <Layer queryable="0" hidden="1">
        <Server service="wms" version="1.1.0" title="wms">
          <OnlineResource xlink:type="simple" xlink:href="http://atlas.gc.ca/cgi-bin/mapserv?map=/home/mapdata/aoc_v3/english/pb_world.map"/>
        </Server>
        <Name>capital_names</Name>
        <Title>capital names</Title>
        <SRS>EPSG:4326</SRS>
        <FormatList>
          <Format current="1">image/gif</Format>
        </FormatList>
      </Layer>
    </LayerList>
  </ViewContext>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/demoCollection.xml
  
  Index: demoCollection.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no"?>
  <ViewContextCollection version="1.0.0" xmlns="http://www.opengis.net/context" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.opengis.net http://schemas.opengis.net/context/1.0.0/collection.xsd">
  	<!-- List of context XML URLs -->
  	<ViewContextReference version="1.0.0" id="atlas">
  		<Title>Atlas World base map</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="/mapbuilder/demo/data/context/atlasWorld.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="cded">
      <Title>Canadian Digital Elevation Data (GeoBase)</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="/mapbuilder/demo/data/context/cded.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="lsat7Ortho">
  		<Title>Landsat Orthorectified Imagery over Canada</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="/mapbuilder/demo/data/context/lsat7Ortho.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="mars">
  		<Title>Mars landings</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="/mapbuilder/demo/data/context/mars.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="modisWorldMosaic">
      <Title>MODIS world mosaic</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="/mapbuilder/demo/data/context/modisWorld.xml"/>
  		</ContextURL>
  	</ViewContextReference>
  	<ViewContextReference version="1.0.0" id="radarsatMosaicCanada">
      <Title>Radarsat Mosaic of Canada</Title>
  		<ContextURL>
  			<OnlineResource xlink:type="simple" xlink:href="/mapbuilder/demo/data/context/radarsatMosaic.xml"/>
  		</ContextURL>
  	</ViewContextReference>
    
  </ViewContextCollection>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/intro.html
  
  Index: intro.html
  ===================================================================
  <h2>Sample pages</h2>
  
  <p>
  The following pages show a few examples of how Mapbuilder can be configured 
  in various ways and how it can support different models.
  Details about how the configuration file can be found in the 
  <a href="?page=config/config">configuration section of this user guide</a>. 
  </p>
  
  <p>
  You can look at the configuration document by clicking on the "config file" 
  link at the top of the page.
  Similarly, you can see the basic HTML for the page (just the main page body,
  without all the page surround)
  by clicking on the "view source" link.
  </p>
  
  <p>
  </p>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial1.html
  
  Index: tutorial1.html
  ===================================================================
  <h2>Simple map</h2>
  
  <p>
    In it's most basic configuration, mapbuilder can be used to simply put a map
    in a web page.
  </p>
  
  <div id="mainMapPane" style="float:right"></div>
  
  <p>
    The configuration for this page consists of a single 
    model (a Web Map Context document) and a single widget (a MapPane).
  </p>
  
  <p>
    The model ID can also be used as an HTTP request parameter to initialize the 
    model from a URL.
    For example, this page can be loaded with a different map using 
    <a href="javascript:config.loadModel('mainMap','/mapbuilder/demo/data/context/modisWorld.xml')">
      JavaScript
    </a>
    or 
    <a href="?page=samples/tutorial1&mainMap=/mapbuilder/demo/data/context/cded.xml">
      by a parameter in the URL.
    </a>
  </p>
  
  <p>
    The MapPane widget renders the model as a set of stacked images and 
    inserted into the page.  
    The 'htmlTagID' in the config file is used to associate 
    the MapPane with an HTML page element, in this case a &lt;DIV&gt; element
    which has it's CSS style set to float on the right hand side of the page.
    The HTML for the widget is generated by applying an XSLT stylehseet to the model.
  </p>
  <p>
    The ID assigned to the model can be used to reference the methods and properties
    of the JavaScript model object as 'config.objects[modelId]'.
  </p>
  
  <p align="right"><a href="?page=samples/tutorial2">next</a></p>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial1.xml
  
  Index: tutorial1.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <MapbuilderConfig
      xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd"
       version="0.2.0" id="tutorial1" >
    <skinDir>/mapbuilder/lib/skin/default</skinDir>
  
    <models>
      <Context id="mainMap">
        <defaultModelUrl>/mapbuilder/demo/data/context/locatorMap.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <fixedWidth>250</fixedWidth>
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
        </widgets>
      </Context>
    </models>
  
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial2.html
  
  Index: tutorial2.html
  ===================================================================
  
  <h2>Multiple models</h2>
  
  
  <div style="float:right;width:auto; padding: 4px">
    <div id="firstMapPane"></div>
  </div>
  
  <p>
    This example includes two different maps that both have a MapPane widget
    as well as an Area of Interest (AOI) widgets which displays an AOI for the model.
    The AOI can either be a 
  <a href="javascript:alert('hover over this link to see the AOI')" 
        onmouseover="javascript:config.objects['firstMap'].setParam('aoi', new Array(new Array(-75,45),new Array(0,0)))"> 
      rectangular bounding box
    </a>
    or a 
    <a href="javascript:alert('hover over this link to see the AOI')" 
        onmouseover="config.objects['firstMap'].setParam('aoi', new Array(new Array(0,0),new Array(0,0)))">single point.</a>
    The colour, line width and size of point display are customized in the config
    file.
    These links also demonstrate how to reference Mapbuilder objects using 
    the 'config.objects' array, as well as calling a model listener function.
  </p>
  
  <div id="secondMapPane" style="float: left; width: auto; padding: 4px"></div>
  
  <p>
    A map can also have some interactive functionality by adding tools 
    (controllers) to the Context document model.
    In this case the secondMap has a tool to handle mouse events on the 
    MapPane widget, as well as a tool to control the firstMap by
    using the 'targetModel' property.  
    <b>Click</b>, or <b>click and drag</b> out an AOI box on the second map 
    to control the area displayed in the firstMap.
  </p>
  
  <p style="text-align:right; clear:left"><a href="?page=samples/tutorial1">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="?page=samples/tutorial3">next</a></p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial2.xml
  
  Index: tutorial2.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <MapbuilderConfig 
      xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ../../lib/schemas/config.xsd"
      version="0.2.0" id="tutorial2" >
    <skinDir>/mapbuilder/lib/skin/default</skinDir>
  
    <models>
  
      <Context id="firstMap">
        <defaultModelUrl>/mapbuilder/demo/data/context/locatorMap.xml</defaultModelUrl>
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>firstMapPane</htmlTagId>
            <mapContainerId>firstMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxDHTML id="firstAoiBox">
            <htmlTagId>firstMapPane</htmlTagId>
            <lineColor>#FF0077</lineColor>
            <lineWidth>3</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>firstMapContainer</mapContainerId>
          </AoiBoxDHTML>
        </widgets>
      </Context>
  
      <Context id="secondMap">
        <defaultModelUrl>/mapbuilder/demo/data/context/DM_Canada.xml</defaultModelUrl>
        <widgets>
          <MapPane id="secondMapWidget">
            <htmlTagId>secondMapPane</htmlTagId>
            <mapContainerId>secondMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxDHTML id="secondAoiBox">
            <htmlTagId>secondMapPane</htmlTagId>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>secondMapContainer</mapContainerId>
          </AoiBoxDHTML>
        </widgets>
        <tools>
          <AoiMouseHandler id="locatorAoi"/>
          <ZoomToAoi id="zoomToAoi">
            <targetModel>firstMap</targetModel>
          </ZoomToAoi>
        </tools>
      </Context>
      
    </models>
    <skinDir>/mapbuilder/lib/skin/default</skinDir>
    <languages>en,fr</languages>
    <widgetTextUrl>widgetText.xml</widgetTextUrl> <!-- relative to the skinDir + language subdir -->
  
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial3.html
  
  Index: tutorial3.html
  ===================================================================
  <h2>Other widgets</h2>
  
  <p>
    More than one view of the same model can also be included.
    In the configuration for this page, we add in legend and cursor tracking widgets.  
    The legend renders the same context
    document as the map, except that the layers are output as a text listing
    with a checkbox for toggling the visibility of each layer.
    The cursor tracking widget displays the latitude and longitude of the mouse
    when the cursor is over the map.  
    Note also that this page is laid out using a table rather than a DIV
    but the widgets are still associated with the HTML elements using the ID attribute.
  </p>
  
  <table>
    <tr>
      <td colspan="2" id="mainMapPane">
      </td>
      <td id="defaultLegend"/>
    </tr>
    <tr>
      <td id="mainButtonBar" align="left"/>
      <td id="cursorTrack" align="right"/>
      <td/>
    </tr>
  </table>
  
  
  <p>
    The HTML for these widgets is also generated by an XSL stylesheet applied to the context document.
    The default mapbuilder legend is shown here, however
    custom stylesheets can be used by adding a &lt;stylesheet&gt; property to 
    widgets in the configuration file.
    This property would reference a stylesheet installed on your server.
  </p>
  
  <p>
    The config document itself is considered a model that may have it's own
    widgets and tools.
    Here the config document has Button widgets for controlling the application.
    Widgets can be configured to act on any particular model through the &lt;targetModel&gt;
    property.
  </p>
  
  <p align="right"><a href="?page=samples/tutorial2">previous</a>&nbsp;&nbsp;&nbsp; 
  <a href="?page=samples/tutorial4">next</a></p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial3.xml
  
  Index: tutorial3.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <MapbuilderConfig
      xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder /mapbuilder/lib/schemas/config.xsd"
       version="0.2.0" id="tutorial3" >
    <skinDir>/mapbuilder/lib/skin/default</skinDir>
  
    <models>
  
      <Context id="mainMap">
        <defaultModelUrl>/mapbuilder/demo/data/context/cded.xml</defaultModelUrl>
        
        <widgets>
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBoxMain">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>/mapbuilder/lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          
          <Legend id="defaultLegend"/>
          
          <CursorTrack id="cursorTrack">
            <mouseHandler>mainMap</mouseHandler>
          </CursorTrack>
  
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
        </tools>
      </Context>
  
    </models>
  
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
      </DragPan>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
      </Reset>
    </widgets>
    <skinDir>/mapbuilder/lib/skin/default</skinDir>
    <languages>en,fr</languages>
    <widgetTextUrl>widgetText.xml</widgetTextUrl> <!-- relative to the skinDir + language subdir -->
        
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial4.html
  
  Index: tutorial4.html
  ===================================================================
  <h2>Other models</h2>
  
  
  <p>
    A Web Map Context document is just one type of model supported.
    The configuration for this page demonstrates the mapbuilder 
    implementation for Context Collections.
    This is an XML document which contains a list of context document URLs and a title.
  </p>
  
  <div id="collectionList"></div>
  
  <table width="100%">
    <tr>
      <td id="mainButtonBar" align="left" valign="top" width="18"/>
      <td id="mainMapPane"/>
    </tr>
  </table>
  
  <p>
    The widget for a context Collection is a text listing of the map titles
    to be selected and is also generated by an XSL stylesheet.
    Other widgets could defined to support a dynamic menu system for example.
  </p>
  
  <p>
    In this case, the tools of the model are simply HTML links which execute
    a JavaScript method.  Note how the context model is set as the target of the 
    action using the &lt;tagetModelId&gt; property in the CollectionList widget.
    The links call the JavaScript config[targetModelId].loadModel(modelUrl) method.
  </p>
  
  <p>
    The MVC design pattern allows other document types to be supported very easily.
    Please see the mapbuilder-lib Software Design Description
    for details on how to extend the code base.
    This is an open source project so contributions from other developers are encouraged.
  </p>
  
  <p align="right"><a href="?page=samples/tutorial3">previous</a></p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial4.xml
  
  Index: tutorial4.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <MapbuilderConfig
      xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder /mapbuilder/lib/schemas/config.xsd"
       version="0.2.0" id="tutorial4" >
    <skinDir>/mapbuilder/lib/skin/default</skinDir>
  
    <models>
  
      <Context id="mainMap">
        <defaultModelUrl>/mapbuilder/demo/data/context/locatorMap.xml</defaultModelUrl>
        
        <widgets>
  
          <MapPane id="mainMapWidget">
            <htmlTagId>mainMapPane</htmlTagId>
            <mapContainerId>mainMapContainer</mapContainerId>
          </MapPane>
          <AoiBoxWZ id="aoiBoxMain">
            <htmlTagId>mainMapPane</htmlTagId>
            <stylesheet>/mapbuilder/lib/widget/GmlRenderer.xsl</stylesheet>
            <lineColor>#FF0000</lineColor>
            <lineWidth>1</lineWidth>
            <crossSize>15</crossSize>
            <mapContainerId>mainMapContainer</mapContainerId>
          </AoiBoxWZ>
          
        </widgets>
        <tools>
          <AoiMouseHandler id="mainAoi"/>
          <DragPanHandler id="mainDragPan">
            <enabled>false</enabled>
          </DragPanHandler>
        </tools>
      </Context>
  
      <ContextCollection id="collectionGroup">
        <defaultModelUrl>/mapbuilder/docs/samples/demoCollection.xml</defaultModelUrl>
        <widgets>
          <CollectionList id="collectionList">
            <targetModel>mainMap</targetModel>
          </CollectionList>
        </widgets>
      </ContextCollection>
      
    </models>
  
    <widgets>
      <ZoomIn id="zoomIn">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <selected>true</selected>
        <enabledSrc>/images/ZoomInEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomInDisable.gif</disabledSrc>
      </ZoomIn>
      <ZoomOut id="zoomOut">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/ZoomOutEnable.gif</enabledSrc>
        <disabledSrc>/images/ZoomOutDisable.gif</disabledSrc>
      </ZoomOut>
      <DragPan id="dragPan">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainDragPan</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/PanEnable.gif</enabledSrc>
        <disabledSrc>/images/PanDisable.gif</disabledSrc>
      </DragPan>
      <SetAoi id="setAoi">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <mouseHandler>mainAoi</mouseHandler>
        <class>RadioButton</class>
        <enabledSrc>/images/SetAoiEnable.gif</enabledSrc>
        <disabledSrc>/images/SetAoiDisable.gif</disabledSrc>
      </SetAoi>
      <Reset id="reset">
        <buttonBar>mainButtonBar</buttonBar>
        <targetModel>mainMap</targetModel>
        <class>Button</class>
        <disabledSrc>/images/ResetExtentDisable.gif</disabledSrc>
      </Reset>
    </widgets>
    <skinDir>/mapbuilder/lib/skin/default</skinDir>
    <languages>en,fr</languages>
    <widgetTextUrl>widgetText.xml</widgetTextUrl> <!-- relative to the skinDir + language subdir -->
    <proxyUrl>/mapbuilder/proxy</proxyUrl>
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial5.html
  
  Index: tutorial5.html
  ===================================================================
  <h2>Other examples</h2>
  
  
  <p>
  Placeholder for links to other web sites using mapbuilder.
  </p>
  
  <ul>
  <li>
  <a href="/mapbuilder/demo/complete">Mapbuilder reference implementation</a> 
  </li>
  </ul>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/samples/tutorial5.xml
  
  Index: tutorial5.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  
  <MapbuilderConfig id="referenceTemplate">
    <skinDir>/mapbuilder/lib/skin/default</skinDir>
  
    <models>
  
      
    </models>
  
  </MapbuilderConfig>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/start/apache.html
  
  Index: apache.html
  ===================================================================
  <h2>Installing for Apache/PHP</h2>
  
  <p>
  You should first have your web server installed and have PHP enabled
  if you intend to use the server side scripts.
  The <a href="http://httpd.apache.org/">Apache</a> web server is one 
  that will work for this purpose.
  Please refer to it's installation instructions to install and configure it.
  </p>
  
  <p>
  Download the .zip archive and extract all files to a web accesible directory
  which is usually configured as /htdocs.
  Installation details for other web servers may vary.
  </p>
  
  <p>
  The required server side scripts are automatically available as PHP scripts
  and the path to them configured in /mapbuilder/lib/mapbuilderConfig.xml.
  By default, these are: /mapbuilder/server/proxy/proxy.php and 
  /mapbuilder/server/proxy/serializer.php for the serializeUrl script.
  If you install Mpabuilder using a different directory name you will have to 
  adjust these paths manually.
  </p>
  
  <p>
  Other aspects of the Apache/PHP setup:
  </p>
  
  <dl class="med">
    <dt class="title">Logging:</dt>
    <dd>
    Server logging is not yet provided in this environment.
    <dd>
    <dt class="title">File save directory:</dt>
    <dd>
    The file save directory is where files are written to disk by the serialize
    script.
    This directory has to be writable by the web user and it is up to the 
    application to purge it. 
    The location of the directory is configured in the serialzer script at
    mapbuilder/server/php/serialzer.php as the $outputDir variable and defaults to
    /mapbuilder/temp.
    </dd>
  </dl>
  
  <p>
  more ?
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/start/browsers.html
  
  Index: browsers.html
  ===================================================================
   
  <h2>Browser support</h2>
  
  <p>
  Mapbuilder retrieves XML documents to be stored and manipulated within the
  browser.  
  The documents are rendered into HTML using XSL stylesheets and added to the 
  page using the browser's DOM implementation.
  Using these techniques provides great flexibility in programing the page 
  however it means that only modern browsers are supported.
  </p>
  
  <p>
  Browsers supported include:
  <ul>
    <li>Firefox 1.0</li>
    <li>Mozilla 1.3 and higher</li>
    <li>Microsoft IE 6 and higher</li>
    <li>Netscape 6 and higher</li>
  </ul>
  </p>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/start/geoserver.html
  
  Index: geoserver.html
  ===================================================================
  <h2>GeoServer and other OGC Web Services</h2>
  
  <p>
  Some of the Mapbuilder demos depend on having 
  <a href="http://geoserver.sourceforge.net/">GeoServer</a> installed as a 
  transactional Web Feature Server (WFS).
  Please refer to it's installation documentation for how to install it, 
  but it can be installed in the same servlet container as Mapbuilder.
  </p>
  
  <p>
  Being based on standards, other OGC web services can be used as data
  sources in a local installation, including Open source projects 
  <a href="">Mapserver</a> and <a href="">Deegree</a>, as well as various
  commercial implementations of the OGC web service specifications.
  </p>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/start/install.html
  
  Index: install.html
  ===================================================================
  <h2>Installing mapbuilder</h2>
  
  <p>
  The design philosophy of Mapbuilder is to minimize the server requirements,
  but for a web application you will need a web server 
  to serve your pages at a minimum.
  (The exception to this is for applications that don't need to load XML
  documents from outside the web, in which case you can also load
  your application using the file:// protocol.
  For example, try loading the simple demo by double clicking on the 
  index.html file from a directory explorer view.)
  </p>
  
  <p>
  There are 2 server side scripts that may be required, depending on your 
  application.
  Applications can be written so that these are not required at all;
  the Simple demo is one example where all XML documents are served from the 
  same domain and there is no "save" functionality in the page.
  </p>
  <ul> 
  <li> a proxy script to bypass JavaScript security restrictions when loading 
  documents that originate from a different domain than yours.
  </li>
  <li>a script used to write XML documents back to your server.
  </li>
  </ul>
  
  <p>
  Mapbuilder is available as .zip file for use in a Apache/PHP environment, 
  as well as a .war file for J2EE servlet containers like Jakarta Tomcat.
  Installation is generally just a matter of expanding the archive into
  the correct directory.
  All server-side scripts are automatically available by installing the appropriate
  archive.
  More details on each environment are available in the following pages.
  </p>
  
  <dl class="med">
    <dt class="title">Tomcat environment:</dt>
    <dd>
    Download the xxx-war.zip archive and extract the mapbuilder.war file to the tomcat webapps
    directory. 
    Depending on your Tomcat setup, you may or may not have to restart Tomcat, 
    the default tomcat setup will expand the .war file automatically.
    Installation details for other servlet containers may vary.
    <dd>
    <dt class="title">Apache/PHP environment</dt>
    <dd>
    Download the mapbuilder zip file and unpack it into a web accessible directory.
    With Apache this will be the htdocs directory.
    Installation details for other web servers may vary.
    </dd>
  </dl>
  
  <p>
    You should then be able to try it out from this URL: 
    <a href="/mapbuilder/demo/complete">http://localhost/mapbuilder/demo/complete</a>
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/start/server.html
  
  Index: server.html
  ===================================================================
   
  <h2>Server requirements</h2>
  
  <p>
  While the design philosphy of mapbuilder is to minimize server requirements,
  there are some cases where you have to modify your server configuration or
  provide server CGI/script processing.
  <ul>
    <li><span class="title">Proxy script:</span>
      By default, you can only load XML documents served from a server in
      the same domain as your web page.
      If you want to be able to load XML documents from anywhere on the Internet, 
      you will have to install a proxy loader script on your server to make it 
      look like these documents come from your domain.  
      Implementations of this script for the PHP and J2EE server environments 
      are available in the mapbuilder distribution in /mapbuilder/server subdirectory.
      The URL to this script must be set as the &lt;proxyUrl&gt; property in the
      configuration file.
    </li>
    <li><span class="title">Serialize script:</span>
      If the application wants to save data to back to a server, there must be 
      something on the server preapred to receive that data.  
      An XML serializer script provides this functionality that takes the 
      body of an HTTP POST request and writes it to disk.
      Implementations of this script for the PHP (to be completed) and
      J2EE server environments are available in the mapbuilder distribution in 
      /mapbuilder/server subdirectory.
      In a tomcat environment, the directory in which the XML is written is 
      configured in the deployment descriptor (web.xml).
      The URL to this script must be set as the &lt;serializeUrl&gt; property in the
      configuration file.
    </li>
    <li><span class="title">XML mime types:</span>
      The XML documents you retrieve must have a mime type of "text/xml".
      File types that typically aren't served with that mime type include 
      context documents (.cml), collections (.ccml) 
      and often XSL files as well (.xsl).
      Check that the mime type mapping file for your server contains a line like:
      <pre>text/xml      xml xsl cml ccml</pre>
      If you are using Apache, this file will be specified in the httpd.conf.
    </li>
  </ul>
  </p>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/start/start.html
  
  Index: start.html
  ===================================================================
  <h2>Coding your web page</h2>
  
  <p>
  There are several common steps for coding a mapbuilder application: 
  your HTML page includes a Javascript library, 
  which opens and reads a configuration file in the BODY onload event.
  In the following code examples, paths starting with "/" are relative
  to your server root, otherwise they are relative to the web page's base URL.
  </p>
  
  <ol>
    <li><span class="title">Create your configuration file:</span>
    Reference the configuration file in the web page's &lt;HEAD&gt; element.
    This variable must be named "mbConfigUrl".
    <pre>
      &lt;script&gt;
        // URL of Mapbuilder configuration file.
        var mbConfigUrl='config/contextEditor.xml';
      &lt;/script&gt;
    </pre>
    </li>
    <li><span class="title">Include the mapbuilder Javascript library:</span>
    the web page's &lt;HEAD&gt; element must include a reference to the mapbuilder
    library JavaScript code.  
    The library must be <a href="?page=start/install">installed</a> on the same server as 
    the page using it:
    <pre>
    &lt;script type="text/javascript" src="/mapbuilder/lib/Mapbuilder.js"&gt;&lt;/script&gt;
    </pre>
    </li>
    <li><span class="title">Initialize the application:</span>
    the page's BODY onload event handler must call mapbuilder's body onload event 
    handler. 
    <pre>
    &lt;body onload='mbDoLoad()'&gt;
      ..rest of page body...
    &lt;/body&gt;
    </pre>
    </li>
    <li><span class="title">Create the HTML for the web page:</span>
    Assign an ID attribute to the HTML elements in the
    page where mapbuilder widget output will be inserted.
    For example:
    <pre>&lt;div&nbsp;id="mbId"&gt;&lt;/div&gt;</pre>
    where "mbId" corresponds to a widget ID in your configuration file.
    </li>
  
  </ol>
  
  <p>
  You can see the whole thing put together in the Mapbuilder 
  <a href="/mapbuilder/demo/simple">Simple Demo</a> which is also a good 
  example to copy as a starting point for your own applications.
  Be sure to inspect the source code for the demo and it's 
  <a href="/mapbuilder/demo/simple/simpleConfig.xml">configuration file.</a>
  </p>
  
  <p>
  When developing an application, it's best to keep it separate from the 
  mapbuilder codebase so that you can update your mapbuilder installation
  without affecting your application.  
  Custom widgets can be included using the stylesheet property, when required.
  The only requirement is that Mapbuilder and your application must share the
  same domain name.
  </p>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/start/tomcat.html
  
  Index: tomcat.html
  ===================================================================
  <h2>Installing for J2EE</h2>
  
  <p>
  You should first have your J2EE servlet container installed.
  The <a href="http://jakarta.apache.org/tomcat/index.html">Tomcat</a>
  servlet container is known to work well for Mapbuilder, as well as
  other related applications such as GeoServer.
  </p>
  
  <p>
  Download the -war.zip archive and extract mapbuilder.war file to 
  the tomcat webapps directory. 
  Depending on your Tomcat setup, you may or may not have to restart Tomcat. 
  The default tomcat installation will expand the .war file automatically.
  Installation details for other servlet containers may vary.
  </p>
  
  <p>
  The required server side scripts are automatically available as servlets,
  and configured in /mapbuilder/WEB-INF/web.xml.
  By default, these are: /mapbuilder/proxy for the proxyUrl and 
  /mapbuilder/writeXml for the serializeUrl config property.
  If you install Mpabuilder using a different context name, it will be
  automatically detected.
  </p>
  
  <p>
  Other aspects of the Tomcat setup (where $catalina_home refers to you base 
  directory for the servlet container):
  </p>
  
  <dl class="med">
    <dt class="title">Logging:</dt>
    <dd>
    The server scripts use the Log4J logging package which is configured by 
    the file $catalina_home/webapps/mapbuilder/WEB-INF/classes/log4j.properties.
    By default, logging level is set to INFO and by default there will be 
    a log file at $catalina_home/logs/mapbuilder-log4j.log.
    Please refer to <a href="http://logging.apache.org/log4j/docs/">Log4J 
    documentation</a> for more details on how to configure
    the logging facility.
    <dd>
    <dt class="title">File save directory:</dt>
    <dd>
    The file save directory is where files are written to disk by the serialize
    script.
    This directory has to be writable by the web user and it is up to the 
    application to purge it. 
    The location of the directory is configured in the Mapbuilder context
    deployment decriptor at $catalina_home/webapps/mapbuilder/WEB-INF/web.xml 
    and defaults to  $catalina_home/webapps/mapbuilder/temp.
    </dd>
  </dl>
  
  <p>
  more ?
  </p>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/docs/start/troubleshoot.html
  
  Index: troubleshoot.html
  ===================================================================
   
  <h2>Troubleshooting</h2>
  
  <p>
  What follows is some common problems encountered and some tips for working with 
  mapbuilder in development.
  </p>
  
  <ul>
    <li><span class="title">The <a href="javascript:">Javascript console</a>
  is your friend.</span>  While we have attempted to trap the more common errors and
  provide a meaningful error message in an alert, error messages in the
  javascript console can provide additional information about where and why 
  and error occurred.  
    </li>
    <li><span class="title">Mozilla based browsers provide better debugging tools.</span>
  It is very difficult to diagnose problems in Internet Explorer.  
  Mozilla provides some very nice developer tools through XUL extensions and
  with the Venkman JavaScript debugger.
    </li>
    <li><span class="title">HTML DOCTYPE declarations.</span>
  Some HTML doctype declarations cause problems using mapbuilder (including XHTML
  and those that refer to "loose.dtd").
  The following doctype declarations are known to work correctly:
  <pre>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;</pre>
  <pre>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"&gt;</pre>
    </li>
    <li><span class="title">no extra whitespace in config properties</span>
    don't put in extra whitespace or comments for properties in config.
    Properties should look like <b>&lt;property&gt;value&lt;/property&gt;</b>
    and not have any carriage returns within the element.
    </li>
    <li><span class="title">Empty HTML tags</span>
    Don't use the empty node form in the HTML page for mapbuilder elements 
    (i.e. <b>&lt;div&nbsp;id="mbId"/&gt;</b>).
    This is because some browsers do not recognize the empty tag as being closed. 
    </li>
    <li><span class="title">XML mime types:</span>
      The XML documents you retrieve must have a mime type of "text/xml".
      File types that typically aren't served with that mime type include 
      context documents (.cml), collections (.ccml) and often XSL files as well (.xsl).
      Check that the mime type mapping file for your server contains a line like:
      <pre>text/xml      xml xsl cml ccml</pre>
      If you are using Apache, this file will be specified in the httpd.conf.
    </li>
    <li><span class="title">Browser caching of XSL stylesheets</span>
      Both IE and Mozilla based browsers cache stylesheets loaded by mapbuilder. 
      If you are modifying widget stylesheets, be sure to clear the browser cache 
      before reloading the page.
    </li>
    <li><span class="title">add more here</span>
    </li>
    <li><span class="title"></span>
    </li>
    <li><span class="title"></span>
    </li>
  </ul>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/LoadScripts.xsl
  
  Index: LoadScripts.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet
    xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="mb" version="1.0" >
  <!--
  Description: Convert Mapbuilder Config to a list of buttons.
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  ButtonBar.xsl,v 1.5 2004/03/25 21:25:43 madair1 Exp
   || mb:widgets/* || mb:tools/*
  -->
  
    <xsl:output method="html" omit-xml-declaration="yes"/>
    
    <xsl:param name="baseDir">/mapbuilder/lib</xsl:param>
    
    <xsl:template match="/mb:MapbuilderConfig">
      <xsl:apply-templates />
    </xsl:template>
    
    <xsl:template match="mb:models/*">
      <xsl:variable name="scriptfile"><xsl:value-of select="$baseDir"/>/model/<xsl:value-of select="name(.)"/>.js</xsl:variable>
      <script type="text/javascript" src="{$scriptfile}"></script>
      <xsl:apply-templates />
    </xsl:template>
    
    <xsl:template match="mb:widgets/*">
      <xsl:variable name="scriptfile"><xsl:value-of select="$baseDir"/>/widget/<xsl:value-of select="name(.)"/>.js</xsl:variable>
      <script type="text/javascript" src="{$scriptfile}"></script>
      <xsl:apply-templates select="mb:scriptfile"/>
    </xsl:template>
    
    <xsl:template match="mb:tools/*">
      <xsl:variable name="scriptfile"><xsl:value-of select="$baseDir"/>/tool/<xsl:value-of select="name(.)"/>.js</xsl:variable>
      <script type="text/javascript" src="{$scriptfile}"></script>
    </xsl:template>
    
    <xsl:template match="mb:scriptfile">
      <xsl:variable name="scriptfile"><xsl:value-of select="."/></xsl:variable>
      <script type="text/javascript" src="{$scriptfile}"></script>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/Mapbuilder.js
  
  Index: Mapbuilder.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /** get a time stamp at start of the page load */
  var mbTimerStart = new Date();
  
  /** the global config object */
  var config;
  
  /** URL of Mapbuilder's lib/ directory. */
  var baseDir;
  
  /** mapbuilder environement settings, defaults to a .xml extension but is 
    auto-configured by the ant build script to .jsp for tomcat environment 
    the URL to this file will be pre-pended with the baseDir value.
  */
  var mbServerConfig = "mapbuilderConfig.xml";
  var mbNsUrl = "http://mapbuilder.sourceforge.net/mapbuilder";
  
  // LoadState Constants
  var MB_UNLOADED=0;    // Scripts not loaded yet
  var MB_LOAD_CORE=1;   // Loading scripts loaded defined in Mapbuilder
  var MB_LOAD_CONFIG=2; // Loading scripts loaded defined in Config
  var MB_LOADED=3;      // All scripts loaded
  
  /**
   * This Object bootstraps the Mapbuilder libraries by loading the core
   * script files.
   * When Config.js is loaded, the script files for objects described in the
   * Mapbuilder config file are loaded.
   * Objects which have dependencies will trigger the dependancies to load
   * when they are loaded.
   *
   * @constructor
   * @author Cameron Shorter
   * @requires Config
   * @requires Listener
   * @requires ModelBase
   * @requires Sarissa
   * @requires Util
   */
  function Mapbuilder() {
  
    /**
     * Determines which Mapbuilder scripts are loading.
     * TBD: Is it possible to use enumerated types in JS?
     */
    this.loadState=MB_UNLOADED;
  
    /** Array of objects that are loading.  Don't continue initialisation until
     * all objects have loaded. */
    this.loadingScripts=new Array();
  
    /** Timer to periodically check if scripts have loaded. */
    this.scriptsTimer=null;
  
    /**
     * Called periodically and moves onto the next loadState when this round of
     * scripts have loaded.
     * For IE clients, object.readyState is used to check if scripts are loaded.
     * Mozilla works fine without this function - I think it is single threaded.
     */
    this.checkScriptsLoaded=function() {
      if (document.readyState!=null){
        // IE client
  
        // Scripts are removed from array when they have loaded
        while(this.loadingScripts.length>0
          &&(this.loadingScripts[0].readyState=="loaded"
            ||this.loadingScripts[0].readyState=="complete"
            ||this.loadingScripts[0].readyState==null))
        {
          this.loadingScripts.shift();
        }
        if (this.loadingScripts.length==0){
          this.setLoadState(this.loadState+1);
        }
      }
      else{
        // Mozilla client
        if(this.loadState==MB_LOAD_CORE && config!=null){
          // Config has finished loading
          this.setLoadState(MB_LOAD_CONFIG);
        }
      }
    }
  
    /**
     * Move onto loading the next set of scripts.
     * @param newState The new loading state.
     */
    this.setLoadState=function(newState){
      this.loadState=newState;
      switch (newState){
        case MB_LOAD_CORE:
          this.loadScript(baseDir+"/util/sarissa/Sarissa.js");
          //this.loadScript(baseDir+"/util/sarissa/sarissa_dhtml.js");
          this.loadScript(baseDir+"/util/sarissa/sarissa_ieemu_xpath.js");
          //this.loadScript(baseDir+"/util/sarissa/sarissa_ieemu_xslt.js");//all deprecated
          this.loadScript(baseDir+"/util/Util.js");
          this.loadScript(baseDir+"/util/Listener.js");
          this.loadScript(baseDir+"/model/ModelBase.js");
          this.loadScript(baseDir+"/model/Config.js");
          break;
        case MB_LOAD_CONFIG:
          if(document.readyState){
            // IE
            config=new Config(mbConfigUrl);
            config.loadConfigScripts();
          }else{
            // Mozilla
            this.setLoadState(MB_LOADED);
          }
          break;
        case MB_LOADED:
          clearInterval(this.scriptsTimer);
          break;
      }
    }
  
    /**
     * Dynamically load a script file if it has not already been loaded.
     * @param url The url of the script.
     */
    this.loadScript=function(url){
      if(!document.getElementById(url)){
        var script = document.createElement('script');
        script.defer = false;   //not sure of effect of this?
        script.type = "text/javascript";
        script.src = url;
        script.id = url;
        document.getElementsByTagName('head')[0].appendChild(script);
        this.loadingScripts.push(script);
      }
    }
  
    /**
     * Internal function to load scripts for components that don't have <scriptfile>
     * specified in the config file.
     * @param xPath Xpath match of components from the Config file.
     * @param dir The directory the script is located in.
     */
    this.loadScriptsFromXpath=function(nodes,dir) {
      //var nodes = this.doc.selectNodes(xPath);
      for (var i=0; i<nodes.length; i++) {
        if (nodes[i].selectSingleNode("mb:scriptFile")==null){
          scriptFile = baseDir+"/"+dir+nodes[i].nodeName+".js";
          this.loadScript(scriptFile);
        }
      }
    }
  
    //derive the baseDir value by looking for the script tag that loaded this file
    var head = document.getElementsByTagName('head')[0];
    var nodes = head.childNodes;
    for (var i=0; i<nodes.length; ++i ){
      var src = nodes.item(i).src;
      if (src) {
        var index = src.indexOf("/Mapbuilder.js");
        if (index>=0) {
          baseDir = src.substring(0, index);
        }
      }
    }
  
    // Start loading core scripts.
    this.setLoadState(MB_LOAD_CORE);
  
    // Start a timer which periodically calls checkScriptsLoaded().
    this.scriptsTimer=setInterval('mapbuilder.checkScriptsLoaded()',100);
  }
  
  /**
   * copied from sarissa, a function to check browser security setting in IE, 
   * opens a help page if ActiveX objects are disabled.
   */
  function checkIESecurity()
  {
    var testPrefixes = ["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];
    // found progID flag
    var bFound = false;
    for(var i=0; i < testPrefixes.length && !bFound; i++) {
      try {
        var oDoc = new ActiveXObject(testPrefixes[i]);
        bFound = true;
      }
      catch (e) {
        //trap; try next progID
      }
    }
    if (!bFound) window.open("/mapbuilder/docs/help/IESetup.html");  //TBD: set this URL in config
  }
  
  if (navigator.userAgent.toLowerCase().indexOf("msie") > -1) checkIESecurity();
  var mapbuilder=new Mapbuilder();
  
  /**
   * Initialise Mapbuilder if script has been loaded, else wait to be called
   * again.
   */
  function mapbuilderInit(){
    if(mapbuilder && mapbuilder.loadState==MB_LOADED){
      clearInterval(mbTimerId);
      config.parseConfig(config);
      config.callListeners("init");
      var mbTimerStop = new Date();
      //alert("load time:"+(mbTimerStop.getTime()-mbTimerStart.getTime()) );
      if (window.mbInit) window.mbInit();
      config.callListeners("loadModel");
    }
  }
  
  /** Timer used when checking if scripts have loaded. */
  var mbTimerId;
  
  /**
   * Mapbuilder's main initialisation script.
   * This should be called from the main html file using:
   *   <body onload="mbDoLoad()">
   * @param initFunction Optional - A function reference that will be called after 
   * config.init() has been called.  This is to give application code a chance to
   * do initialization and be guaranteed that all objects exist (inlcuding config).
   */
  function mbDoLoad(initFunction) {
    // See if scripts have been loaded every 100msecs, then call config.init().
    mbTimerId=setInterval('mapbuilderInit()',100);
    if (initFunction) window.mbInit = initFunction;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/MapbuilderServerLoad.js
  
  Index: MapbuilderServerLoad.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /** URL of Mapbuilder's lib/ directory. */
  var baseDir;
  
  function Mapbuilder() {
    /**
     * Dynamically load a script file if it has not already been loaded.
     * @param url The url of the script.
     */
    this.loadScript=function(url){
      //no-op so that dynamic verison doesn't break
    }
  
    /**
     * Internal function to load scripts for components that don't have <scriptfile>
     * specified in the config file.
     * @param xPath Xpath match of components from the Config file.
     * @param dir The directory the script is located in.
     */
    this.loadScriptsFromXpath=function(xPath,dir) {
      var nodes = this.doc.selectNodes(xPath);
      for (var i=0; i<nodes.length; i++) {
        if (nodes[i].selectSingleNode("mb:scriptFile")==null){
          scriptFile = baseDir+"/"+dir+nodes[i].nodeName+".js";
          this.loadScript(scriptFile);
        }
      }
    }
  
    //derive the baseDir value by looking for the script tag that loaded this file
    var head = document.getElementsByTagName('head')[0];
    var nodes = head.childNodes;
    for (var i=0; i<nodes.length; ++i ){
      var src = nodes.item(i).src;
      if (src) {
        var index = src.indexOf("/MapbuilderServerLoad.js");
        if (index>=0) {
          baseDir = src.substring(0, index);
        }
      }
    }
  }
  
  var mapbuilder=new Mapbuilder();
  
  /**
   * Mapbuilder's main initialisation script.
   * This should be called from the main html file using:
   *   <body onload="mbDoLoad()">
   */
  function mbDoLoad() {
    config.init(config);
    var mbTimerStop = new Date();
    //alert("load time:"+(mbTimerStop.getTime()-mbTimerStart.getTime()) );
    config.callListeners("loadModel");
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/Config.js
  
  Index: Config.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * The config object is the parent model of all mapbuilder objects.
   * The application creates a global object called 'config' which represents
   * the mapbuilder configuration xml file passed in as a parameter.
   * Config is a model like any other model.  
   * Any mapbuilder object can be de-referenced by using the 'config.objects' 
   * property as in config.objects.idValueFromConfig.
   * The schema for the config can be found at /mabuilder/lib/schemas/config.xsd
   *
   * @constructor
   * @base ModelBase
   * @author adair
   * @requires Sarissa
   * @param url URL of the configuration file.
   */
  function Config(url) {
  /**
   * open the application specific configuration document, passed in aas the url argument.
   */
    this.doc = Sarissa.getDomDocument();
    this.doc.async = false;
    this.doc.validateOnParse=false;  //IE6 SP2 parsing bug
    this.doc.load(url);
    if (this.doc.parseError < 0){
      alert("error loading config document: " + url );//+ " - " + Sarissa.getParseErrorText(this.doc) );
    }
    this.url = url;
    this.namespace = "xmlns:mb='"+mbNsUrl+"'";
    this.doc.setProperty("SelectionLanguage", "XPath");
    Sarissa.setXpathNamespaces(this.doc, this.namespace);
  
  /**
   * Set the serializeUrl and proxyUrl values from a global configuration document
   * Optional, these can also be set in individual config docs.
   */
    var configDoc = Sarissa.getDomDocument();
    configDoc.async = false;
    configDoc.validateOnParse=false;  //IE6 SP2 parsing bug
    configDoc.load(baseDir+"/"+mbServerConfig);
    if (configDoc.parseError < 0) {
      //alert("error loading server config document: " + baseDir+"/"+mbServerConfig );
    } else {
      configDoc.setProperty("SelectionLanguage", "XPath");
      Sarissa.setXpathNamespaces(configDoc, this.namespace);
      var node = configDoc.selectSingleNode("/mb:MapbuilderConfig/mb:proxyUrl");
      if (node) this.proxyUrl = node.firstChild.nodeValue;
      node = configDoc.selectSingleNode("/mb:MapbuilderConfig/mb:serializeUrl");
      if (node) this.serializeUrl = node.firstChild.nodeValue;
    }
    configDoc = null;
  
    /**
     * Dynamic loading of the javascript files for objects defined in the Config file.
     * @private
     */
    this.loadConfigScripts=function(){
      // Load script files for all components that don't have <scriptfile> specified
      // in the config file.
      mapbuilder.loadScriptsFromXpath(this.doc.selectNodes("//mb:models/*"),"model/");
      mapbuilder.loadScriptsFromXpath(this.doc.selectNodes("//mb:widgets/*"),"widget/");
      mapbuilder.loadScriptsFromXpath(this.doc.selectNodes("//mb:tools/*"),"tool/");
  
      //TBD: Deprecate the following block and move into loadScriptsFromXpath instead.
      //load all scriptfiles called for in the config file.  There seems to be a 
      //problem if this is done anywhere except in the page <HEAD> element.
      var scriptFileNodes = this.doc.selectNodes("//mb:scriptFile");
      for (var i=0; i<scriptFileNodes.length; i++ ) {
        scriptFile = scriptFileNodes[i].firstChild.nodeValue;
        mapbuilder.loadScript(scriptFile);
      }
    }
  
    /**
    * multilingual support; defaults to english 
    * Set via a "language" parameter in the URL, 
    * or by setting a global "language" Javascript variable in the page <HEAD>.
    * Retrieve the language value from the global conifg object as "config.lang"
    */
    this.lang = "en";
    if (window.cgiArgs["language"]) {
      this.lang = window.cgiArgs["language"];
    } else if (window.language) {
      this.lang = window.language;
    }
  
    //set some global application properties
    var modelNode = this.doc.documentElement;
    this.skinDir = modelNode.selectSingleNode("mb:skinDir").firstChild.nodeValue;
    var proxyUrl = modelNode.selectSingleNode("mb:proxyUrl");
    if (proxyUrl) this.proxyUrl = proxyUrl.firstChild.nodeValue;
    var serializeUrl = modelNode.selectSingleNode("mb:serializeUrl");
    if (serializeUrl) this.serializeUrl = serializeUrl.firstChild.nodeValue;
  
    var widgetText = modelNode.selectSingleNode("mb:widgetTextUrl");
    if (widgetText) {
      var widgetTextUrl = this.skinDir + "/" + this.lang + "/" + widgetText.firstChild.nodeValue;
      this.widgetText = Sarissa.getDomDocument();
      this.widgetText.async = false;
      this.widgetText.validateOnParse=false;  //IE6 SP2 parsing bug
      this.widgetText.load(widgetTextUrl);
      if (this.widgetText.parseError < 0){
        alert("error loading widgetText document: " + widgetTextUrl );//+ " - " + Sarissa.getParseErrorText(this.doc) );
      }
      this.widgetText.setProperty("SelectionLanguage", "XPath");
      Sarissa.setXpathNamespaces(this.widgetText, this.namespace);
    }
  
    /**
    * the objects property holds a reference to every mapbuilder javascript object
    * created.  Each object is added as a property of config.objects using the
    * value of the object id from the configuration file
    */
    this.objects = new Object();
  
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode));
  
    /**
     * Load a model and its child models, widgets and tools.
     * This function can be called at any time to load a new model or replace an
     * existing model object.
     * @param modelId   the id of the model in config XML to be updated
     * @param modelUrl  URL of the XML model document to be loaded
     */
    this.loadModel = function( modelId, modelUrl ) {
      var model = this.objects[modelId];
      if (model && modelUrl) {
        var httpPayload = new Object();
        httpPayload.method = model.method;
        httpPayload.url = modelUrl;
        model.newRequest(model,httpPayload);
      } else {
        alert("config loadModel error:"+modelId+":"+modelUrl);
      }
    }
  
    /**
     * Repaint the widget passed in.  
     * This function can be called at any time to paint the widget.
     * @param widget   a pointer to the widget object to be painted.
     */
    this.paintWidget = function( widget ) {
      if (widget) {
        widget.paint(widget, true);
      } else {
        alert("config paintWidget error: widget does not exist");
      }
    }
  }
  
  /**
  * Initialise the global config object for Mozilla browsers.
  */
  if (document.readyState==null){
    // Mozilla
    mapbuilder.setLoadState(MB_LOAD_CONFIG);
    config=new Config(mbConfigUrl);
    config[config.id] = config;
    config.loadConfigScripts();
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/Context.js
  
  Index: Context.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a Web Map Context (WMC) document as defined by the Open GIS Consortium
   * http://opengis.org and extensions the the WMC.  
   *
   * Listeners supported by this model:
   * "refresh" called when window parameters (width/height, bbox) are changed
   * "hidden" called when visibilty of a layer is changed
   *
   * @constructor
   * @base ModelBase
   * @author Cameron Shorter
   * @param modelNode Pointer to the xml node for this model from the config file.
   * @param parent    The parent model for the object.
    * 
   */
  function Context(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    this.namespace = "xmlns:mb='http://mapbuilder.sourceforge.net/mapbuilder' xmlns:wmc='http://www.opengis.net/context' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'";
  
    /**
     * Change a Layer's visibility.
     * @param layerName  The name of the layer that is to be changed
     * @param hidden     String with the value to be set; 1=hidden, 0=visible.
     */
    this.setHidden=function(layerName, hidden){
      // Set the hidden attribute in the Context
      var hiddenValue = "0";
      if (hidden) hiddenValue = "1";
        
      var layer=this.doc.selectSingleNode("/wmc:ViewContext/wmc:LayerList/wmc:Layer[wmc:Name='"+layerName+"']");
      if (layer) layer.setAttribute("hidden", hiddenValue);
      // Call the listeners
      this.callListeners("hidden", layerName);
    }
  
    /**
     * Get the layer's visiblity attribute value.
     * @param layerName  The name of the layer that is to be changed
     * @return hidden  String with the value; 1=hidden, 0=visible.
     */
    this.getHidden=function(layerName){
      var hidden=1;
      var layer=this.doc.selectSingleNode("/wmc:ViewContext/wmc:LayerList/wmc:Layer[wmc:Name='"+layerName+"']");
      if (layer) hidden = layer.getAttribute("hidden");
      return hidden;
    }
  
    /**
     * Get the BoundingBox value from the Context document.
     * @return BoundingBox array with the sequence (xmin,ymin,xmax,ymax).
     */
    this.getBoundingBox=function() {
      var boundingBox=this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:BoundingBox");
      bbox = new Array();
      bbox[0]=parseFloat(boundingBox.getAttribute("minx"));
      bbox[1]=parseFloat(boundingBox.getAttribute("miny"));
      bbox[2]=parseFloat(boundingBox.getAttribute("maxx"));
      bbox[3]=parseFloat(boundingBox.getAttribute("maxy"));
      return bbox;
    }
  
    /**
     * Set the BoundingBox element and call the refresh listeners
     * @param boundingBox array in the sequence (xmin, ymin, xmax, ymax).
     */
    this.setBoundingBox=function(boundingBox) {
      // Set BoundingBox in context
      //bbox=this.doc.documentElement.getElementsByTagName("BoundingBox").item(0);
      var bbox=this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:BoundingBox");
      bbox.setAttribute("minx", boundingBox[0]);
      bbox.setAttribute("miny", boundingBox[1]);
      bbox.setAttribute("maxx", boundingBox[2]);
      bbox.setAttribute("maxy", boundingBox[3]);
      // Call the listeners
      this.callListeners("bbox", boundingBox);
    }
  
    /**
     * Set the BoundingBox element and call the refresh listeners
     * @param boundingBox array in the sequence (xmin, ymin, xmax, ymax).
     */
    this.initBbox=function(objRef) {
      // Set BoundingBox in context from URL CGI params
      if (window.cgiArgs["bbox"]) {     //set as minx,miny,maxx,maxy
        var bbox = window.cgiArgs["bbox"].split(',');
        var ul = new Array(parseFloat(bbox[0]),parseFloat(bbox[3]));
        var lr = new Array(parseFloat(bbox[2]),parseFloat(bbox[1]));
        objRef.extent.zoomToBox(ul, lr);
      }
    }
    //PGC this.addListener( "loadModel", this.initBbox, this );
    this.addListener( "contextLoaded", this.initBbox, this );
  
    /**
     * Set the aoi param and call the refresh listeners
     * @param boundingBox array in the sequence (xmin, ymin, xmax, ymax).
     */
    this.initAoi=function(objRef) {
      // Set AOI of context from URL CGI params
      if (window.cgiArgs["aoi"]) {      //set as ul,lr point arrays
        var aoi = window.cgiArgs["aoi"].split(',');
        objRef.setParam("aoi",new Array(new Array(aoi[0],aoi[3]),new Array(aoi[2],aoi[1])));
      }
    }
    this.addListener( "loadModel", this.initAoi, this );
    //MA this.addListener( "contextLoaded", this.initAoi, this );
  
    /**
     * Set the Spacial Reference System for the context document.
     * @param srs The Spatial Reference System.
     */
    this.setSRS=function(srs) {
      var bbox=this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:BoundingBox");
      bbox.setAttribute("SRS",srs);
      this.callListeners("srs");
    }
  
    /**
     * Get the Spacial Reference System from the context document.
     * @return srs The Spatial Reference System.
     */
    this.getSRS=function() {
      var bbox=this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:BoundingBox");
      srs=bbox.getAttribute("SRS");
      return srs;
    }
  
    /**
     * Get the Window width.
     * @return width The width of map window from the context document
     */
    this.getWindowWidth=function() {
      var win=this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:Window");
      return win.getAttribute("width");
    }
  
    /**
     * Set the Window width.
     * @param width The width of map window (therefore of map layer images).
     */
    this.setWindowWidth=function(width) {
      var win=this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:Window");
      win.setAttribute("width", width);
      this.callListeners("resize");
    }
  
    /**
     * Get the Window height.
     * @return height The height of map window from the context document.
     */
    this.getWindowHeight=function() {
      var win=this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:Window");
      return win.getAttribute("height");
    }
  
    /**
     * Set the Window height.
     * @param height The height of map window to set in the context document
     */
    this.setWindowHeight=function(height) {
      var win=this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:Window");
      win.setAttribute("height", height);
      this.callListeners("resize");
    }
  
    /**
     * Returns the serverUrl for the layer passed in as the feature argument.
     * @param requestName ignored for context docs (only GetMap supported)
     * @param method ignored for context docs (only GET supported)
     * @param feature the Layer node from the context doc
     * @return URL for the GetMap request 
     */
    this.getServerUrl = function(requestName, method, feature) {
      return feature.selectSingleNode("wmc:Server/wmc:OnlineResource").getAttribute("xlink:href");
    }
  
    /**
     * Returns the WMS version for the layer passed in as the feature argument
     * @param feature the Layer node from the context doc
     * @return the WMS GetMap version for the Layer.
     */
    this.getVersion = function(feature) {  
      return feature.selectSingleNode("wmc:Server").getAttribute("version");
    }
  
    /**
     * Get HTTP method for the specified feature
     * @param feature the Layer node from the context doc
     * @return the HTTP method to get the feature with
     */
    this.getMethod = function(feature) {
      return feature.selectSingleNode("wmc:Server/wmc:OnlineResource").getAttribute("wmc:method");
    }
  
    /**
     * Method to get a list of queryable layers
     * @return the list with queryable layers
     */
    this.getQueryableLayers = function() {
      var listNodeArray = this.doc.selectNodes("/wmc:ViewContext/wmc:LayerList/wmc:Layer[attribute::queryable='1']/wmc:Name");
      return listNodeArray;
    }
  
    /**
     * Method to get a list of all layers in the context doc
     * TBD: merge this with above, passing queryable as an optional boolean param?
     * @return the list with all layers
     */
    this.getAllLayers = function() {
      var listNodeArray = this.doc.selectNodes("/wmc:ViewContext/wmc:LayerList/wmc:Layer");
      return listNodeArray;
    }
  
    /**
     * Method to get a layer with the specified name in the context doc
     * @param layerName the layer to be returned
     * @return the list with all layers
     */
    this.getLayer = function(layerName) {
      var layer = this.doc.selectSingleNode("/wmc:ViewContext/wmc:LayerList/wmc:Layer[wmc:Name='"+layerName+"']");
      //TBD: add in time stamp
      return layer;
    }
  
    /**
     * Method to add a Layer to the LayerList
     * @param layerNode the Layer node from another context doc or capabiltiies doc
     */
    this.addLayer = function(objRef, layerNode) {
      var parentNode = objRef.doc.selectSingleNode("/wmc:ViewContext/wmc:LayerList");
      parentNode.appendChild(layerNode.cloneNode(true));
      objRef.modified = true;
      //objRef.callListeners("refresh");
    }
    this.addFirstListener( "addLayer", this.addLayer, this );
  
    /**
     * Method to remove a Layer from the LayerList
     * @param layerName the Layer to be deleted
     */
    this.deleteLayer = function(objRef, layerName) {
      var deletedNode = objRef.getLayer(layerName);
      if (!deletedNode) {
        alert("node note found; unable to delete node:"+layerName);
        return;
      }
      deletedNode.parentNode.removeChild(deletedNode);
      objRef.modified = true;
    }
    this.addFirstListener( "deleteLayer", this.deleteLayer, this );
  
    /**
     * Method to move a Layer in the LayerList up
     * @param layerName the layer to be moved
     */
    this.moveLayerUp = function(objRef, layerName) {
      var movedNode = objRef.getLayer(layerName);
      var sibNode = movedNode.selectSingleNode("following-sibling::*");
      if (!sibNode) {
        alert("can't move node past beginning of list:"+layerName);
        return;
      }
      movedNode.parentNode.insertBefore(sibNode,movedNode);
      objRef.modified = true;
    }
    this.addFirstListener( "moveLayerUp", this.moveLayerUp, this );
  
    /**
     * Method to move a Layer in the LayerList down
     * @param layerName the layer to be moved
     */
    this.moveLayerDown = function(objRef, layerName) {
      var movedNode = objRef.getLayer(layerName);
      var listNodeArray = movedNode.selectNodes("preceding-sibling::*");  //preceding-sibling axis contains all previous siblings
      var sibNode = listNodeArray[listNodeArray.length-1];
      if (!sibNode) {
        alert("can't move node past beginning of list:"+layerName);
        return;
      }
      movedNode.parentNode.insertBefore(movedNode,sibNode);
      objRef.modified = true;
    }
    this.addFirstListener( "moveLayerDown", this.moveLayerDown, this );
  
    /**
     * Adds a node to the Context document extension element.  The extension element
     * will be created if it doesn't already exist.  
     * @param extensionNode the node to be appended in the extension element.
     * @return the ndoe added to the extension element
     */
    this.setExtension = function(extensionNode) {
      var extension = this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:Extension");
      if (!extension) {
        var general = this.doc.selectSingleNode("/wmc:ViewContext/wmc:General");
        var newChild = createElementWithNS(this.doc,"Extension",'http://www.opengis.net/context');
        extension = general.appendChild(newChild);
      }
      return extension.appendChild(extensionNode);
    }
  
    /**
     * Returns the contents of the extension element
     * @return the contents of the extension element
     */
    this.getExtension = function() {
      return this.doc.selectSingleNode("/wmc:ViewContext/wmc:General/wmc:Extension");
    }
  
    /**
     * Parses a Dimension element from the Context document as a loadModel listener.
     * This results in an XML structure with one element for each GetMap time value 
     * parameter and added to the Context extrension element.
     * @param objRef a pointer to this object 
     */
    this.initTimeExtent = function( objRef ) {
      //only the first one selected is used as the timestamp source
      //var extentNode = objRef.doc.selectSingleNode("//wmc:Layer/wmc:Dimension[@name='time']");
      //TBD: how to deal with multiple time dimensions in one context doc, or caps doc?
      var timeNodes = objRef.doc.selectNodes("//wmc:Dimension[@name='time']");
      for (var i=0; i<timeNodes.length; ++i) {
        var extentNode = timeNodes[i];
        objRef.timestampList = createElementWithNS(objRef.doc,"TimestampList",mbNsUrl);
        var layerName = extentNode.parentNode.parentNode.selectSingleNode("wmc:Name").firstChild.nodeValue;
        objRef.timestampList.setAttribute("layerName", layerName);
        //alert("found time dimension, extent:"+extentNode.firstChild.nodeValue);
        var times = extentNode.firstChild.nodeValue.split(",");   //comma separated list of arguments
        for (var j=0; j<times.length; ++j) {
          var params = times[j].split("/");     // parses start/end/period
          if (params.length==3) {
            var start = setISODate(params[0]);
            var stop = setISODate(params[1]);
            var period = params[2];
            var parts = period.match(/^P((\d*)Y)?((\d*)M)?((\d*)D)?T?((\d*)H)?((\d*)M)?((.*)S)?/);
            for (var i=1; i<parts.length; ++i) {
              if (!parts[i]) parts[i]=0;
            }
            //alert("start time:"+start.toString());
            do {
              var timestamp = createElementWithNS(objRef.doc,"Timestamp",mbNsUrl);
              timestamp.appendChild(objRef.doc.createTextNode(getISODate(start)));
              objRef.timestampList.appendChild(timestamp);
  
              start.setFullYear(start.getFullYear()+parseInt(parts[2],10));
              start.setMonth(start.getMonth()+parseInt(parts[4],10));
              start.setDate(start.getDate()+parseInt(parts[6],10));
              start.setHours(start.getHours()+parseInt(parts[8],10));
              start.setMinutes(start.getMinutes()+parseInt(parts[10],10));
              start.setSeconds(start.getSeconds()+parseFloat(parts[12]));
              //alert("time:"+start.toString());
            } while(start.getTime() <= stop.getTime());
  
          } else {
            //output single date value
            var timestamp = createElementWithNS(objRef.doc,"Timestamp",mbNsUrl);
            timestamp.appendChild(objRef.doc.createTextNode(times[j]));
            objRef.timestampList.appendChild(timestamp);
          }
        }
       objRef.setExtension(objRef.timestampList);  
      }
    }
    this.addFirstListener( "loadModel", this.initTimeExtent, this );
  
    /**
     * Returns the current timestamp value.
     * @param layerName the name of the Layer from which the timestamp list was generated
     * @return the current timestamp value.
     */
    this.getCurrentTimestamp = function( layerName ) {
      var index = this.getParam("timestamp");
      return this.timestampList.childNodes[index].firstChild.nodeValue;
    }
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/ContextCollection.js
  
  Index: ContextCollection.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a Web Map Context (WMC) Collection document as defined by the Open 
   * GIS Consortium http://opengis.org and extensions the the WMC.  
   * @constructor
   * @base ModelBase
   * @author Mike Adair
   * @param modelNode Pointer to the xml node for this model from the config file.
   * @param parent    The parent model for the object.
   */
  function ContextCollection(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    /** Insert a new context.
      * @param context An XML node which describes the context.
      * @param zindex The position to insert this context in the contextList, if set
      * to null this context will be inserted at the end.
      * @return The identifier string used to reference this context.
      */
    this.insertContext=function(context,zindex){
      //TBD Fill this in.
    }
  
    /** Delete this context.
     * @param id The context identifier.
     */
    this.deleteContext=function(id){
      //TBD Fill this in.
    }
  
    /** Move this context to a new position in the contextList.
      * @param context The context id to move.
      * @param zindex The position to move this context to in the contextList, if set
      * to null this context will be inserted at the end.
      */
    this.reorderContext=function(context,zindex){
      //TBD Fill this in.
    }
  
    /** Select this context for further operations 
      * @param context The context id to select.
      * @param selected Set to true/false.
      */
    this.selectContext=function(context,selected){
      for(var i=0;i<this.listeners["select"].length;i++) {
        this.listeners["select"][i][0](context,this.listeners["select"][i][1]);
      }
    }
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/FeatureCollection.js
  
  Index: FeatureCollection.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a GML Feature or FeatureCollection as defined by the
   * Open GIS Conortium http://opengis.org.
   *
   * @constructor
   * @base ModelBase
   * @author Cameron Shorter
   * @requires Sarissa
   * @param modelNode The model's XML object node from the configuration document.
   * @param parent    The parent model for the object.
    */
  function FeatureCollection(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    // Namespace to use when doing Xpath queries, usually set in config file.
    if (!this.namespace){
      this.namespace = "xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs'";
    }
  
    /**
     * convert coordinates in the GML document to the SRS of the map container, 
     * if required.  The coordinate values are replaced in the GML document.
     * @param objRef Pointer to this object.
     */
    this.convertCoords = function(objRef) {
      if( objRef.doc && objRef.containerModel && objRef.containerModel.doc ) {
  	  var coordNodes = objRef.doc.selectNodes("//gml:coordinates");
  	  if (coordNodes.length>0 && objRef.containerModel) {
  	    var srsNode = coordNodes[0].selectSingleNode("ancestor-or-self::*/@srsName");
  	    if ( srsNode.nodeValue.toUpperCase() != objRef.containerModel.getSRS().toUpperCase() ) {
  	      var sourceProj = new Proj(srsNode.nodeValue);
  	      objRef.setParam("modelStatus","converting coordinates");
  	      var containerProj = new Proj(objRef.containerModel.getSRS());
  	      for (var i=0; i<coordNodes.length; ++i) {
  	        var coords = coordNodes[i].firstChild.nodeValue;
  	        var coordsArray = coords.split(' ');
  	        var newCoords = '';
  	        for (var j=0; j<coordsArray.length; ++j) {
  	          var xy = coordsArray[j].split(',');
  	          if (xy.length==2) {
  	            var llTemp = sourceProj.Inverse(xy);
  	            xy = containerProj.Forward(llTemp);
  	            newCoords += xy.join(',') + ' ';
  	          }
  	        }
  	        coordNodes[i].firstChild.nodeValue=newCoords;
  	      }
  	    }
        }
      }
    }
    this.addFirstListener("loadModel",this.convertCoords,this);
    if( this.containerModel ) this.containerModel.addListener("loadModel",this.convertCoords,this);
  
    /**
     * Change a feature's visibility.
     * @param featureName The name of the feature to set the hidden value for
     * @param hidden, 1=hidden, 0=not hidden.
     */
    this.setHidden=function(featureName, hidden){
      this.hidden = hidden;
      this.callListeners("hidden", featureName);
    }
  
    /**
     * Geta feature's visibility.
     * @param featureName The name of the feature to set the hidden value for
     * @return hidden value, true=hidden, false=not hidden.
     */
    this.getHidden=function(layerName){
      return this.hidden;
    }
    this.hidden = false;
  
    /**
     * Returns the list of nodes selected by the nodeSelectpath.  These nodes
     * will be the individual feature memebers from the collection.
     * @return list of nodes selected 
     */
    this.getFeatureNodes = function() {
      return this.doc.selectNodes(this.nodeSelectXpath);
    }
  
    /**
     * Returns a label for a node in the feature list
     * @param featureNode the feature node to selectfrom
     * @return a label for this feature
     */
    this.getFeatureName = function(featureNode) {
      var labelNode = featureNode.selectSingleNode("topp:CITY_NAME");   //TBD: set this dynamically
      return labelNode?labelNode.firstChild.nodeValue:"No RSS title";
    }
  
    /**
     * Returns an ID value for a node in the feature list
     * @param featureNode the feature node to selectfrom
     * @return ID for this feature
     */
    this.getFeatureId = function(featureNode) {
      return featureNode.getAttribute("fid")?featureNode.getAttribute("fid"):"no_id";
    }
  
    /**
     * Returns a point geometry for the feature
     * @param featureNode the feature node to select from
     * @return the geometric point for the node
     */
    this.getFeaturePoint = function(featureNode) {
  	 var coordSelectXpath = "topp:the_geom/gml:MultiPoint/gml:pointMember/gml:Point/gml:coordinates";//TBD: set this dynamically
      var coords = featureNode.selectSingleNode(coordSelectXpath);
      if (coords) {
        var point = coords.firstChild.nodeValue.split(',');
        return point
      } else {
        return new Array(0,0);  //or some other error to return?
      }
    }
  
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/FeatureTypeSchema.js
  
  Index: FeatureTypeSchema.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a WFS DescribeFeatureType request reponse as defined by the Open GIS Consortium
   * http://opengis.org (WFS).  
   *
   * @constructor
   * @base ModelBase
   * @author Mike Adair
   * @param modelNode Pointer to the xml node for this model from the config file.
   * @param parent    The parent model for the object.
   */
  function FeatureTypeSchema(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/GeoRSS.js
  
  Index: GeoRSS.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a GML Feature or FeatureCollection as defined by the
   * Open GIS Conortium http://opengis.org.
   *
   * @constructor
   * @base ModelBase
   * @author Cameron Shorter
   * @requires Sarissa
   * @param modelNode The model's XML object node from the configuration document.
   * @param parent    The parent model for the object.
    */
  function GeoRSS(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    /**
     * convert coordinates in the GML document to the SRS of the map container, 
     * if required.  The coordinate values are replaced in the GML document.
     * @param objRef Pointer to this object.
     */
    this.initItems = function(objRef) {
      var items = objRef.doc.selectNodes("rdf:RDF/rss:item");
      if( items.length == 0 ) {
        items = objRef.doc.selectNodes("atom:feed/atom:entry");
      }
      //alert(Sarissa.serialize(objRef.doc) );
      //alert( "items:"+items.length );
      
      for (var i=0; i<items.length; ++i) {
        var item = items[i];
        item.setAttribute("id", "RSS_Item_"+mbIds.getId());
        //convert to GML?
      }
    }
    this.addFirstListener("loadModel",this.initItems,this);
  
    /**
     * Returns the list of nodes selected by the nodeSelectpath
     * @return list of nodes selected 
     */
    this.getFeatureNodes = function() {
      return this.doc.selectNodes(this.nodeSelectXpath);
    }
  
    /**
     * Returns a label for a node in the feature list
     * @param featureNode the feature node to selectfrom
     * @return a label for this feature
     */
    this.getFeatureName = function(featureNode) {
      var labelNode = featureNode.selectSingleNode("rss:title");
      if( labelNode == null )
        labelNode = featureNode.selectSingleNode("atom:title");
      return labelNode?labelNode.firstChild.nodeValue:"No RSS title";
    }
  
    /**
     * Returns an ID value for a node in the feature list
     * @param featureNode the feature node to selectfrom
     * @return ID for this feature
     */
    this.getFeatureId = function(featureNode) {
      var id = featureNode.getAttribute("id")
      if( id )
        return id;
        
      id = featureNode.getAttribute("atom:id")
      if( id )
        return id;
        
      return "no_id";
    }
  
    /**
     * Returns a point geometry for the feature
     * @param featureNode the feature node to select from
     * @return the geometric point for the node
     */
    this.getFeaturePoint = function(featureNode) {
      if (featureNode.selectSingleNode("geo:long")) {
        var pointX = featureNode.selectSingleNode("geo:long").firstChild.nodeValue;
        var pointY = featureNode.selectSingleNode("geo:lat").firstChild.nodeValue;
        return new Array(pointX, pointY);
      } else {
         var pos = featureNode.selectSingleNode("georss:where/gml:Point/gml:pos")
         if( pos != null ) {
  	     var coordstr = pos.firstChild.nodeValue
  	     //alert("coords:"+coordstr );
  	     var coords = coordstr.split(" ")
  	     var pointX = coords[0]
  	     var pointY = coords[1]
  	     return new Array(pointX, pointY);
         } else {
           return new Array(0,0);  //or some other error to return?
         }
      }
    }
   
    /**
    * Returns a specific icon for that entry
    * @param featureNode the feature node to select from
    * @return the geometric point for the node
    */
    this.getFeatureIcon = function( featureNode ) {
      if( featureNode == null )
        return null;
        
      // look for an icon tag
      var icon = featureNode.selectSingleNode("atom:icon");
      if (icon != undefined) {
        return icon.firstChild.nodeValue;
      } else {
        return null;
      }
    }
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/GetMap.js
  
  Index: GetMap.js
  ===================================================================
  /*
  Author:       Mike Adair  mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  /**
   * Model which represents the results of a GetMap request.  In this case the 
   * mime type of the model document is probably be an image type.
   * tbd: this still needed?
   * @constructor
   * @base ModelBase
   * @param modelNode  The model's XML object node from the configuration document.
   * @param parent The model object that this model belongs to.
   */
  function GetMap(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
    this.namespace = "xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs'";
  
    this.prePaint = function(objRef) {
      objRef.stylesheet.setParameter("width", objRef.containerModel.getWindowWidth() );
      objRef.stylesheet.setParameter("height", objRef.containerModel.getWindowHeight() );
      bBox=objRef.containerModel.getBoundingBox();
      var bboxStr = bBox[0]+","+bBox[1]+","+bBox[2]+","+bBox[3];
      objRef.stylesheet.setParameter("bbox", bboxStr );
      objRef.stylesheet.setParameter("srs", objRef.containerModel.getSRS() );
      objRef.stylesheet.setParameter("version", objRef.model.getVersion(objRef.featureNode) );
      objRef.stylesheet.setParameter("baseUrl", objRef.model.getServerUrl("GetMap") );
      objRef.stylesheet.setParameter("mbId", objRef.featureNode.getAttribute("id") );
      objRef.resultDoc = objRef.featureNode;
    }
  
    /**
     * 
     * @param objRef Pointer to this object.
     */
    this.loadLayer = function(objRef, feature) {
      objRef.featureNode = feature;
      objRef.paint(objRef);
    }
    this.addListener("GetMap", this.loadLayer, this);
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/Logger.js
  
  Index: Logger.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Records a log of events that occur over the course of mapbuilder execution
   * @constructor
   * @base ModelBase
   * @author Mike Adair
   * @param modelNode Pointer to the xml node for this model from the config file.
   * @param parent    The parent model for the object.
   */
  function Logger(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
    this.namespace = "xmlns:mb='http://mapbuilder.sourceforge.net/mapbuilder'";
  
    //create a new document
    this.doc = Sarissa.getDomDocument("http://mapbuilder.sourceforge.net/mapbuilder","mb:Logger");//!no prefix on the URL
    Sarissa.setXpathNamespaces(this.doc, this.namespace);
    this.doc.async = false;
    this.doc.validateOnParse=false;  //IE6 SP2 parsing bug
  
    /**
     * appends a new entry in the log file
     * @param evenType    the name of the event that occured
     * @param listenerId  the ID of the listener object
     * @param targetId    the ID of the object passed to the listener function
     * @param paramValue  any parameter info supplied to the listener function
     */
    this.logEvent = function(eventType, listenerId, targetId, paramValue) {
      var eventLog = this.doc.createElement("event");
      eventLog.setAttribute("time", new Date().getTime());
      eventLog.setAttribute("listener", listenerId);
      eventLog.setAttribute("target", targetId);
      if (paramValue) eventLog.setAttribute("param", paramValue);
      eventLog.appendChild(this.doc.createTextNode(eventType));
      this.doc.documentElement.appendChild(eventLog);
    }
  
    /**
     * clears all entries in the log file
     */
    this.clearLog = function() {
      while (this.doc.documentElement.hasChildNodes() ) {
        this.doc.documentElement.removeChild(this.doc.documentElement.firstChild);
      }
      this.callListeners("refresh");
    }
  
    /**
     * save the log by http post to the serializeUrl URL provided
     */
    this.saveLog = function() {
      if (config.serializeUrl) {
        var tempDoc = postLoad(config.serializeUrl,logger.doc);
        tempDoc.setProperty("SelectionLanguage", "XPath");
        Sarissa.setXpathNamespaces(tempDoc, "xmlns:xlink='http://www.w3.org/1999/xlink'");
        var onlineResource = tempDoc.selectSingleNode("//OnlineResource");
        var fileUrl = onlineResource.attributes.getNamedItem("xlink:href").nodeValue;
        alert("event log saved as:" + fileUrl);
      } else {
        alert("unable to save event log; provide a serializeUrl property in config");
      }
    }
  
    /**
     * save the log by http post to the serializeUrl URL provided
     */
    this.refreshLog = function(objRef) {
      objRef.callListeners("refresh");
    }
  
    if (parent) parent.addListener("refresh",this.refreshLog, this);
    window.onunload = this.saveLog;   //automatically save the log when the page unloads
    window.logger = this;             //global reference to the logger model
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/Model.js
  
  Index: Model.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Generic Model object for models where no specialization is required.  This is
   * just an instance of a abstract ModelBase.
   * @constructor
   * @base ModelBase
   * @author Mike Adair
   * @param modelNode The model's XML object node from the configuration document
   * @param parent Parent of this model, set to null if there is no parent.
   */
  function Model(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/ModelBase.js
  
  Index: ModelBase.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Base Model class to be inherited by all Model objects and provdes methods
   * and properties common to all models.
   * Stores the XML document as the .doc property of the model.
   * Inherits from the Listener class so all models are also listener objects that
   * can call registered listeners.
   * @constructor
   * @base Listener
   * @author Cameron Shorter
   * @param modelNode   The model's XML object node from the configuration document.
   * @param parentModel The model object that this model belongs to.
   */
  function ModelBase(modelNode, parentModel) {
    // Inherit the Listener functions and parameters
    Listener.apply(this);
  
    //models are loaded asynchronously by default; 
    this.async = true;   //change to false for sync loading
    this.contentType = "text/xml";
  
    this.modelNode = modelNode;
    var idAttr = modelNode.attributes.getNamedItem("id");
    if (idAttr) {
      this.id = idAttr.nodeValue;
    } else {
      //auto generated unique ID assigned to this model
      this.id = "MbModel_" + mbIds.getId();
    }
  
    //get the human readable title for the model
    var titleNode = modelNode.selectSingleNode("mb:title");
    if (titleNode) {
      this.title = titleNode.firstChild.nodeValue;
    } else {
      this.title = this.id;
    }
  
    // set an empty debug property which turns of alert messages for a
    // particular model
    if(modelNode.selectSingleNode("mb:debug"))this.debug="true";
  
    /**
    * set the initial model URL in config.
    * the URL can also be passed in as a URL parameter by using the model ID 
    * as the parameter name (which takes precendence over the config file)
    **/
    if (window.cgiArgs[this.id]) {  
      this.url = window.cgiArgs[this.id];
    } else if (window[this.id]) {  
      this.url = window[this.id];
    } else if (modelNode.url) {  
      this.url = modelNode.url;
    } else {
      var defaultModel = modelNode.selectSingleNode("mb:defaultModelUrl");
      if (defaultModel) this.url = defaultModel.firstChild.nodeValue;
    }
  
    //set the method property
    var method = modelNode.selectSingleNode("mb:method");
    if (method) {
      this.method = method.firstChild.nodeValue;
    } else {
      this.method = "get";
    }
  
    //set the namespace property
    var namespace = modelNode.selectSingleNode("mb:namespace");
    if (namespace) {
      this.namespace = namespace.firstChild.nodeValue;
    }
  
    var templateAttr = modelNode.attributes.getNamedItem("template");
    if (templateAttr) {
      this.template = (templateAttr.nodeValue=="true")?true:false;
      this.modelNode.removeAttribute("template");
    }
  
    //get the xpath to select nodes from the parent doc
    var nodeSelectXpath = modelNode.selectSingleNode("mb:nodeSelectXpath");
    if (nodeSelectXpath) {
      this.nodeSelectXpath = nodeSelectXpath.firstChild.nodeValue;
    }
  
    /**
     * Get the value of a node as selected by an XPath expression.1
     * @param objRef Reference to this node.
     * @param xpath XPath of the node to update.
     * @return value of the node or null if XPath does not find a node.
     */
    this.getXpathValue=function(objRef,xpath){
      if (!objRef.doc) return null; 
      node=objRef.doc.selectSingleNode(xpath);
      if(node && node.firstChild){
        return node.firstChild.nodeValue;
      }else{
        return null;
      }
    }
  
    /**
     * Update the value of a node within this model's XML document.
     * Triggers a refresh event from the model.
     * @param objRef Reference to this node.
     * @param xpath Xpath of the node to update.
     * @param value Node's new value.
     * @param refresh determines if the model should be refreshed (optional).
     * @return Returns false if Xpath does not find a node.
     */
    this.setXpathValue=function(objRef,xpath,value,refresh){
      if (refresh==null) refresh=true;
      var node=objRef.doc.selectSingleNode(xpath);
      if(node){
        if(node.firstChild){
          node.firstChild.nodeValue=value;
        }else{
          dom=Sarissa.getDomDocument();
          v=dom.createTextNode(value);
          node.appendChild(v);
        }
        if (refresh) objRef.setParam("refresh");
        return true;
      }else{
        return false;
      }
    }
  
    /**
     * Load a Model's document.  
     * This will only occur if the model.url property is set. 
     * Calling this method triggers several events:
     *   modelStatus - to indicate that the model state is changing
     *   newModel - to give widgets a chance to clear themselves before the doc is loaded
     *   loadModel - to indicate that the document is loaded successfully
     *
     * @param objRef Pointer to the model object being loaded.
     */
    this.loadModelDoc = function(objRef){
      //alert("loading:"+objRef.url);
  
      if (objRef.url) {
        objRef.callListeners( "newModel" );
        objRef.setParam("modelStatus","loading");
  
        if (objRef.contentType == "image") {
          //image models are set as a DOM image object
          objRef.doc = new Image();
          objRef.doc.src = objRef.url;
          //objRef.doc.onload = callback //TBD: for when image is loaded
  
        } else {
          //XML content type
          var xmlHttp = new XMLHttpRequest();
          
          var sUri = objRef.url;
          if ( sUri.indexOf("http://")==0 ) {
            if (objRef.method == "get") {
              sUri = getProxyPlusUrl(sUri);
            } else {
              sUri = config.proxyUrl;
            }
          }
          xmlHttp.open(objRef.method, sUri, objRef.async);
          if (objRef.method == "post") {
            xmlHttp.setRequestHeader("content-type",objRef.contentType);
            xmlHttp.setRequestHeader("serverUrl",objRef.url);
          }
          
          xmlHttp.onreadystatechange = function() {
            objRef.setParam("modelStatus",httpStatusMsg[xmlHttp.readyState]);
            if (xmlHttp.readyState==4) {
              if (xmlHttp.status >= 400) {   //http errors status start at 400
                var errorMsg = "error loading document: " + sUri + " - " + xmlHttp.statusText + "-" + xmlHttp.responseText;
                alert(errorMsg);
                objRef.setParam("modelStatus",errorMsg);
                return;
              } else {
                //alert(xmlHttp.getResponseHeader("Content-Type"));
                if ( null==xmlHttp.responseXML ) {
                  alert( "null XML response:" + xmlHttp.responseText );
                } else {
                  objRef.doc = xmlHttp.responseXML;
                  //if (objRef.doc.documentElement.nodeName.search(/exception/i)>=0) {
                  //  objRef.setParam("modelStatus",-1);
                  //  alert("Exception:"+Sarissa.serialize(xmlHttp.responseText));
                  //}
                }
                objRef.finishLoading();
              }
            }
          }
  
          xmlHttp.send(objRef.postData);
  
          if (!objRef.async) {
            if (xmlHttp.status >= 400) {   //http errors status start at 400
              var errorMsg = "error loading document: " + sUri + " - " + xmlHttp.statusText + "-" + xmlHttp.responseText;
              alert(errorMsg);
              this.objRef.setParam("modelStatus",errorMsg);
              return;
            } else {
              //alert(xmlHttp.getResponseHeader("Content-Type"));
              if ( null==xmlHttp.responseXML ) alert( "null XML response:" + xmlHttp.responseText );
              objRef.doc = xmlHttp.responseXML;
              objRef.finishLoading();
            }
          }
  
          //objRef.doc.validateOnParse=false;  //IE6 SP2 parsing bug
        }
      }
    }
  
    /**
     * Set the model's XML document using an XML object as a parameter.
     * @param objRef Pointer to this object.
     * @param newModel XML object to be inserted into the new model.
     */
    this.setModel=function(objRef,newModel){
      objRef.callListeners("newModel");
      objRef.doc=newModel;
      if ((newModel == null) && objRef.url) {
        objRef.url = null;
      }
      objRef.finishLoading();
    }
  
    /**
     * Common steps to be carried out after all manner of model loading
     * Called to set the namespace for XPath selections and call the loadModel
     * listeners.
     */
    this.finishLoading = function() {
      // the following two lines are needed for IE; set the namespace for selection
      if(this.doc){
        this.doc.setProperty("SelectionLanguage", "XPath");
        if(this.namespace) Sarissa.setXpathNamespaces(this.doc, this.namespace);
  
        // Show the newly loaded XML document
        if(this.debug) alert("Loading Model:"+this.id+" "+Sarissa.serialize(this.doc));
        this.callListeners("contextLoaded");  //PGC
        this.callListeners("loadModel");
      }
    }
  
    /**
     * Load XML for a model from an httpPayload object.  This will also handle
     * instantiating template models if they have the "template" attribute set.
     * To update model data, use:<br/>
     * httpPayload=new Object();<br/>
     * httpPayload.url="url" or null. If set to null, all dependant widgets
     *   will be removed from the display.<br/>
     * httpPayload.httpMethod="post" or "get"<br/>
     * httpPayload.postData=XML or null<br/>
     * @param objRef    Pointer to the model object being loaded.
     * @param httpPayload an object to fully specify the request to be made
     */
    this.newRequest = function(objRef, httpPayload){
      var model = objRef;
      // if the targetModel is a template model, then create new model object and
      // assign it an id
      if (objRef.template) {
        var parentNode = objRef.modelNode.parentNode;
        var newConfigNode;
        if(_SARISSA_IS_IE) {
          newConfigNode = parentNode.appendChild(modelNode.cloneNode(true));
        } else {
          newConfigNode = parentNode.appendChild(objRef.modelNode.ownerDocument.importNode(objRef.modelNode,true));
        }
        newConfigNode.removeAttribute("id");  //this will get created automatically
        //set defaultModelUrl config properties
        model = objRef.createObject(newConfigNode);
        model.callListeners("init");
        if (!objRef.templates) objRef.templates = new Array();
        objRef.templates.push(model);
      }
  
      //set the payload in the model and issue the request
      model.url = httpPayload.url;
      if (!model.url) model.doc=null;
      model.method = httpPayload.method;
      model.postData = httpPayload.postData;
      model.loadModelDoc(model);
    }
   
   /**
     * deletes all template models and clears their widgets
     */
    this.deleteTemplates = function() {
      if (this.templates) {
        while( model=this.templates.pop() ) {
          model.setParam("newModel");
          var parentNode = this.modelNode.parentNode;
          parentNode.removeChild(model.modelNode);
        }
      }
    }
  
   /**
     * save the model by posting it to the serializeUrl, which is defined as a 
     * property of config.
     * @param objRef Pointer to this object.
     */
    this.saveModel = function(objRef) {
      if (config.serializeUrl) {
        var response = postLoad(config.serializeUrl, objRef.doc);
        response.setProperty("SelectionLanguage", "XPath");
        Sarissa.setXpathNamespaces(response, "xmlns:xlink='http://www.w3.org/1999/xlink'");
        var onlineResource = response.selectSingleNode("//OnlineResource");
        var fileUrl = onlineResource.attributes.getNamedItem("xlink:href").nodeValue;
        objRef.setParam("modelSaved", fileUrl);
      } else {
        alert("serializeUrl must be specified in config to save a model");
      }
    }
  
    /**
     * Creates all mapbuilder JavaScript objects based on the Object nodes defined
     * in the configuration file.
     * A reference to the created model is stored as a property of the config.objects
     * property using the model's ID; you can always get a reference to a mapbuilder
     * object as: "config.objects.objectId"
     * @param configNode The node from config for the model to be created
     */
    this.createObject = function(configNode) {
      var objectType = configNode.nodeName;
      var evalStr = "new " + objectType + "(configNode,this);";
      var newObject = eval( evalStr );
      if ( newObject ) {
        config.objects[newObject.id] = newObject;
        return newObject;
      } else { 
        alert("error creating object:" + objectType);
      }
    }
  
    /**
     * Creates all the mapbuilder objects from the config file as selected by the
     * XPath value passed in.
     * @param objectXpath The XPath for the set of nodes being created
     */
    this.loadObjects = function(objectXpath) {
      //loop through all nodes selected from config
      var configObjects = this.modelNode.selectNodes( objectXpath );
      for (var i=0; i<configObjects.length; i++ ) {
        this.createObject( configObjects[i]);
      }
    }
  
    /**
     * Initialization of all javascript model, widget and tool objects for this model. 
     * Calling this method triggers an init event for this model.
     * @param objRef Pointer to this object.
     */
    this.parseConfig = function(objRef) {
      objRef.loadObjects("mb:widgets/*");
      objRef.loadObjects("mb:tools/*");
      objRef.loadObjects("mb:models/*");
    }
  
    /**
     * Listener registered with the parent model to call refresh listeners when 
     * the model document is loaded
     * @param objRef Pointer to this object.
     */
    this.refresh = function(objRef) {
      objRef.setParam("refresh",true);
    }
    this.addListener("loadModel",this.refresh, this);
  
    /**
     * Listener registered with the parent model to call init listeners when 
     * the parent model is init'ed
     * @param objRef Pointer to this object.
     */
    this.init = function(objRef) {
      objRef.callListeners("init");
    }
  
    /**
     * Listener registered with the parent model to remove the doc and url 
     * of child models whenever the parent is reloaded.
     * @param objRef Pointer to this object.
     */
    this.clearModel = function(objRef) {
      objRef.doc=null;
      //objRef.url=null;
    }
  
    //don't load in models and widgets if this is the config doc, 
    //defer that to an explcit config.init() call in mapbuilder.js
    if (parentModel) {
      this.parentModel = parentModel;
      this.parentModel.addListener("init",this.init, this);
      this.parentModel.addListener("loadModel",this.loadModelDoc, this);
      this.parentModel.addListener("newModel", this.clearModel, this);
      this.parseConfig(this);
    }
  }
  
  //ModelBase.prototype.httpStatusMsg = ['uninitialized','loading','loaded','interactive','completed'];
  var httpStatusMsg = ['uninitialized','loading','loaded','interactive','completed'];
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/OwsCatResources.js
  
  Index: OwsCatResources.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/model/FeatureCollection.js");
  
  /**
   * Generic Model object for models where no specialization is required.  This is
   * just an instance of a abstract ModelBase.
   * @constructor
   * @base FeatureCollection
   * @author Mike Adair
   * @param modelNode The model's XML object node from the configuration document
   * @param parent Parent of this model, set to null if there is no parent.
   */
  function OwsCatResources(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    FeatureCollection.apply(this, new Array(modelNode, parent));
  
    this.namespace = "xmlns:owscat='http://www.ec.gc.ca/owscat' xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs'";
  }
  
  /**
   * Returns the featureType node with the specified name from the list of nodes
   * selected by the nodeSelectXpath from the capabilities doc.
   * @param featureName name of the featureType to look up
   * @return the featureType node with the specified name.
   */
  OwsCatResources.prototype.getFeatureNode = function(featureName) {
      return this.doc.selectSingleNode(this.nodeSelectXpath+"[owscat:name='"+featureName+"']");
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/OwsContext.js
  
  Index: OwsContext.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores an OWS Context document as defined by the OGC interoperability
   * experiment. This model should be eventually merged with the standard OGC 
   * context doc.
   * Listeners supported by this model:
   * "refresh" called when window parameters (width/height, bbox) are changed
   * "hidden" called when visibilty of a layer is changed
   * "wfs_getFeature" called when feature resources are loaded
   *
   * @constructor
   * @base ModelBase
   * @author Mike Adair
   * @requires Sarissa
   * 
   */
  function OwsContext(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    this.namespace = "xmlns:wmc='http://www.opengis.net/context' xmlns:ows='http://www.opengis.net/ows' xmlns:ogc='http://www.opengis.net/ogc' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xlink='http://www.w3.org/1999/xlink'";
  
    // ===============================
    // Update of Context Parameters
    // ===============================
  
    /**
     * Change a Layer's visibility.
     * @param layerName  The name of the layer that is to be changed
     * @param hidden     String with the value to be set; 1=hidden, 0=visible.
     */
    this.setHidden=function(layerName, hidden){
      // Set the hidden attribute in the Context
      var hiddenValue = "0";
      if (hidden) hiddenValue = "1";
        
      var layer=this.getFeatureNode(layerName);
      layer.setAttribute("hidden", hiddenValue);
      // Call the listeners
      this.callListeners("hidden", layerName);
    }
  
    /**
     * Get the layer's visiblity attribute value.
     * @param layerName  The name of the layer that is to be changed
     * @return hidden  String with the value; 1=hidden, 0=visible.
     */
    this.getHidden=function(layerName){
      var hidden=1;
      var layer=this.getFeatureNode(layerName)
      return layer.getAttribute("hidden");
    }
  
    /**
     * Get the BoundingBox.
     * @return BoundingBox array in form (xmin,ymin,xmax,ymax).
     */
    this.getBoundingBox=function() {
      // Extract BoundingBox from the context
      //boundingBox=this.doc.documentElement.getElementsByTagName("BoundingBox").item(0);
      var lowerLeft=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/ows:BoundingBox/ows:LowerCorner");
      var upperRight=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/ows:BoundingBox/ows:UpperCorner");
      var strBbox = new String(lowerLeft.firstChild.nodeValue + " " + upperRight.firstChild.nodeValue).split(" ");
      var bbox = new Array();
      for (i=0; i<strBbox.length; ++i) {
        bbox[i] = parseFloat(strBbox[i]);
      }
      return bbox;
    }
  
    /**
     * Set the BoundingBox element and call the refresh listeners
     * @param boundingBox array in the sequence (xmin, ymin, xmax, ymax).
     */
    this.setBoundingBox=function(boundingBox) {
      // Set BoundingBox in context
      var lowerLeft=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/ows:BoundingBox/ows:LowerCorner");
      lowerLeft.firstChild.nodeValue = boundingBox[0] + " " + boundingBox[1];
      var upperRight=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/ows:BoundingBox/ows:UpperCorner");
      upperRight.firstChild.nodeValue = boundingBox[2] + " " + boundingBox[3];
      // Call the listeners
      this.callListeners("bbox");
    }
  
    /**
     * Set the Spacial Reference System for layer display and layer requests.
     * @param srs The Spatial Reference System.
     */
    this.setSRS=function(srs) {
      //bbox=this.doc.documentElement.getElementsByTagName("BoundingBox").item(0);
      var bbox=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/ows:BoundingBox");
      bbox.setAttribute("crs",srs);
      this.callListeners("srs");
    }
  
    /**
     * Set the Spacial Reference System for layer display and layer requests.
     * @return srs The Spatial Reference System.
     */
    this.getSRS=function() {
      //bbox=this.doc.documentElement.getElementsByTagName("BoundingBox").item(0);
      var bbox=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/ows:BoundingBox");
      srs=bbox.getAttribute("crs");
      return srs;
    }
  
    /**
     * Get the Window width.
     * @return width The width of map window from the context document
     */
    this.getWindowWidth=function() {
      //var win=this.doc.documentElement.getElementsByTagName("Window").item(0);
      var win=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/wmc:Window");
      width=win.getAttribute("width");
      return width;
    }
  
    /**
     * Set the Window width.
     * @param width The width of map window (therefore of map layer images).
     */
    this.setWindowWidth=function(width) {
      //win=this.doc.documentElement.getElementsByTagName("Window").item(0);
      var win=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/wmc:Window");
      win.setAttribute("width", width);
      this.callListeners("resize");
    }
  
    /**
     * Get the Window height.
     * @return height The height of map window from the context document.
     */
    this.getWindowHeight=function() {
      //var win=this.doc.documentElement.getElementsByTagName("Window").item(0);
      var win=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/wmc:Window");
      height=win.getAttribute("height");
      return height;
    }
  
    /**
     * Set the Window height.
     * @param height The height of map window (therefore of map layer images).
     */
    this.setWindowHeight=function(height) {
      //win=this.doc.documentElement.getElementsByTagName("Window").item(0);
      var win=this.doc.selectSingleNode("/wmc:OWSContext/wmc:General/wmc:Window");
      win.setAttribute("height", height);
      this.callListeners("resize");
    }
  
    /**
     * Returns the serverUrl for the layer passed in as the feature argument.
     * @param requestName ignored for context docs (only GetMap supported)
     * @param method ignored for context docs (only GET supported)
     * @param feature the node for the feature from the context doc
     * @return height String URL for the GetMap request
     */
    this.getServerUrl = function(requestName, method, feature) {
      return feature.selectSingleNode("wmc:Server/wmc:OnlineResource").getAttribute("xlink:href");
    }
  
    /**
     * Returns the WMS version for the layer passed in as the feature argument
     * @param feature the node for the feature from the context doc
     * @return the WMS GetMap version for the Layer.
     */
    this.getVersion = function(feature) {  
      return feature.selectSingleNode("wmc:Server").getAttribute("version");
    }
  
    /**
     * Get HTTP method for the specified feature
     * @param feature the Layer node from the context doc
     * @return the HTTP method to get the feature with
     */
    this.getMethod = function(feature) {
      return feature.selectSingleNode("wmc:Server/wmc:OnlineResource").getAttribute("wmc:method");
    }
  
    /**
     * returns a node that has the specified feature name in the context doc
     * @param featureName Name element value to return
     * @return the node from the context doc with the specified feature name
     */
    this.getFeatureNode = function(featureName) {
      return this.doc.selectSingleNode(this.nodeSelectXpath+"/*[wmc:Name='"+featureName+"']");
    }
  
    /**
     * listener method which loads WFS features from the context doc, after WMS 
     * layers are loaded.
     * @param objRef Pointer to this object.
     */
    this.loadFeatures = function(objRef) {
      var nodeSelectXpath = objRef.nodeSelectXpath + "/wmc:FeatureType[wmc:Server/@service='OGC:WFS']/wmc:Name";
      var featureList = objRef.doc.selectNodes(nodeSelectXpath);
      for (var i=0; i<featureList.length; i++) {
        var featureName = featureList[i].firstChild.nodeValue;
        objRef.setParam('wfs_GetFeature',featureName);
      }
    }
    this.addListener("loadModel", this.loadFeatures, this);
  
    /**
     * Listener function which sets stylesheet params for WebServiceRequests
     * @param objRef pointer to this object
     * @param featureNodeId the id of the node in the doc to be processed by the stylesheet
     */
    this.setRequestParameters = function(featureName, requestStylesheet) {
      var feature = this.getFeatureNode(featureName);
      if (feature.selectSingleNode("ogc:Filter")) {
        requestStylesheet.setParameter("filter", escape(Sarissa.serialize(feature.selectSingleNode("ogc:Filter"))) );
      }
    }
    //this.addFirstListener("wfs_GetFeature", this.setRequestParameters, this);
  
    /**
     * Method to get a list of queryable layers
     * @return the list with queryable layers
     */
    this.getQueryableLayers = function() {
      var listNodeArray = this.doc.selectNodes("/wmc:OWSContext/wmc:ResourceList/wmc:Layer[attribute::queryable='1']/wmc:Name");
      return listNodeArray;
    }
  
    /**
     * Method to get a list of all layers in the context doc
     * TBD: merge this with above, passing queryable as an optional boolean param?
     * @return the list with all layers
     */
    this.getAllLayers = function() {
      var listNodeArray = this.doc.selectNodes("/wmc:OWSContext/wmc:ResourceList/wmc:Layer");
      return listNodeArray;
    }
  
    /**
     * Method to get a layer with the specified name in the context doc
     * @param layerName the layer to be returned
     * @return the list with all layers
     */
    this.getLayer = function(layerName) {
      var layer = this.doc.selectSingleNode("/wmc:OWSContext/wmc:ResourceList/wmc:Layer[wmc:Name='"+layerName+"']");
      //TBD: add in time stamp
      return layer;
    }
  
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/Proj.js
  
  Index: Proj.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
                Richard Greenwood rich at greenwoodmap.com
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Provides latitude/longitude to map projection (and vice versa) transformation methods.
   * Initialized with EPSG codes.  Has properties for units and title strings.
   * All coordinates are handled as points which is a 2 element array where x is
   * the first element and y is the second.
   * For the Forward() method pass in lat/lon and it returns map XY.
   * For the Inverse() method pass in map XY and it returns lat/long.
   *
   * TBD: retrieve initialization params (and conversion code?) from a web service
   *
   * @constructor
   *
   * @param srs         The SRS (EPSG code) of the projection
   */
  
  function Proj(srs) {
    this.srs = srs.toUpperCase();
    switch(this.srs) {
      case "EPSG:4326":       //lat/lon projection WGS_84
      case "EPSG:4269":       //lat/lon projection WGS_84
      case "CRS:84":          //lat/lon projection WGS_84
      case "EPSG:4965":       //lat/lon projection RGF93G IGN-F FD 2005
      case new String("http://www.opengis.net/gml/srs/epsg.xml#4326").toUpperCase():
        this.Forward = identity;
        this.Inverse = identity;
        this.units = "degrees";
        this.title = "Lat/Long";
        break;
      case "EPSG:42101":        //North American LCC WGS_84
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378137.0,6356752.314245,49.0,77.0,-95.0, 0.0, 0.0, -8000000));
        this.units = "meters";
        this.title = "Lambert Conformal Conic";
        break;
      case "EPSG:42304":        //North American LCC NAD_83
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378137.0,6356752.314,49.0,77.0,-95.0, 49.0, 0.0, 0));
        this.units = "meters";
        this.title = "Lambert Conformal Conic";
        break;
      case "EPSG:26986":        //NAD83 / Massachusetts Mainland
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378137.0,6356752.314,42.68333333333333,41.71666666666667,-71.5, 41.0, 200000, 750000));
        this.units = "meters";
        this.title = "Massachusetts Mainland (LCC)";
        break;
      case "EPSG:32761":        //Polar Stereographic
      case "EPSG:32661":
        this.Init = psinit;
        this.Forward = ll2ps;
        this.Inverse = ps2ll;
        this.Init(new Array(6378137.0, 6356752.314245, 0.0, -90.0, 2000000, 2000000));
        this.units = "meters";
        this.title = "Polar Stereographic";
        break;
      case "EPSG:27561"://LAMB1 IGN-F modification FD 2005
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378249.2, 6356515.0, 49.50, 49.50, 2.33722916655, 49.50, 600000.0, 200000.0));
        this.units = "meters";
        this.title = "Lambert Conformal Conic";
        break;
      case "EPSG:27562"://LAMB2 IGN-F modification FD 2005
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378249.2, 6356515.0, 46.80, 46.80, 2.33722916655, 46.8, 600000.0, 200000.0));
        this.units = "meters";
        this.title = "Lambert Conformal Conic";
        break;
      case "EPSG:27572"://LAMBE IGN-F modification FD 2005
      case "EPSG:27582"://LAMB2 IGN-F modification (deprecated) FD 2005
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378249.2, 6356515.0, 46.80, 46.80, 2.33722916655, 46.8, 600000.0, 2200000.0));
        this.units = "meters";
        this.title = "Lambert Conformal Conic";
        break;
      case "EPSG:27563"://LAMB3 IGN-F modification FD 2005
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378249.2, 6356515.0, 44.10, 44.10, 2.33722916655, 44.10, 600000.0, 200000.0));
        this.units = "meters";
        this.title = "Lambert Conformal Conic";
        break;
      case "EPSG:27564"://LAMB4 IGN-F modification FD 2005
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378249.2, 6356515.0, 42.17, 42.17, 2.33722916655, 42.17, 234.358, 185861.369));
        this.units = "meters";
        this.title = "Lambert Conformal Conic";
        break;
      case "EPSG:2154" ://LAMB93 IGN-F modification FD 2005
        this.Init = lccinit;
        this.Forward = ll2lcc;
        this.Inverse = lcc2ll;
        this.Init(new Array(6378137.0, 6356752.3141, 44.00, 49.00, 3.00000000001, 46.50, 700000.0, 6600000.0));
        this.units = "meters";
        this.title = "Lambert Conformal Conic";
        break;
      case "EPSG:4326":case "EPSG:4269":case "CRS:84":case "EPSG:4965":case new String("http://www.opengis.net/gml/srs/epsg.xml#4326").toUpperCase():
        this.Forward=identity;
        this.Inverse=identity;
        this.units="degrees";
        this.title="Lat/Long";
        break;
      case "EPSG:102758":this.title="NAD 1983 StatePlane Wyoming West FIPS 4904 US Survey Feet";
        this.Init=tminit;
        this.Forward=ll2tm
        this.Inverse=tm2ll;
        this.Init(new Array(grs80[0], grs80[1], 0.9999375, -110.0833333333333, 40.5, 800000, 100000));
        this.units="usfeet";
        break;
      case "EPSG:32158":this.title="NAD 1983 StatePlane Wyoming West meters";
        this.Init=tminit;
        this.Forward=ll2tm
        this.Inverse=tm2ll;
        this.Init(new Array(grs80[0], grs80[1], 0.9999375, -110.0833333333333, 40.5, 800000, 100000));
        this.units="meters";
        break;
      // UTM NAD83 Zones 3 thru 23
      case"EPSG:26903":case"EPSG:26904":case"EPSG:26905":case"EPSG:26906":case"EPSG:26907":case"EPSG:26908":case"EPSG:26909":
      case"EPSG:26910":case"EPSG:26911":case"EPSG:26912":case"EPSG:26913":case"EPSG:26914":case"EPSG:26915":case"EPSG:26916":
      case"EPSG:26917":case"EPSG:26918":case"EPSG:26919":case"EPSG:26920":case"EPSG:26921":case"EPSG:26922":case"EPSG:26923":
        this.title="NAD83 / UTM zone "+ srs.substr(8,2)+"N";
        this.Init=utminit;
        this.Forward=ll2tm;
        this.Inverse=tm2ll;
        this.Init(new Array(grs80[0], grs80[1], 0.9996, srs.substr(8,2)));
        this.units="meters";
      break;
      // UTM WGS84 Zones 1 thru 60 North
      case"EPSG:32601":case"EPSG:32602":
      case"EPSG:32603":case"EPSG:32604":case"EPSG:32605":case"EPSG:32606":case"EPSG:32607":case"EPSG:32608":case"EPSG:32609":
      case"EPSG:32610":case"EPSG:32611":case"EPSG:32612":case"EPSG:32613":case"EPSG:32614":case"EPSG:32615":case"EPSG:32616":
      case"EPSG:32617":case"EPSG:32618":case"EPSG:32619":case"EPSG:32620":case"EPSG:32621":case"EPSG:32622":case"EPSG:32623":
      case"EPSG:32624":case"EPSG:32625":case"EPSG:32626":case"EPSG:32627":case"EPSG:32628":case"EPSG:32629":
      case"EPSG:32630":case"EPSG:32631":case"EPSG:32632":case"EPSG:32633":case"EPSG:32634":case"EPSG:32635":case"EPSG:32636":
      case"EPSG:32637":case"EPSG:32638":case"EPSG:32639":case"EPSG:32640":case"EPSG:32641":case"EPSG:32642":
      case"EPSG:32643":case"EPSG:32644":case"EPSG:32645":case"EPSG:32646":case"EPSG:32647":case"EPSG:32648":case"EPSG:32649":
      case"EPSG:32650":case"EPSG:32651":case"EPSG:32652":case"EPSG:32653":case"EPSG:32654":case"EPSG:32655":case"EPSG:32656":
      case"EPSG:32657":case"EPSG:32658":case"EPSG:32659":case"EPSG:32660":
        this.title="WGS84 / UTM zone " + srs.substr(8,2) + "N";
        this.Init=utminit;
        this.Forward=ll2tm;
        this.Inverse=tm2ll;
        this.Init(new Array(wgs84[0], wgs84[1], 0.9996, srs.substr(8,2)));
        this.units="meters";
      break;
      // UTM WGS84 Zones 1 thru 60 South
      case"EPSG:32701":case"EPSG:32702":
      case"EPSG:32703":case"EPSG:32704":case"EPSG:32705":case"EPSG:32706":case"EPSG:32707":case"EPSG:32708":case"EPSG:32709":
      case"EPSG:32710":case"EPSG:32711":case"EPSG:32712":case"EPSG:32713":case"EPSG:32714":case"EPSG:32715":case"EPSG:32716":
      case"EPSG:32717":case"EPSG:32718":case"EPSG:32719":case"EPSG:32720":case"EPSG:32721":case"EPSG:32722":case"EPSG:32723":
      case"EPSG:32724":case"EPSG:32725":case"EPSG:32726":case"EPSG:32727":case"EPSG:32728":case"EPSG:32729":
      case"EPSG:32730":case"EPSG:32731":case"EPSG:32732":case"EPSG:32733":case"EPSG:32734":case"EPSG:32735":case"EPSG:32736":
      case"EPSG:32737":case"EPSG:32738":case"EPSG:32739":case"EPSG:32740":case"EPSG:32741":case"EPSG:32742":
      case"EPSG:32743":case"EPSG:32744":case"EPSG:32745":case"EPSG:32746":case"EPSG:32747":case"EPSG:32748":case"EPSG:32749":
      case"EPSG:32750":case"EPSG:32751":case"EPSG:32752":case"EPSG:32753":case"EPSG:32754":case"EPSG:32755":case"EPSG:32756":
      case"EPSG:32757":case"EPSG:32758":case"EPSG:32759":case"EPSG:32760":
        this.title="WGS84 / UTM zone " + srs.substr(8,2) + "S";
        this.Init=utminit;
        this.Forward=ll2tm;
        this.Inverse=tm2ll;
        this.Init(new Array(wgs84[0], wgs84[1], 0.9996, "-"+srs.substr(8,2)));
        this.units="meters";
      break;
      case "EPSG:26591":this.title="Monte Mario (Rome) / Italy zone 1";
        this.Init=tminit;
        this.Forward=ll2tm
        this.Inverse=tm2ll;
        this.Init(new Array(6378388.0, 6356911.94612795,0.9996, 9, 0.0, 1500000.0, 0.0));
        this.units="meters";
        break;
      case "SCENE":             //this is really a pixel projection with bilinear interpolation of the corners to get ll
        this.Init = sceneInit;
        this.Forward = ll2scene;
        this.Inverse = scene2ll;
        this.GetXYCoords = identity;  //override to get line 0 at top left
        this.GetPLCoords = identity; //
        break;
      case "PIXEL":
        this.Forward = ll2pixel;
        this.Inverse = pixel2ll;
        this.units = "pixels";
        this.GetXYCoords = identity;  //override to get line 0 at top left
        this.GetPLCoords = identity; //
        break;
      default:
        //or retrieve parameters from web service based on SRS lookup
        alert("unsupported map projection: "+this.srs);
    }
  
    this.matchSrs = function(otherSrs) {
      if (this.srs == otherSrs.toUpperCase() ) return true;
      return false;
    }
  
  }
  
  function identity(coords) {
    return coords;
  }
  
  /**
   * Scene projection forward transformation.
   * Forward trasnformation need reverse bilinear interpolation or orbit modelling
   * (to be implemented)
   * @param coords  Lat/Long coords passed in
   * @return map coordinates
   */
  function ll2scene(coords) {
    alert("ll2scene not defined");
    //return new Array(124, 15+256);  //for testing only,
    return null;
  }
  
  /**
   * Scene projection Inverse transformation.
   * This is really a pixel representation with bi-linear interpolation of the corner coords.
   * @param coords  map coordinates passed in
   * @return Lat/Long coords
   */
  function scene2ll(coords) {
    var xpct = (coords[0]-this.ul[0])/(this.lr[0]-this.ul[0]);
    var ypct = (coords[1]-this.ul[1])/(this.lr[1]-this.ul[1]);
  //  alert("pct:"+xpct+":"+ypct);
    var lon = bilinterp(xpct, ypct, this.cul[0], this.cur[0], this.cll[0], this.clr[0])
    var lat = bilinterp(xpct, ypct, this.cul[1], this.cur[1], this.cll[1], this.clr[1])
    return new Array(lon, lat);
  }
  
  /**
   * Scene projection initialization function
   * @param param  array of the corner coordinates (which are in turn 2D point arrays)
   * in the order upper-left, upper-right, lower-left, lower-right
   */
  function sceneInit(param) {
    this.cul = param[0];
    this.cur = param[1];
    this.cll = param[2];
    this.clr = param[3];
  }
  
  /**
   * Bilinear interpolation function to return an interpolated value for either
   * x or y for some point located within a box where the XY of the corners are known.
   * This should be applied to the x and y coordinates separately,
   * ie. first interpolate for the x value, then the y.
   * the a,b,c,d params are thus the x or y values at the corners.
   * @param x distance from the left side of the box as a percentage
   * @param y distance from the top of the box as a percentage
   * @param a either x or y value at the UL corner of the box
   * @param b either x or y value at the UR corner of the box
   * @param c either x or y value at the LL corner of the box
   * @param d either x or y value at the LR corner of the box
   */
  function bilinterp(x, y, a, b, c, d) {
    var top = x*(b-a) + a;
    var bot = x*(d-c) + c;
  //alert("top:"+top+"  bot:"+bot);
    return y*(bot-top) + top;
  }
  
  // pixel projection object definition
  // a pixel representation
  // forward transformation
  function ll2pixel(coords) {
    alert("ll2pixel not defined");
    return null;
  }
  
  // inverse transformation
  function pixel2ll(coords) {
    alert("pixel2ll not defined");
  //  return new Array(lon, lat);
    return null;
  }
  
  
  /****************************************************************************
  The following code is a direct port of GCTPC coordinate transformation code
  from C to Javascript.  For more information go to http://edcftp.cr.usgs.gov/pub//software/gctpc/
  Currently suppported projections include: Lambert Conformal Conic (LCC),
  Lat/Long, Polar Stereographic, Transverse Mercator (including UTM).
  Porting C to Javascript is fairly straightforward so other support for more
  projections is easy to add.
  */
  
  var PI = Math.PI;
  var HALF_PI = PI*0.5;
  var TWO_PI = PI*2.0;
  var EPSLN = 1.0e-10;
  var R2D = 57.2957795131;
  var D2R =0.0174532925199;
  var R = 6370997.0;        // Radius of the earth (sphere)
  
  
  // Initialize the Lambert Conformal conic projection
  // -----------------------------------------------------------------
  function lccinit(param) {
  // array of:  r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north
  //double c_lat;                   /* center latitude                      */
  //double c_lon;                   /* center longitude                     */
  //double lat1;                    /* first standard parallel              */
  //double lat2;                    /* second standard parallel             */
  //double r_maj;                   /* major axis                           */
  //double r_min;                   /* minor axis                           */
  //double false_east;              /* x offset in meters                   */
  //double false_north;             /* y offset in meters                   */
  
    this.r_major = param[0];
    this.r_minor = param[1];
    var lat1 = param[2] * D2R;
    var lat2 = param[3] * D2R;
    this.center_lon = param[4] * D2R;
    this.center_lat = param[5] * D2R;
    this.false_easting = param[6];
    this.false_northing = param[7];
  
  // Standard Parallels cannot be equal and on opposite sides of the equator
    if (Math.abs(lat1+lat2) < EPSLN) {
      alert("Equal Latitiudes for St. Parallels on opposite sides of equator - lccinit");
      return;
    }
  
    var temp = this.r_minor / this.r_major;
    this.e = Math.sqrt(1.0 - temp*temp);
  
    var sin1 = Math.sin(lat1);
    var cos1 = Math.cos(lat1);
    var ms1 = msfnz(this.e, sin1, cos1);
    var ts1 = tsfnz(this.e, lat1, sin1);
  
    var sin2 = Math.sin(lat2);
    var cos2 = Math.cos(lat2);
    var ms2 = msfnz(this.e, sin2, cos2);
    var ts2 = tsfnz(this.e, lat2, sin2);
  
    var ts0 = tsfnz(this.e, this.center_lat, Math.sin(this.center_lat));
  
    if (Math.abs(lat1 - lat2) > EPSLN) {
      this.ns = Math.log(ms1/ms2)/Math.log(ts1/ts2);
    } else {
      this.ns = sin1;
    }
    this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));
    this.rh = this.r_major * this.f0 * Math.pow(ts0, this.ns);
  }
  
  
  // Lambert Conformal conic forward equations--mapping lat,long to x,y
  // -----------------------------------------------------------------
  function ll2lcc(coords) {
  
    var lon = coords[0];
    var lat = coords[1];
  
  // convert to radians
    if ( lat <= 90.0 && lat >= -90.0 && lon <= 180.0 && lon >= -180.0) {
      lat *= D2R;
      lon *= D2R;
    } else {
      alert("*** Input out of range ***: lon: "+lon+" - lat: "+lat);
      return null;
    }
  
    var con  = Math.abs( Math.abs(lat) - HALF_PI);
    var ts;
    if (con > EPSLN) {
      ts = tsfnz(this.e, lat, Math.sin(lat) );
      rh1 = this.r_major * this.f0 * Math.pow(ts, this.ns);
    } else {
      con = lat * this.ns;
      if (con <= 0) {
        alert("Point can not be projected - ll2lcc");
        return null;
      }
      rh1 = 0;
    }
    var theta = this.ns * adjust_lon(lon - this.center_lon);
    var x = rh1 * Math.sin(theta) + this.false_easting;
    var y = this.rh - rh1 * Math.cos(theta) + this.false_northing;
  
    return new Array(x,y);
  }
  
  // Lambert Conformal Conic inverse equations--mapping x,y to lat/long
  // -----------------------------------------------------------------
  function lcc2ll(coords) {
  
    var rh1, con, ts;
    var lat, lon;
    x = coords[0] - this.false_easting;
    y = this.rh - coords[1] + this.false_northing;
    if (this.ns > 0) {
      rh1 = Math.sqrt (x * x + y * y);
      con = 1.0;
    } else {
      rh1 = -Math.sqrt (x * x + y * y);
      con = -1.0;
    }
    var theta = 0.0;
    if (rh1 != 0) {
      theta = Math.atan2((con * x),(con * y));
    }
    if ((rh1 != 0) || (this.ns > 0.0)) {
      con = 1.0/this.ns;
      ts = Math.pow((rh1/(this.r_major * this.f0)), con);
      lat = phi2z(this.e, ts);
      if (lat == -9999) return null;
    } else {
      lat = -HALF_PI;
    }
    lon = adjust_lon(theta/this.ns + this.center_lon);
    return new Array(R2D*lon, R2D*lat);
  }
  
  //*******************************************************************************
  //NAME                            POLAR STEREOGRAPHIC
  // converted from the GCTPC package
  //* Variables common to all subroutines in this code file
  //  static double r_major;    /* major axis     */
  //  static double r_minor;    /* minor axis     */
  //  static double e;      /* eccentricity     */
  //  static double e4;     /* e4 calculated from eccentricity*/
  //  static double center_lon;   /* center longitude   */
  //  static double center_lat;   /* center latitude    */
  //  static double fac;      /* sign variable    */
  //  static double ind;      /* flag variable    */
  //  static double mcs;      /* small m      */
  //  static double tcs;      /* small t      */
  //  static double false_northing;   /* y offset in meters   */
  //  static double false_easting;    /* x offset in meters   */
  
  
  //* Initialize the Polar Stereographic projection
  function psinit(param) {
  // array consisting of:  r_maj,r_min,c_lon,c_lat,false_east,false_north)
  //double c_lon;       /* center longitude in degrees  */
  //double c_lat;       /* center latitude in degrees   */
  //double r_maj;       /* major axis     */
  //double r_min;       /* minor axis     */
  //double false_east;      /* x offset in meters   */
  //double false_north;     /* y offset in meters   */
  
    this.r_major = param[0];
    this.r_minor = param[1];
    this.center_lon = param[2] * D2R;
    this.center_lat = param[3] * D2R;
    this.false_easting = param[4];
    this.false_northing = param[5];
  
    var temp = this.r_minor / this.r_major;
    this.e = 1.0 - temp*temp;
    this.e = Math.sqrt(this.e);
    var con = 1.0 + this.e;
    var com = 1.0 - this.e;
    this.e4 = Math.sqrt( Math.pow(con,con) * Math.pow(com,com) );
    this.fac = (this.center_lat < 0) ? -1.0 : 1.0;
    this.ind = 0;
    if (Math.abs(Math.abs(this.center_lat) - HALF_PI) > EPSLN) {
      this.ind = 1;
      var con1 = this.fac * this.center_lat;
      var sinphi = Math.sin(con1);
      this.mcs = msfnz(this.e, sinphi, Math.cos(con1));
      this.tcs = tsfnz(this.e, con1, sinphi);
    }
  }
  
  //* Polar Stereographic forward equations--mapping lat,long to x,y
  //  --------------------------------------------------------------*/
  function ll2ps(coords) {
  
    var lon = coords[0];
    var lat = coords[1];
  
    var con1 = this.fac * adjust_lon(lon - this.center_lon);
    var con2 = this.fac * lat;
    var sinphi = Math.sin(con2);
    var ts = tsfnz(this.e, con2, sinphi);
    if (this.ind != 0) {
      rh = this.r_major * this.mcs * ts / this.tcs;
    } else {
      rh = 2.0 * this.r_major * ts / this.e4;
    }
    var x = this.fac * rh * Math.sin(con1) + this.false_easting;
    var y = -this.fac * rh * Math.cos(con1) + this.false_northing;;
  
    return new Array(x,y);
  }
  
  //* Polar Stereographic inverse equations--mapping x,y to lat/long
  //  --------------------------------------------------------------*/
  function ps2ll(coords) {
  
    x = (coords[0] - this.false_easting) * this.fac;
    y = (coords[1] - this.false_northing) * this.fac;
    var rh = Math.sqrt(x * x + y * y);
    if (this.ind != 0) {
      ts = rh * this.tcs/(this.r_major * this.mcs);
    } else {
      ts = rh * this.e4/(this.r_major * 2.0);
    }
    var lat = this.fac * phi2z(this.e, ts);
    if (lat == -9999) return null;
    var lon = 0;
    if (rh == 0) {
      lon = this.fac * this.center_lon;
    } else {
      lon = adjust_lon(this.fac * Math.atan2(x, -y) + this.center_lon);
    }
    return new Array(R2D*lon, R2D*lat);
  }
  
  // following constants added by Greenwood
  function semi_minor(a, f) { return a-(a*(1/f)); }
  
  var grs80  = new Array(6378137.0, 6356752.31414036); // r_maj, r_min
  var wgs84  = new Array(6378137.0, 6356752.31424518);
  var wgs72  = new Array(6378135.0, 6356750.52001609);
  var intl  = new Array(6378388.0, 6356911.94612795); // (f=297) from ESRI
  
  var usfeet = 1200/3937;  // US Survey foot
  var feet = 0.3048;  // International foot
  
  // following functions from gctpc cproj.c for transverse mercator projections
  function e0fn(x){return(1.0-0.25*x*(1.0+x/16.0*(3.0+1.25*x)));}
  function e1fn(x){return(0.375*x*(1.0+0.25*x*(1.0+0.46875*x)));}
  function e2fn(x){return(0.05859375*x*x*(1.0+0.75*x));}
  function e3fn(x){return(x*x*x*(35.0/3072.0));}
  function mlfn(e0,e1,e2,e3,phi){return(e0*phi-e1*Math.sin(2.0*phi)+e2*Math.sin(4.0*phi)-e3*Math.sin(6.0*phi));}
  
  /**
    Initialize Transverse Mercator projection
  */
  function tminit(param)  {
    this.r_maj=param[0];
    this.r_min=param[1];
    this.scale_fact=param[2];
    this.lon_center=param[3]*D2R;
    this.lat_origin=param[4]*D2R;
    this.false_easting=param[5];
    this.false_northing=param[6];
    var temp = this.r_min / this.r_maj;
    this.es = 1.0 - Math.pow(temp,2);
  //  this.e = Math.sqrt(this.es);
    this.e0 = e0fn(this.es);
    this.e1 = e1fn(this.es);
    this.e2 = e2fn(this.es);
    this.e3 = e3fn(this.es);
    this.ml0 = this.r_maj * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat_origin);
    this.esp = this.es / (1.0 - this.es);
    this.ind = (this.es < .00001) ? 1 : 0;
  }
  
  /**
    Initialize UTM projection
  */
  function utminit(param) {
    this.r_maj=param[0];
    this.r_min=param[1];
    this.scale_fact=param[2];
    var zone=param[3];
    this.lat_origin = 0.0;
    this.lon_center = ((6 * Math.abs(zone)) - 183) * D2R;
    this.false_easting = 500000.0;
    this.false_northing = (zone < 0) ? 10000000.0 : 0.0;
    var temp = this.r_min / this.r_maj;
    this.es = 1.0 - Math.pow(temp,2);
  //  this.e = Math.sqrt(this.es);
    this.e0 = e0fn(this.es);
    this.e1 = e1fn(this.es);
    this.e2 = e2fn(this.es);
    this.e3 = e3fn(this.es);
    this.ml0 = this.r_maj * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat_origin);
    this.esp = this.es / (1.0 - this.es);
    this.ind = (this.es < .00001) ? 1 : 0;
  } // utminit()
  
  /**
    Transverse Mercator Forward  - long/lat to x/y
  */
  function ll2tm(coords) {
    var lon=coords[0]*D2R;
    var lat=coords[1]*D2R;
    var delta_lon = adjust_lon(lon - this.lon_center); /* Delta longitude (Given longitude - center  */
    var con;    /* cone constant */
    var x, y;
    var sin_phi=Math.sin(lat);
    var cos_phi=Math.cos(lat);
  
    if (this.ind != 0) {
      var b = cos_phi * Math.sin(delta_lon);
      if ((Math.abs(Math.abs(b) - 1.0)) < .0000000001)  {
        alert("Error in ll2tm(): Point projects into infinity");
        return(93);
      } else {
        x = .5 * this.r_maj * this.scale_fact * Math.log((1.0 + b)/(1.0 - b));
        con = Math.acos(cos_phi * Math.cos(delta_lon)/Math.sqrt(1.0 - b*b));
        if (lat < 0)
          con = - con;
        y = this.r_maj * this.scale_fact * (con - this.lat_origin);
      }
    } else {
      var al  = cos_phi * delta_lon;
      var als = Math.pow(al,2);
      var c   = this.esp * Math.pow(cos_phi,2);
      var tq  = Math.tan(lat);
      var t   = Math.pow(tq,2);
      con = 1.0 - this.es * Math.pow(sin_phi,2);
      var n   = this.r_maj / Math.sqrt(con);
      var ml  = this.r_maj * mlfn(this.e0, this.e1, this.e2, this.e3, lat);
  
      x = this.scale_fact * n * al * (1.0 + als / 6.0 * (1.0 - t + c + als / 20.0 * (5.0 - 18.0 * t + Math.pow(t,2) + 72.0 * c - 58.0 * this.esp))) + this.false_easting;
      y = this.scale_fact * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24.0 * (5.0 - t + 9.0 * c + 4.0 * Math.pow(c,2) + als / 30.0 * (61.0 - 58.0 * t + Math.pow(t,2) + 600.0 * c - 330.0 * this.esp))))) + this.false_northing;
  
      switch(this.units){
        case "usfeet":
          x /= usfeet;
          y /= usfeet
          break;
        case "feet":
          x = x / feet;
          y = y / feet;
          break;
      } // switch()
    }
    return new Array(x,y);
  } // ll2tm()
  
  /**
    Transverse Mercator Inverse  -  x/y to long/lat
  */
  function tm2ll(coords) {
    var x=coords[0];
    var y=coords[1];
    var con, phi;  /* temporary angles       */
    var delta_phi; /* difference between longitudes    */
    var i;
    var max_iter = 6;      /* maximun number of iterations */
    var lat, lon;
  
    if (this.ind != 0) {   /* spherical form */
      var f = exp(x/(this.r_maj * this.scale_fact));
      var g = .5 * (f - 1/f);
      var temp = this.lat_origin + y/(this.r_maj * this.scale_fact);
      var h = cos(temp);
      con = sqrt((1.0 - h * h)/(1.0 + g * g));
      lat = asinz(con);
      if (temp < 0)
        lat = -lat;
      if ((g == 0) && (h == 0)) {
        lon = this.lon_center;
      } else {
        lon = adjust_lon(atan2(g,h) + this.lon_center);
      }
    } else {    // ellipsoidal form
      x = x - this.false_easting;
      y = y - this.false_northing;
  
      con = (this.ml0 + y / this.scale_fact) / this.r_maj;
      phi = con;
      for (i=0;;i++) {
        delta_phi=((con + this.e1 * Math.sin(2.0*phi) - this.e2 * Math.sin(4.0*phi) + this.e3 * Math.sin(6.0*phi)) / this.e0) - phi;
        phi += delta_phi;
        if (Math.abs(delta_phi) <= EPSLN) break;
        if (i >= max_iter) {
          alert ("Error in tm2ll(): Latitude failed to converge");
          return(95);
        }
      } // for()
      if (Math.abs(phi) < HALF_PI) {
        // sincos(phi, &sin_phi, &cos_phi);
        var sin_phi=Math.sin(phi);
        var cos_phi=Math.cos(phi);
        var tan_phi = Math.tan(phi);
        var c = this.esp * Math.pow(cos_phi,2);
        var cs = Math.pow(c,2);
        var t = Math.pow(tan_phi,2);
        var ts = Math.pow(t,2);
        con = 1.0 - this.es * Math.pow(sin_phi,2);
        var n = this.r_maj / Math.sqrt(con);
        var r = n * (1.0 - this.es) / con;
        var d = x / (n * this.scale_fact);
        var ds = Math.pow(d,2);
        lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t + 10.0 * c - 4.0 * cs - 9.0 * this.esp - ds / 30.0 * (61.0 + 90.0 * t + 298.0 * c + 45.0 * ts - 252.0 * this.esp - 3.0 * cs)));
        lon = adjust_lon(this.lon_center + (d * (1.0 - ds / 6.0 * (1.0 + 2.0 * t + c - ds / 20.0 * (5.0 - 2.0 * c + 28.0 * t - 3.0 * cs + 8.0 * this.esp + 24.0 * ts))) / cos_phi));
      } else {
        lat = HALF_PI * sign(y);
        lon = this.lon_center;
      }
    }
    return new Array(lon*R2D, lat*R2D);
  } // tm2ll()
  
  
  // Function to compute the constant small m which is the radius of
  //   a parallel of latitude, phi, divided by the semimajor axis.
  // -----------------------------------------------------------------
  function msfnz(eccent, sinphi, cosphi) {
        var con = eccent * sinphi;
        return cosphi/(Math.sqrt(1.0 - con * con));
  }
  
  // Function to compute the constant small t for use in the forward
  //   computations in the Lambert Conformal Conic and the Polar
  //   Stereographic projections.
  // -----------------------------------------------------------------
  function tsfnz(eccent, phi, sinphi) {
    var con = eccent * sinphi;
    var com = .5 * eccent;
    con = Math.pow(((1.0 - con) / (1.0 + con)), com);
    return (Math.tan(.5 * (HALF_PI - phi))/con);
  }
  
  
  // Function to compute the latitude angle, phi2, for the inverse of the
  //   Lambert Conformal Conic and Polar Stereographic projections.
  // ----------------------------------------------------------------
  function phi2z(eccent, ts) {
    var eccnth = .5 * eccent;
    var con, dphi;
    var phi = HALF_PI - 2 * Math.atan(ts);
    for (i = 0; i <= 15; i++) {
      con = eccent * Math.sin(phi);
      dphi = HALF_PI - 2 * Math.atan(ts *(Math.pow(((1.0 - con)/(1.0 + con)),eccnth))) - phi;
      phi += dphi;
      if (Math.abs(dphi) <= .0000000001) return phi;
    }
    alert("Convergence error - phi2z");
    return -9999;
  }
  
  // Function to return the sign of an argument
  function sign(x) { if (x < 0.0) return(-1); else return(1);}
  
  // Function to adjust longitude to -180 to 180; input in radians
  function adjust_lon(x) {x=(Math.abs(x)<PI)?x:(x-(sign(x)*TWO_PI));return(x);}
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/Transaction.js
  
  Index: Transaction.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/model/ModelBase.js");
  
  /**
   * Stores a WFS Transaction reponse as defined by the Open GIS Consortium
   * http://opengis.org (WFS).  
   * Extends ModelBase, which extends Listener.
   *
   * Listeners implemented:
   *
   * @constructor
   * @author Mike Adair
   * @param modelNode Pointer to the xml node for this model from the config file.
   * @param parent    The parent model for the object.
   */
  function Transaction(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
    this.namespace = "xmlns:gml='http://www.opengis.net/gml' xmlns:wfs='http://www.opengis.net/wfs'";
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/WfsCapabilities.js
  
  Index: WfsCapabilities.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a Web Feature (WFS) Capabilities document as defined by the 
   * Open Geospatial Consortium (http://opengis.org).
   *
   * @constructor
   * @author Mike Adair
   * @param modelNode   The model's XML object node from the configuration document.
   * @param parent The model object that this widget belongs to.
   */
  function WfsCapabilities(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    this.namespace = "xmlns:wfs='http://www.opengis.net/wfs'";
  
    /**
     * Returns the serverUrl for the WFS request passed in with the specified
     * HTTP method from the capabilities doc.
     * @param requestName the WFS request to get the URL for
     * @param method http method for the request
     * @param feature ignored for WFS docs
     * @return URL for the specified request with the specified method
     */
    this.getServerUrl = function(requestName, method, feature) {
      var xpath = "/wfs:WFS_Capabilities/wfs:Capability/wfs:Request/"+requestName;
      if (method.toLowerCase() == "post") {
        xpath += "/wfs:DCPType/wfs:HTTP/wfs:Post";
      } else {
        xpath += "/wfs:DCPType/wfs:HTTP/wfs:Get";
      }
      return this.doc.selectSingleNode(xpath).getAttribute("onlineResource");
    }
  
    /**
     * Returns the version for the WFS
     * @return the WFS version
     */
    this.getVersion = function() {
      var xpath = "/wfs:WFS_Capabilities";
      return this.doc.selectSingleNode(xpath).getAttribute("version");
    }
  
    /**
     * Get HTTP method used to retreive this model
     * @return the HTTP method 
     */
    this.getMethod = function() {
      return this.method;
    }
  
    /**
     * Returns the featureType node with the specified name from the list of nodes
     * selected by the nodeSelectXpath from the capabilities doc.
     * @param featureName name of the featureType to look up
     * @return the featureType node with the specified name.
     */
    this.getFeatureNode = function(featureName) {
      return this.doc.selectSingleNode(this.nodeSelectXpath+"[wfs:Name='"+featureName+"']");
    }
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/WmsCapabilities.js
  
  Index: WmsCapabilities.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a Web Map Server (WMS) Capabilities document as defined by the 
   * Open Geospatial Consortium (http://opengis.org and extensions the the WMC.  
   *
   * @constructor
   * @author Mike Adair
   * @param modelNode   The model's XML object node from the configuration document.
   * @param parent The model object that this widget belongs to.
   */
  function WmsCapabilities(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    this.namespace = "xmlns:wms='http://www.opengis.net/wms' xmlns:xlink='http://www.w3.org/1999/xlink'";
  
    /**
     * Returns the serverUrl for the WMS request passed in with the specified
     * HTTP method from the capabilities doc.
     * @param requestName the WMS request to get the URL for
     * @param method http method for the request
     * @param feature ignored for WMS docs
     * @return URL for the specified request with the specified method
     */
    this.getServerUrl = function(requestName, method, feature) {
      var version = this.getVersion();
      if (version == "1.0.0") {
        requestName = requestName.substring(3);  //strip of "Get" part of request name
        var xpath = "/WMT_MS_Capabilities/Capability/Request/"+requestName;
        if (method.toLowerCase() == "post") {
          xpath += "/DCPType/HTTP/Post";
        } else {
          xpath += "/DCPType/HTTP/Get";
        }
        return this.doc.selectSingleNode(xpath).getAttribute("onlineResource");
      } else {
        var xpath = "/WMT_MS_Capabilities/Capability/Request/"+requestName;
        if (method.toLowerCase() == "post") {
          xpath += "/DCPType/HTTP/Post/OnlineResource";
        } else {
          xpath += "/DCPType/HTTP/Get/OnlineResource";
        }
        return this.doc.selectSingleNode(xpath).getAttribute("xlink:href");
      }
    }
  
    /**
     * Returns the version for the WMS
     * @return the WMS version
     */
    this.getVersion = function() {
      var xpath = "/WMT_MS_Capabilities";
      return this.doc.selectSingleNode(xpath).getAttribute("version");
    }
  
    /**
     * @return the title of the WMS server
     */
    this.getServerTitle = function() {
      var xpath = "/WMT_MS_Capabilities/Service/Title";
      var node = this.doc.selectSingleNode(xpath);
      return node.firstChild.nodeValue;
    }
  
    /**
     * @return the first image format listed
     */
    this.getImageFormat = function() {
      var version = this.getVersion();
      if (version == "1.0.0") {
        var xpath = "/WMT_MS_Capabilities/Capability/Request/Map/Format";  //strip of "Get" part of request name
        var node = this.doc.selectSingleNode(xpath);
        if(_SARISSA_IS_IE) {
          return "image/"+node.firstChild.baseName.toLowerCase();
        }
        else {
  	    return "image/"+node.firstChild.localName.toLowerCase();
  	  }
      } else {
        var xpath = "/WMT_MS_Capabilities/Capability/Request/GetMap/Format";
        var node = this.doc.selectSingleNode(xpath);
        return node.firstChild.nodeValue;
      }
    }
  
    /**
     * @return the name of the WMS server
     */
    this.getServiceName = function() {
      var xpath = "/WMT_MS_Capabilities/Service/Name";
      var node = this.doc.selectSingleNode(xpath);
      return node.firstChild.nodeValue;
    }
  
    /**
     * Returns the Layer node with the specified name from the list of nodes
     * selected by the nodeSelectXpath from the capabilities doc.
     * @param featureName name of the featureType to look up
     * @return the Layer node with the specified name.
     */
    this.getFeatureNode = function(featureName) {
      return this.doc.selectSingleNode(this.nodeSelectXpath+"[Name='"+featureName+"']");
    }
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/WpsCapabilities.js
  
  Index: WpsCapabilities.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a Web Processing service (WPS) Capabilities document as defined by the 
   * Open Geospatial Consortium (http://opengis.org).
   *
   * @constructor
   * @author Mike Adair
   * @param modelNode   The model's XML object node from the configuration document.
   * @param parent The model object that this widget belongs to.
   */
  function WpsCapabilities(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    this.namespace = "xmlns:wps='http://www.opengis.net/wps' xmlns:ows='http://www.opengis.net/ows' xmlns:xlink='http://www.w3.org/1999/xlink'";
  
    /**
     * Returns the serverUrl for the WFS request passed in with the specified
     * HTTP method from the capabilities doc.
     * @param requestName the WFS request to get the URL for
     * @param method http method for the request
     * @param feature ignored for WFS docs
     * @return URL for the specified request with the specified method
     */
    this.getServerUrl = function(requestName, method, feature) {
      var requestParts = requestName.split(':');
      var xpath = "/wps:Capabilities/ows:OperationsMetadata/ows:Operation[@name='"+requestParts[1]+"']";
      if (method.toLowerCase() == "post") {
        xpath += "/ows:DCP/ows:HTTP/ows:Post";
      } else {
        xpath += "/ows:DCP/ows:HTTP/ows:Get";
      }
      var urlNode = this.doc.selectSingleNode(xpath);
      if (urlNode) {
        return urlNode.getAttribute("xlink:href");
      } else {
        return null;
      }
    }
  
    /**
     * Returns the version for the wps
     * @return the wps version
     */
    this.getVersion = function() {
      var xpath = "/wps:Capabilities";
      return this.doc.selectSingleNode(xpath).getAttribute("version");
    }
  
    /**
     * Get HTTP method used to retreive this model
     * @return the HTTP method 
     */
    this.getMethod = function() {
      return this.method;
    }
  
    /**
     * Returns the featureType node with the specified name from the list of nodes
     * selected by the nodeSelectXpath from the capabilities doc.
     * @param featureName name of the featureType to look up
     * @return the featureType node with the specified name.
     */
    this.getFeatureNode = function(featureName) {
      return this.doc.selectSingleNode(this.nodeSelectXpath+"[wps:Name='"+featureName+"']");
    }
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/model/WpsDescribeProcess.js
  
  Index: WpsDescribeProcess.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Stores a Web Processing service (WPS) Capabilities document as defined by the 
   * Open Geospatial Consortium (http://opengis.org).
   *
   * @constructor
   * @author Mike Adair
   * @param modelNode   The model's XML object node from the configuration document.
   * @param parent The model object that this widget belongs to.
   */
  function WpsDescribeProcess(modelNode, parent) {
    // Inherit the ModelBase functions and parameters
    ModelBase.apply(this, new Array(modelNode, parent));
  
    this.namespace = "xmlns:wps='http://www.opengis.net/wps' xmlns:ows='http://www.opengis.net/ows' xmlns:xlink='http://www.w3.org/1999/xlink'";
  
    /**
     * Returns the serverUrl for the WFS request passed in with the specified
     * HTTP method from the capabilities doc.
     * @param requestName the WFS request to get the URL for
     * @param method http method for the request
     * @param feature ignored for WFS docs
     * @return URL for the specified request with the specified method
     */
    this.getServerUrl = function(requestName, method, feature) {
      return this.parentModel.getServerUrl(requestName, method, feature);
    }
  
    /**
     * Returns the version for the wps
     * @return the wps version
     */
    this.getVersion = function() {
      var xpath = "/wps:ProcessDescription";
      return this.doc.selectSingleNode(xpath).getAttribute("version");
    }
  
    /**
     * Get HTTP method used to retreive this model
     * @return the HTTP method 
     */
    this.getMethod = function() {
      return this.method;
    }
  
    /**
     * Returns the featureType node with the specified name from the list of nodes
     * selected by the nodeSelectXpath from the capabilities doc.
     * @param featureName name of the featureType to look up
     * @return the featureType node with the specified name.
     */
    this.getFeatureNode = function(featureName) {
      return this.doc.selectSingleNode(this.nodeSelectXpath+"[wps:Name='"+featureName+"']");
    }
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/schemas/config.xsd
  
  Index: config.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <!-- edited with XMLSPY v5 U (http://www.xmlspy.com) by Tom Kralidis (NRCAN CCRs) -->
  <xs:schema targetNamespace="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0.0">
  	<xs:annotation>
  		<xs:appinfo>$Id$</xs:appinfo>
  		<xs:documentation xml:lang="en">
  			<xs:description>Application schema for Mapbuilder runtime configuration</xs:description>
  			<xs:copyright>License: LGPL as per: http://www.gnu.org/copyleft/lesser.html</xs:copyright>
  		</xs:documentation>
  	</xs:annotation>
  	<!-- imports -->
  	<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
  	<!-- root element -->
  	<xs:element name="MapbuilderConfig">
  		<xs:annotation>
  			<xs:documentation>root element for all Mapbuilder applications</xs:documentation>
  		</xs:annotation>
  		<xs:complexType>
  			<xs:complexContent>
  				<xs:extension base="mb:AbstractModelType">
  					<xs:sequence>
  						<xs:element name="skinDir" type="mb:urlPathType" minOccurs="0"/>
  						<xs:element name="languages" type="xs:string" minOccurs="0"/>
  						<xs:element name="widgetTextUrl" type="mb:urlPathType" minOccurs="0"/>
  						<xs:element name="proxyUrl" type="mb:urlPathType" minOccurs="0"/>
  						<xs:element name="serializeUrl" type="mb:urlPathType" minOccurs="0"/>
  					</xs:sequence>
  					<xs:attribute name="version" type="xs:string" use="required" fixed="1.0.0">
  						<xs:annotation>
  							<xs:appinfo source="An attribute &quot;version&quot; representing the published specification version number, contains three positive integers, separated by decimal points, in the form &quot;x.y.z&quot;. Each context specification is numbered independently. This attribute is required."/>
  						</xs:annotation>
  					</xs:attribute>
  				</xs:extension>
  			</xs:complexContent>
  		</xs:complexType>
  	</xs:element>
  	<!-- global model extension types; Models type represent different types of XML documents. Use Model for a generic XML document where no customization or specialized methods are required-->
  	<xs:complexType name="ModelType">
  		<xs:annotation>
  			<xs:documentation>A generic base document type to handle any XML document (without any specialized methods)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="ContextType">
  		<xs:annotation>
  			<xs:documentation>A Web Map Context document as specified by the Open GeoSpatial Consortium (http://www.opengeospatial.org/docs/03-036r2.pdf)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="GeoRSSType">
  		<xs:annotation>
  			<xs:documentation>GeoRSS</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:ModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="ContextCollectionType">
  		<xs:annotation>
  			<xs:documentation>A collection of Web Map Context document URLs as specified by the Open GeoSpatial Consortium (http://www.opengeospatial.org/docs/03-036r2.pdf)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="WmsCapabilitiesType">
  		<xs:annotation>
  			<xs:documentation>A document describing the capabilities of an OGC Web Map Service (WMS) as specified by the Open GeoSpatial Consortium (http://portal.opengeospatial.org/files/?artifact_id=5316)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="WfsCapabilitiesType">
  		<xs:annotation>
  			<xs:documentation>A document describing the capabilities of an OGC Web Feature Service (WFS) as specified by the Open GeoSpatial Consortium (https://portal.opengeospatial.org/files/?artifact_id=7176)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="WpsCapabilitiesType">
  		<xs:annotation>
  			<xs:documentation>A document describing the capabilities of an OGC Web Processing Service (WPS) as specified by the Open GeoSpatial Consortium (https://portal.opengeospatial.org/files/?artifact_id=)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="GetMapType">
  		<xs:annotation>
  			<xs:documentation>A response from a WMS for a GetMap operation -  the model in this case is an image</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="WpsDescribeProcessType">
  		<xs:annotation>
  			<xs:documentation>A response from a WPS DescribeProcess operation</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="GetFeatureInfoType">
  		<xs:annotation>
  			<xs:documentation>A response from a WMS for a GetFeatureInfo operation</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractButtonType">
  				<xs:sequence>
  					<xs:element name="context" type="xs:string"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="FeatureCollectionType">
  		<xs:annotation>
  			<xs:documentation>A representation of a geographic Feature or Feature Collection in GML as specified by the Open Geospatial Consortium (http://www.opengis.org/docs/02-069.pdf) </xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="DescribeFeatureTypeType">
  		<xs:annotation>
  			<xs:documentation>A response from a WFS for a DescribeFeatureType operation</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="TransactionType">
  		<xs:annotation>
  			<xs:documentation>A response from a WFS Transaction operation</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractModelType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<!-- global widget extension types -->
  	<xs:complexType name="WidgetType">
  		<xs:annotation>
  			<xs:documentation>A generic widget which will simply process a model with a stylesheet - no specialized listeners provided</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="MapPaneType">
  		<xs:annotation>
  			<xs:documentation>Render a Web Map Context (WMC) document as layered map images.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractMapWidgetType">
  				<xs:sequence>
  					<xs:element name="fixedWidth" type="xs:integer" minOccurs="0"/>
  					<xs:element name="fixedHeight" type="xs:integer" minOccurs="0"/>
  					<xs:element name="loadHidden" type="xs:boolean" minOccurs="0"/>
  					<xs:element name="extraAttributes" type="xs:boolean" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="ModelUrlInputType">
  		<xs:annotation>
  			<xs:documentation>A widget which displays the model URL in a form which also allows the URL to be modified</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType">
  				<xs:sequence>
  					<xs:element name="defaultUrl" type="mb:urlPathType" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="LegendType">
  		<xs:annotation>
  			<xs:documentation>Simple legend for context documents, includes layer title and visibility checkbox</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="CursorTrackType">
  		<xs:annotation>
  			<xs:documentation>A widget to display the mouse coordinates when it is over a MapPane</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType">
  				<xs:sequence>
  					<xs:element name="mouseHandler" type="xs:string"/>
  					<xs:element name="showXY" type="xs:boolean" minOccurs="0"/>
  					<xs:element name="showPx" type="xs:boolean" minOccurs="0"/>
  					<xs:element name="showDMS" type="xs:boolean" minOccurs="0"/>
  					<xs:element name="showLatLong" type="xs:boolean" minOccurs="0"/>
  					<xs:element name="showMGRS" type="xs:boolean" minOccurs="0"/>
  					<xs:element name="precision" type="xs:integer" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="AoiFormType">
  		<xs:annotation>
  			<xs:documentation>Displays a form with North, South, East, West coordinates to read and set the model AOI</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="MapScaleTextType">
  		<xs:annotation>
  			<xs:documentation>A widget to read and write the map scale value</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="SaveModelType">
  		<xs:annotation>
  			<xs:documentation>A widget that provides a link to the initial model URL and a link tosave the current model document to disk (to be deprecated for a tool)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType">
  				<xs:sequence>
  					<xs:element name="serializeUrl" type="mb:urlPathType" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="WmsCapabilitiesImportType">
  		<xs:annotation>
  			<xs:documentation>A form to input a capabilities model and widget output is a context doc (to be deprecated for the WMS Capabilities model)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="Loading2Type">
  		<xs:annotation>
  			<xs:documentation>a widget to display model loading indicator messages</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractWidgetType">
  				<xs:choice>
  					<xs:element name="textMessage" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>a mssage to be displayed instead of the model status message</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="mapContainerId" minOccurs="0"/>
  				</xs:choice>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="CollectionListType">
  		<xs:annotation>
  			<xs:documentation>A widget to display a list of context documents contained in a ContextCollection model</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="FeatureListType">
  		<xs:annotation>
  			<xs:documentation>A widget to display the list of features in a Feature Collection</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="LocationsType">
  		<xs:annotation>
  			<xs:documentation>A widget to display contents of a Locations GML model (quick View presets or gazetteer output) and allow setting the AOI/zoom area for a Context model</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType">
  				<xs:sequence>
  					<xs:element name="selectSize" type="xs:integer" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>defines the size of the select box, i.e. how many lines show in the scroll box; defaults to 1</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="GmlRendererTestType">
  		<xs:annotation>
  			<xs:documentation>A widget to render GML without really rendering it for testing.  A pop-up appears with the GML docuemnt to be rendered.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractMapWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="GmlPointRendererType">
  		<xs:annotation>
  			<xs:documentation>A widget to render GML. </xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractMapWidgetType">
  				<xs:sequence>
  					<xs:element name="normalImage" type="mb:urlPathType"/>
  					<xs:element name="highlightImage" type="mb:urlPathType"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="GmlRendererWZType">
  		<xs:annotation>
  			<xs:documentation>A widget to render GML document using the wz_jsgraphics JavaScript library in a map container widget</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractMapWidgetType">
  				<xs:sequence>
  					<xs:element name="lineColor"/>
  					<xs:element name="lineWidth"/>
  					<xs:element name="fill" minOccurs="0"/>
  					<xs:element name="pointDiameter" type="xs:integer" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="WebServiceFormType">
  		<xs:annotation>
  			<xs:documentation>A widget of config to input simple parameters to be submitted to a web service.  Output is sent to the targetModel.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType">
  				<xs:sequence>
  					<xs:element name="webServiceUrl" type="xs:anyURI" minOccurs="0"/>
  					<xs:element name="serviceType" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="AoiBoxWZType">
  		<xs:annotation>
  			<xs:documentation>A widget to display a map container model's AOI box</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractMapWidgetType">
  				<xs:sequence>
  					<xs:element name="lineColor" type="xs:string" minOccurs="0"/>
  					<xs:element name="lineWidth" type="xs:integer" minOccurs="0"/>
  					<xs:element name="crossSize" type="xs:integer" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="TimeSeriesType">
  		<xs:annotation>
  			<xs:documentation>A MapPane widget to display map layers in a time series</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractMapWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="Caps2ContextType">
  		<xs:annotation>
  			<xs:documentation>A tool which builds a Web Map Context document from a Web Map Capabilities document.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="EditContextType">
  		<xs:annotation>
  			<xs:documentation>Tool which manipulates the Layer list of a Web Map Context document.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="AoiBoxDHTMLType">
  		<xs:annotation>
  			<xs:documentation>A widget to display a map container model's AOI box</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractMapWidgetType">
  				<xs:sequence>
  					<xs:element name="lineColor" type="xs:string" minOccurs="0"/>
  					<xs:element name="lineWidth" type="xs:integer" minOccurs="0"/>
  					<xs:element name="crossSize" type="xs:integer" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="ResourceDropDownType">
  		<xs:annotation>
  			<xs:documentation>A widget to display a list of reources in an OWSContext document</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="ButtonType">
  		<xs:annotation>
  			<xs:documentation>A generic instance of a ButonBase object</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractButtonType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="EditButtonType">
  		<xs:annotation>
  			<xs:documentation>After this button is selected, clicks on a MapPane will add a GML coord to a Line the targetModel FeatureCollection.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractButtonType">
  				<xs:sequence>
  					<xs:element name="transactionResponseModel" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>The model which will be populated with the server response.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="webServiceUrl" type="mb:urlPathType" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>The base URL of the Web Service that will be queried.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="targetContext" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>After a feature has been successfully sent to the Web Service, the targetContext will send a "refresh" event which will cause the map layers to re-render themselves.  This will ensure a modified WFS feature will be re-redered correctly by the querying WMS.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="featureXpath" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>Xpath of the gml:coordinates in the FeatureCollection that will be updated.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="defaultModelUrl" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>URL to an XML file which contains a default FeatureCollect.  The XML will be loaded into the targetModel when this button is selected.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="InsertFeatureType">
  		<xs:annotation>
  			<xs:documentation>When this button is selected, a WFS InsertFeature request is build from the targetModel and posted to the WFS.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:EditButtonType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="WfsGetFeatureType">
  		<xs:annotation>
  			<xs:documentation>After this button is selected, clicks on a MapPane will initiate a WFS GetFeature GET request and the result will be stored in the targetModel FeatureCollection.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:EditButtonType">
  				<xs:sequence>
  					<xs:element name="typeName" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>A commer seperated list of layers to query.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="tolerance" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>The number of pixels around the click point that are included in the query.  tollerance=0 means a Bbox of 1x1 pixel is queried, tollerance=1 means a Bbox of 3x3 is queried, tolerance=2 means a Bbo of 5x5 is queried.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="maxFeatures" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>The maximum number of features returned by the query.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="ProcessArgumentsFormType">
  		<xs:annotation>
  			<xs:documentation>A form widget to enter WPS processing options</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType">
  				<xs:sequence>
  					<xs:element name="mapModel" type="xs:string" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="ShowProcessResultType">
  		<xs:annotation>
  			<xs:documentation>A widget to display the result of a ShowProcess operation on an WPS</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="TabbedContentType">
  		<xs:annotation>
  			<xs:documentation>A widget that displays a list of tabs that can be selected to display other widgets</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType">
  				<xs:sequence>
  					<xs:element name="htmlWorkspace" type="xs:string" minOccurs="0"/>
  					<xs:element name="tab" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="SaveType">
  		<xs:annotation>
  			<xs:documentation>After this button is selected, the Web Map Context is saved on the users local computer.</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractButtonType">
  				<xs:sequence>
  					<xs:element name="popupWindowName" type="xs:string"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<!-- global tools extension types -->
  	<xs:complexType name="AoiMouseHandlerType">
  		<xs:annotation>
  			<xs:documentation>A tool for models of a map container to set the AOI by click and drag of the mouse</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="AoiBoxType">
  		<xs:annotation>
  			<xs:documentation>A tool to draw the AOI box on a map container (to be dprecated for widget version)</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType">
  				<xs:sequence>
  					<xs:element name="lineColor" type="xs:string" minOccurs="0"/>
  					<xs:element name="lineWidth" type="xs:integer" minOccurs="0"/>
  					<xs:element name="crossSize" type="xs:integer" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="DragPanHandlerType">
  		<xs:annotation>
  			<xs:documentation>A tool for models of a map container to click and drag the map to pan</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="MouseClickHandlerType">
  		<xs:annotation>
  			<xs:documentation>A tool for models of a map container to handle mouse click events</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="ZoomToAoiType">
  		<xs:annotation>
  			<xs:documentation>A tool reset the model extent to the AOI </xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="WebServiceRequestType">
  		<xs:annotation>
  			<xs:documentation>A tool which will generate web service requests from a node from the paranet model</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType">
  				<xs:sequence>
  					<xs:element name="requestName" type="xs:string"/>
  					<xs:element name="requestFilter" minOccurs="0"/>
  					<xs:element name="maxFeatures" type="xs:integer" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="MovieLoopType">
  		<xs:annotation>
  			<xs:documentation>Tool to control display of layers as a moive loop</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType">
  				<xs:sequence>
  					<xs:element name="framesPerSecond" type="xs:integer" minOccurs="0"/>
  					<xs:element name="maxFrames" type="xs:integer" minOccurs="0"/>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="HistoryType">
  		<xs:annotation>
  			<xs:documentation>Tool which maintains a history of the map views displayed</xs:documentation>
  		</xs:annotation>
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractToolType"/>
  		</xs:complexContent>
  	</xs:complexType>
  	<!--  document structure -->
  	<xs:complexType name="modelsType">
  		<xs:choice minOccurs="0" maxOccurs="unbounded">
  			<xs:element name="Model" type="mb:ModelType">
  				<xs:annotation>
  					<xs:documentation>A generic model to represent an XML document where no specialized get or set methods are required</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="Context" type="mb:ContextType"/>
  			<xs:element name="OwsContext" type="mb:ContextType"/>
  			<xs:element name="GeoRSS" type="mb:GeoRSSType"/>
  			<xs:element name="ContextCollection" type="mb:ContextCollectionType"/>
  			<xs:element name="WmsCapabilities" type="mb:WmsCapabilitiesType"/>
  			<xs:element name="WfsCapabilities" type="mb:WfsCapabilitiesType"/>
  			<xs:element name="WpsCapabilities" type="mb:WpsCapabilitiesType"/>
  			<xs:element name="FeatureCollection" type="mb:FeatureCollectionType"/>
  			<xs:element name="Transaction" type="mb:TransactionType"/>
  			<xs:element name="DescribeFeatureType" type="mb:DescribeFeatureTypeType"/>
  			<xs:element name="WpsDescribeProcess" type="mb:WpsDescribeProcessType"/>
  			<xs:element name="FeatureTypeSchema" type="mb:ModelType"/>
  			<xs:element name="OwsCatResources" type="mb:ModelType"/>
  		</xs:choice>
  	</xs:complexType>
  	<xs:complexType name="widgetsType">
  		<xs:choice maxOccurs="unbounded">
  			<xs:element name="Widget" type="mb:WidgetType"/>
  			<xs:element name="ModelSwitcher" type="mb:WidgetType"/>
  			<xs:element name="TimeSeries" type="mb:TimeSeriesType"/>
  			<xs:element name="Timestamp" type="mb:WidgetType"/>
  			<xs:element name="MapPane" type="mb:MapPaneType"/>
  			<xs:element name="ModelUrlInput" type="mb:ModelUrlInputType"/>
  			<xs:element name="AoiBoxDHTML" type="mb:AoiBoxDHTMLType"/>
  			<xs:element name="ResourceDropDown" type="mb:ResourceDropDownType"/>
  			<xs:element name="AoiBoxWZ" type="mb:AoiBoxWZType"/>
  			<xs:element name="CursorTrack" type="mb:CursorTrackType"/>
  			<xs:element name="Legend" type="mb:LegendType"/>
  			<xs:element name="AoiForm" type="mb:AoiFormType"/>
  			<xs:element name="MapScaleText" type="mb:MapScaleTextType"/>
  			<xs:element name="SaveModel" type="mb:SaveModelType"/>
  			<xs:element name="Loading2" type="mb:Loading2Type"/>
  			<xs:element name="WmsCapabilitiesImport" type="mb:WmsCapabilitiesImportType"/>
  			<xs:element name="CollectionList" type="mb:CollectionListType"/>
  			<xs:element name="FeatureList" type="mb:FeatureListType"/>
  			<xs:element name="Locations" type="mb:LocationsType"/>
  			<xs:element name="GmlPointRenderer" type="mb:GmlPointRendererType"/>
  			<xs:element name="GmlRendererWZ" type="mb:GmlRendererWZType"/>
  			<xs:element name="WebServiceForm" type="mb:WebServiceFormType"/>
  			<xs:element name="ShowResponse" type="mb:WidgetType"/>
  			<xs:element name="TransactionResponse" type="mb:WidgetType"/>
  			<xs:element name="Button" type="mb:ButtonType"/>
  			<xs:element name="ZoomIn" type="mb:ButtonType"/>
  			<xs:element name="ZoomOut" type="mb:ButtonType"/>
  			<xs:element name="DragPan" type="mb:ButtonType"/>
  			<xs:element name="SetAoi" type="mb:ButtonType"/>
  			<xs:element name="Reset" type="mb:ButtonType"/>
  			<xs:element name="Back" type="mb:ButtonType"/>
  			<xs:element name="Forward" type="mb:ButtonType"/>
  			<xs:element name="GetFeatureInfo" type="mb:GetFeatureInfoType"/>
  			<xs:element name="EditPoint" type="mb:EditButtonType"/>
  			<xs:element name="EditLine" type="mb:EditButtonType"/>
  			<xs:element name="InsertFeature" type="mb:InsertFeatureType"/>
  			<xs:element name="DeleteFeature" type="mb:EditButtonType"/>
  			<xs:element name="WfsGetFeature" type="mb:WfsGetFeatureType"/>
  			<xs:element name="Save" type="mb:SaveType"/>
  			<xs:element name="Loading" type="mb:WidgetType"/>
  			<xs:element name="LayerControl">
  				<xs:complexType>
  					<xs:complexContent>
  						<xs:extension base="mb:WidgetType">
  							<xs:all>
  								<xs:element name="moveUpImage" minOccurs="0"/>
  								<xs:element name="moveDownImage" minOccurs="0"/>
  								<xs:element name="deleteImage" minOccurs="0"/>
  							</xs:all>
  						</xs:extension>
  					</xs:complexContent>
  				</xs:complexType>
  			</xs:element>
  			<xs:element name="ModelStatus" type="mb:WidgetType"/>
  			<xs:element name="ProcessArgumentsForm" type="mb:ProcessArgumentsFormType"/>
  			<xs:element name="ShowProcessResult" type="mb:ShowProcessResultType"/>
  			<xs:element name="TabbedContent" type="mb:TabbedContentType"/>
  			<xs:element name="OWSCatSearchForm" type="mb:WidgetType"/>
  		</xs:choice>
  	</xs:complexType>
  	<xs:complexType name="toolsType">
  		<xs:choice maxOccurs="unbounded">
  			<xs:element name="AoiMouseHandler" type="mb:AoiMouseHandlerType"/>
  			<xs:element name="AoiBox" type="mb:AoiBoxType"/>
  			<xs:element name="DragPanHandler" type="mb:DragPanHandlerType"/>
  			<xs:element name="MouseClickHandler" type="mb:MouseClickHandlerType"/>
  			<xs:element name="ZoomToAoi" type="mb:ZoomToAoiType"/>
  			<xs:element name="WebServiceRequest" type="mb:WebServiceRequestType"/>
  			<xs:element name="Caps2Context" type="mb:Caps2ContextType"/>
  			<xs:element name="EditContext" type="mb:EditContextType"/>
  			<xs:element name="MovieLoop" type="mb:MovieLoopType"/>
  			<xs:element name="History" type="mb:HistoryType"/>
  		</xs:choice>
  	</xs:complexType>
  	<!--  global base types -->
  	<xs:complexType name="AbstractModelType" abstract="true">
  		<xs:sequence>
  			<xs:element name="title" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>optional human-readable label that can be used with model</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="defaultModelUrl" type="mb:urlPathType" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>The URL where the model gets loaded from.  If the method is HTTP GET, then include the full query string in the URL.  Optional, if present, the model will be loaded when the application loads.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="postData" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>contains a fragment of XML data which will be posted to the server URL when using HTTP POST.  Optional.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="method" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>the HTTP method to use to retrieve the model.  Optional, defaults to GET.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="models" type="mb:modelsType" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>A list of child models objects where a parent/child relationship can be established between models (e.g. a DescribeFeatureType model can be a child of a WfsCapabilities model.  Optional.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="widgets" type="mb:widgetsType" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>a list of widgets for this model.  Optional, however a model will usually have at least one widget.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="tools" type="mb:toolsType" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>a list of tools that can be used to control this model. Optional.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="namespace" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>The namespace that will be used by Xpath queries on this model.  Optional.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="nodeSelectXpath" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>an XPath expression to select an array of nodes from the document with the .getFeature method</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  		</xs:sequence>
  		<xs:attribute name="id" type="mb:idType" use="required"/>
  		<xs:attribute name="template" type="xs:boolean" use="optional"/>
  	</xs:complexType>
  	<xs:complexType name="AbstractWidgetType" abstract="true">
  		<xs:sequence>
  			<xs:element name="htmlTagId" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>the ID of the HTML element in the web page where this widget's ouput should be placed.  Optional, if present, this value will be used instead of the widget's ID attribute.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="outputNodeId" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>the ID to be assigned to the widget stylesheet output.  This property can be used to share the same HTML element among widgets if multiple widgets use the same value for this property.  Optional, if not present, an id will be automatically assigned to the widget stylehseet output. </xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="targetModel" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>used so that the actions of this widget can affect a model other than this widget's parent model.  The value of this property is the ID of another model object in the config document.  Every widget will have a targetModel property.  Optional, if missing the targetModel is set to the parent model</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="debug" nillable="true" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>an empty property element to show debuggin output during stylesheet processing.  Optional.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="autoRefresh" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>if this property has a value of "false", automatic refresh of the widget output is suppressed.  Optional, defaults to true</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="scriptFile" type="xs:anyURI" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>optional pointer to a JavaScript file defniition for this class.  Default is lib/widgets object name.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<!--xs:any namespace="##targetNamespace" minOccurs="0" maxOccurs="unbounded"/-->
  		</xs:sequence>
  		<xs:attribute name="id" type="mb:idType" use="required"/>
  	</xs:complexType>
  	<xs:complexType name="AbstractXslWidgetType">
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractWidgetType">
  				<xs:sequence>
  					<xs:element name="stylesheet" type="mb:urlPathType" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>this property specifies a relative or absolute URL to a stylesheet that can replace the default stylesheet.  The stylesheet must be served from the same domain as the mapbuilder applicaiton.  Optional, if missing a default stylesheet will be used (in the lib/widgets directory with the same name as the widget)</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="title" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>label for this widget passed to the stylesheet</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="AbstractMapWidgetType">
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractXslWidgetType">
  				<xs:sequence>
  					<xs:element name="mapContainerId" type="xs:string">
  						<xs:annotation>
  							<xs:documentation>Used to assign an ID to a container DIV element for 2 dimensional map widgets.  Multiple widgets may share this container for rendering their output. The first model encountered in the config file using this ID becomes the "source" model for this widget so that extent, AOI and orther map related data can be shared by multiple models.   Required.  </xs:documentation>
  						</xs:annotation>
  					</xs:element>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="AbstractButtonType" abstract="true">
  		<xs:complexContent>
  			<xs:extension base="mb:AbstractWidgetType">
  				<xs:sequence>
  					<xs:element name="buttonBar" type="xs:string">
  						<xs:annotation>
  							<xs:documentation>equivalent to the htmlTagId property for placing buttons in a page.  Buttons get appended to this HTML element in sequence.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="targetModel" type="xs:string">
  						<xs:annotation>
  							<xs:documentation>id of a model that the button will act on.  Defaults to the parent model</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="mouseHandler" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>the id of a tool object on which to register mouse events.  Optional, if absent, not mouse events are handled and the action is the doSelect function</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="class" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>specifies the type of button.  Permitted values include "Button" and "RadioButton".  A Button class will execute it's action immediately when pressed.  A "RadioButton" has enabled and disabled state and only one button in a buttonBar group can be enabled at any one time.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="selected" type="xs:boolean" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>boolean value (true|false) to inidicate the initial state of this button</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="enabledSrc" type="mb:urlPathType" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>partial skin path to graphic source when this button is selected</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="disabledSrc" type="mb:urlPathType" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>partial skin path to graphic source when this button is not selected</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="tooltip" type="mb:multiLangType" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>text to be used when the mouse hovers over this button.</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="action" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>function call to be executed when the button is selected.  It will be prepended by config.objects so this property should take the form objectId,method(...)</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  					<xs:element name="cursor" type="xs:string" minOccurs="0">
  						<xs:annotation>
  							<xs:documentation>CSS cursor value to use when this button is selected</xs:documentation>
  						</xs:annotation>
  					</xs:element>
  				</xs:sequence>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:complexType name="AbstractToolType" abstract="true">
  		<xs:sequence>
  			<xs:element name="targetModel" type="xs:string" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>the id of a model object which this tool acts on.  Optional, if absent the action happens on the parent model of this tool.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  			<xs:element name="enabled" type="xs:boolean" minOccurs="0">
  				<xs:annotation>
  					<xs:documentation>a flag to indicate if this tool should initially be enabled.  Optional, accepts values of true and false.  Tools are enabled by default.</xs:documentation>
  				</xs:annotation>
  			</xs:element>
  		</xs:sequence>
  		<xs:attribute name="id" type="mb:idType" use="optional"/>
  	</xs:complexType>
  	<!--utility types-->
  	<xs:simpleType name="idType">
  		<xs:restriction base="xs:ID"/>
  	</xs:simpleType>
  	<xs:simpleType name="urlPathType">
  		<xs:restriction base="xs:string"/>
  	</xs:simpleType>
  	<xs:complexType name="multiLangType">
  		<xs:annotation>
  			<xs:documentation>  Muliple languages are supported by using an "xml:lang" attribute on object properties.  The element may then be repeated for each langauge supported</xs:documentation>
  		</xs:annotation>
  		<xs:simpleContent>
  			<xs:extension base="xs:string">
  				<xs:attribute ref="xml:lang"/>
  			</xs:extension>
  		</xs:simpleContent>
  	</xs:complexType>
  	<xs:complexType name="httpMethodType">
  		<xs:simpleContent>
  			<xs:extension base="xs:string"/>
  		</xs:simpleContent>
  	</xs:complexType>
  </xs:schema>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/schemas/context.xsd
  
  Index: context.xsd
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <xs:schema version="1.0.0"
  			 xmlns:xs="http://www.w3.org/2001/XMLSchema"
   			 targetNamespace="http://www.opengis.net/context"
  			 xmlns:context="http://www.opengis.net/context"
  			 xmlns:sld="http://www.opengis.net/sld"
  			 xmlns:xlink="http://www.w3.org/1999/xlink"
  			 elementFormDefault="qualified">
  	<xs:import namespace="http://www.opengis.net/sld" schemaLocation="../../sld/1.0.0/StyledLayerDescriptor.xsd"/>
  	<xs:element name="ViewContext" type="context:ViewContextType"/>
  	<xs:complexType name="ViewContextType">
  		<xs:sequence>
  			<xs:element name="General" type="context:GeneralType" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="LayerList" type="context:LayerListType" minOccurs="1" maxOccurs="1"/>
  		</xs:sequence>
  		<xs:attribute name="version" type="xs:string" use="required" fixed="1.0.0"/>
  		<xs:attribute name="id" type="xs:string" use="required"/>
  	</xs:complexType>
  	<xs:complexType name="GeneralType">
  		<xs:sequence>
  			<xs:element name="Window" type="context:WindowType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="BoundingBox" type="context:BoundingBoxType" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="Title" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="KeywordList" type="context:KeywordListType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="Abstract" type="xs:string" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="LogoURL" type="context:URLType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="DescriptionURL" type="context:URLType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="ContactInformation" type="context:ContactInformationType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="Extension" type="context:ExtensionType" minOccurs="0" maxOccurs="1"/>
  		</xs:sequence>
  	</xs:complexType>
  	<xs:complexType name="WindowType">
  		<xs:attribute name="width" type="xs:integer" use="required"/>
  		<xs:attribute name="height" type="xs:integer" use="required"/>
  	</xs:complexType>
  	<xs:complexType name="BoundingBoxType">
  		<xs:attribute name="SRS" type="xs:string" use="required"/>
  		<xs:attribute name="minx" type="xs:decimal" use="required"/>
  		<xs:attribute name="miny" type="xs:decimal" use="required"/>
  		<xs:attribute name="maxx" type="xs:decimal" use="required"/>
  		<xs:attribute name="maxy" type="xs:decimal" use="required"/>
  	</xs:complexType>
  	<xs:complexType name="KeywordListType">
  		<xs:sequence>
  			<xs:element name="Keyword" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
  		</xs:sequence>	</xs:complexType>
  	<xs:complexType name="URLType">
  		<xs:sequence>
  			<xs:element name="OnlineResource" type="context:OnlineResourceType" minOccurs="1" maxOccurs="1"/>
  		</xs:sequence>
  		<xs:attribute name="width" type="xs:integer" use="optional"/>
  		<xs:attribute name="height" type="xs:integer" use="optional"/>
  		<xs:attribute name="format" type="xs:string" use="optional"/>
  	</xs:complexType>
  	<xs:complexType name="ContactInformationType">
  		<xs:sequence>
  			<xs:element name="ContactPersonPrimary" type="context:ContactPersonPrimaryType" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="ContactPosition" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="ContactAddress" type="context:AddressType" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="ContactVoiceTelephone" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="ContactFacsimileTelephone" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="ContactElectronicMailAddress" type="xs:string" minOccurs="1" maxOccurs="1"/>
  		</xs:sequence>
  	</xs:complexType>
  	<xs:complexType name="ContactPersonPrimaryType">
  		<xs:sequence>
  			<xs:element name="ContactPerson" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="ContactOrganization" type="xs:string" minOccurs="1" maxOccurs="1"/>
  		</xs:sequence>
  	</xs:complexType>
  	<xs:complexType name="AddressType">
  		<xs:sequence>
  			<xs:element name="AddressType" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="Address" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="City" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="StateOrProvince" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="PostCode" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="Country" type="xs:string" minOccurs="1" maxOccurs="1"/>
  		</xs:sequence>
  	</xs:complexType>
  	<xs:complexType name="LayerListType">
  		<xs:sequence>
  			<xs:element name="Layer" type="context:LayerType" minOccurs="1" maxOccurs="unbounded"/>
  		</xs:sequence>
  	</xs:complexType>
  	<xs:complexType name="LayerType">
  		<xs:sequence>
  			<xs:element name="Server" type="context:ServerType" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="Title" type="xs:string" minOccurs="1" maxOccurs="1"/>
  			<xs:element name="Abstract" type="xs:string" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="DataURL" type="context:URLType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="MetadataURL" type="context:URLType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="SRS" type="xs:string" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="FormatList" type="context:FormatListType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="StyleList" type="context:StyleListType" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="Extension" type="context:ExtensionType" minOccurs="0" maxOccurs="1"/>
  		</xs:sequence>
  		<xs:attribute name="queryable" type="xs:boolean" use="required"/>
  		<xs:attribute name="hidden" type="xs:boolean" use="required"/>
  	</xs:complexType>
  	<xs:complexType name="ServerType">
  		<xs:sequence>
  			<xs:element name="OnlineResource" type="context:OnlineResourceType"/>
  		</xs:sequence>
  		<xs:attribute name="service" type="xs:string" use="required"/>
  		<xs:attribute name="version" type="xs:string" use="required"/>
  		<xs:attribute name="title" type="xs:string" use="optional"/>
  	</xs:complexType>
  	<xs:complexType name="FormatListType">
  		<xs:sequence>
  			<xs:element name="Format" type="context:FormatType" minOccurs="1" maxOccurs="unbounded"/>
  		</xs:sequence>
  	</xs:complexType>
  	<xs:complexType name="FormatType">
  		<xs:simpleContent>
  			<xs:extension base="xs:string">
  				<xs:attribute name="current" type="xs:boolean"/>
  			</xs:extension>
  		</xs:simpleContent>
  	</xs:complexType>
  	<xs:complexType name="StyleListType">
  		<xs:sequence>
  			<xs:element name="Style" type="context:StyleType" minOccurs="1" maxOccurs="unbounded"/>
  		</xs:sequence>
  	</xs:complexType>
  	<xs:complexType name="StyleType">
  		<xs:choice>
  			<xs:sequence>
  				<xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1"/>
  				<xs:element name="Title" type="xs:string" minOccurs="1" maxOccurs="1"/>
  				<xs:element name="Abstract" type="xs:string" minOccurs="0" maxOccurs="1"/>
  				<xs:element name="LegendURL" type="context:URLType" minOccurs="0" maxOccurs="1"/>
  			</xs:sequence>
  			<xs:element name="SLD" type="context:SLDType" minOccurs="0" maxOccurs="1"/>
  		</xs:choice>
  		<xs:attribute name="current" type="xs:boolean"/>
  	</xs:complexType>
  	<xs:complexType name="SLDType">
  		<xs:sequence>
  			<xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="1"/>
  			<xs:element name="Title" type="xs:string" minOccurs="0" maxOccurs="1"/>
  			<xs:choice>
  				<xs:element name="OnlineResource" type="context:OnlineResourceType"/>
  				<xs:element ref="sld:StyledLayerDescriptor"/>
  				<xs:element ref="sld:FeatureTypeStyle"/>
  			</xs:choice>
  		</xs:sequence>
  	</xs:complexType>
  	<xs:complexType name="OnlineResourceType">
  		<xs:attributeGroup ref="xlink:simpleLink"/>
  	</xs:complexType>
  	<xs:complexType name="ExtensionType">
  		<xs:annotation>
  			<xs:documentation>This allows additional elements to be added to support non WMS Layer services.</xs:documentation>
  		</xs:annotation>
  		<xs:sequence>
  			<xs:any namespace="##any"/>
  		</xs:sequence>
  	</xs:complexType>
  </xs:schema>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/schemas/locations.xsd
  
  Index: locations.xsd
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <xs:schema targetNamespace="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:gml="http://www.opengis.net/gml" xmlns:loc="http://mapbuilder.sourceforge.net/mapbuilder" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.0">
  	<xs:annotation>
  		<xs:appinfo>$Id$</xs:appinfo>
  		<xs:documentation xml:lang="en">GML schema for Community Mapbuilder quickview zoom presets</xs:documentation>
  	</xs:annotation>
  	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.0.0/base/feature.xsd"/>
  	<xs:element name="QuickviewPresetResultSet" type="loc:QuickviewPresetResultSetType" substitutionGroup="gml:_FeatureCollection"/>
  	<xs:complexType name="QuickviewPresetResultSetType">
  		<xs:complexContent>
  			<xs:extension base="gml:AbstractFeatureCollectionType">
  				<xs:attribute name="version" type="xs:string" use="required" fixed="1.0.0"/>
  			</xs:extension>
  		</xs:complexContent>
  	</xs:complexType>
  	<xs:element name="locationDef" substitutionGroup="gml:_Feature">
  		<xs:complexType>
  			<xs:complexContent>
  				<xs:extension base="gml:AbstractFeatureType">
  					<xs:sequence>
  						<xs:element name="spatialKeyword" type="loc:spatialKeywordType"/>
  					</xs:sequence>
  				</xs:extension>
  			</xs:complexContent>
  		</xs:complexType>
  	</xs:element>
  	<xs:complexType name="spatialKeywordType">
  		<xs:choice>
  			<xs:element ref="gml:surfaceProperty"/>
  			<xs:element ref="gml:centerLineOf"/>
  			<xs:element ref="gml:location"/>
  		</xs:choice>
  	</xs:complexType>
  </xs:schema>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/button.css
  
  Index: button.css
  ===================================================================
  a.mbButton, a.mbButton:link, a.mbButton:visited, .mbButtonSelected 
  { 
     width: 45px;
     height: 33px;
     text-decoration: none;
   /*   padding: 3px 4px 1px 6px; */
     cursor: pointer;
     margin: 0px;
     border-left: solid 1px #8098b2;
     border-top: solid 1px #8098b2;
     border-bottom: solid 2px #003366;
     border-right: solid 2px #003366;
   /*   background-image:url(/gdp4/mapping/images/button_bg.jpg);
     background-repeat: repeat-x; */
     font-size: 10px;
     color: #003366;
     line-height: 8px;
     font-family: Tahoma;
     font-weight: bold;
     text-align: center;
     vertical-align: middle;
     background-color: #FE9900;
     display: block; 
     overflow: hidden;
  }
  
  a.mbButton:hover 
  { 
     border-left: solid 1px #8098b2;
     border-top: solid 1px #8098b2;
     border-bottom: solid 2px #003366;
     border-right: solid 2px #003366;
   /*   background-image:url(/gdp4/mapping/images/mbButton_hover_bg.jpg); 
     background-repeat: repeat-x;*/
     color: #003366;
     background-color: lightGrey;
  }
  
  a.mbButton:active, .mbButtonSelected
  { 
     border-left: solid 2px #003366;
     border-top: solid 2px #003366;
     border-bottom: solid 1px #8098b2;
     border-right: solid 1px #8098b2;
     background-color: lightGrey;
     text-decoration: none;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/docsStyle.css
  
  Index: docsStyle.css
  ===================================================================
  
  BODY { font-size: 100%; font-family: arial, helvetica, sans-serif; } 
  
  IMG { border-style: none; }
  
  P { font-size: 80%;  }
  /*
  DL { font-size: 80%;  }
  TD { font-size: 80% }
  UL { list-style: square; margin-bottom: 0%; line-height:1.3; }
  */
  
  UL { font-size: 80%; list-style: square; padding: 0 }
  OL { font-size: 80%; padding: 0 }
  UL LI { margin-left: 1em; }
  OL LI { margin-left: 1em; }
  
  UL.sidebar { font-size: 100%; list-style: none; padding: 0 }
  UL.sidebar LI { margin-left: 4px; }
  
  .title { font-weight: bold; }
  
  DT { font-weight: bold; }
  
  PRE { font-size: 120% }
  
  A:active { color: #0000CC; }
  
  A:link { color: #0000CC; }
  
  A:visited { color: #336633; }
  
  A:hover { color: #FF0000; }
  
  A.banner { text-decoration: none; color: white; }
  
  
  H1 { 
    font: normal 18pt;  
    color: #3366cc; 
    margin: 0; 
    margin-top: 10; 
    width: 100%; 
    border-bottom: 1pt solid #3366cc; 
    text-align: left}
  
  H2 {  font-size: 130%; font-weight: bold; padding-top: 10px;}
  
  H3 { font-size: 110%; font-weight: bold; }
  
  H4 { font-size: 100%; font-weight: bold; }
  
  H5 { font-size: 110%; font-weight: bold; }
  
  H6 { font-size: 100%; font-weight: bold; }
  
  .footer { 
    font-size: 80%;  
    color: #3366cc; 
    margin: 0; 
    margin-bottom: 10; 
    width: 100%; 
    border-top: 1pt solid #3366cc; 
    text-align: right;
  }
  
  .exsml { font-size: 70%; font-weight: normal; }
  
  .exsmlbld { font-size: 70%; font-weight: bold; }
  
  .sml { font-size: 70%; font-weight: normal; }
  
  .smlbld { font-size: 70%; font-weight: bold; }
  
  .med { font-size: 80%; font-weight: normal; }
  
  .medbld { font-size: 80%; font-weight: bold; }
  
  .medblditalic { font-size: 80%; font-weight: bold; font-style: italic; }
  
  .meditalic { font-size: 80%; font-style: italic; font-family: arial, helvetica, sans-serif;}
  
  .reg { font-size: 100%; font-weight: normal; }
  
  .regbld { font-size: 100%; font-weight: bold; }
  
  .lg { font-size: 110%; font-weight: normal; }
  
  .lgbld { font-size: 110%; font-weight: bold; }
  
  .exlg { font-size: 130%; font-weight: normal; }
  
  .exlgbld { font-size: 130%; font-weight: bold; }
  
  .lgbldt { font-size: 90%; font-weight: bold; font-family: tahoma, arial, helvetica, sans-serif; }
  
  .exlgbldt { font-size: 140%; font-weight: bold; font-family: tahoma, arial, helvetica, sans-serif; }
  
  .exlgbldblu { font-size: 170%; font-weight: bold; color:#3366CC; }
  
  
  
  @media print {
  
    @page         { margin: 10% }
  
    H1, H2, H3,
  
    H4, H5, H6    { page-break-after: avoid; page-break-inside: avoid }
  
    BLOCKQUOTE, 
  
    UL, OL, DL    { page-break-before: avoid }
  
  }
  
  
  
  
  
  
  
  @media speech {
  
  
  
    H1, H2, H3, 
  
  
  
    H4, H5, H6    { voice-family: paul, male; stress: 20; richness: 90 }
  
  
  
    H2            { pitch: x-low; pitch-range: 80 }
  
  
  
    H3            { pitch: low; pitch-range: 70 }
  
  
  
    H4            { pitch: medium; pitch-range: 60 }
  
  
  
    H5            { pitch: medium; pitch-range: 50 }
  
  
  
    H6            { pitch: medium; pitch-range: 40 }
  
  
  
    LI, DT, DD    { pitch: medium; richness: 60 }
  
  
  
    DT            { stress: 80 }
  
  
  
    STRONG        { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
  
  
  
    I             { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
  
  
  
    B             { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
  
  
  
    U             { richness: 0 }
  
  
  
    A:link        { voice-family: harry, male }
  
  
  
    A:visited     { voice-family: betty, female }
  
  
  
    A:active      { voice-family: betty, female; pitch-range: 80; pitch: x-high }
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/mapStyle.css
  
  Index: mapStyle.css
  ===================================================================
  #cursorTrack, #cursorTrack INPUT
  {
    border: 0px blue none;
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
    background-color: transparent;
  }
  
  #mapScaleText, #mapScaleText INPUT
  {
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
  }
  
  #timestamp, #timestamp INPUT
  {
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
    background-color: transparent;
    border: 0px blue none;
  }
  
  #mainMapContainer {
    border: 1px solid olive;
    cursor: crosshair;
  }
  
  /* elements for the layerCOntrol widget */
  .layerControl TD {
    padding: 2px;
    font: 70% Verdana, geneva, arial, sans-serif;
  }
  
  .altRow_1 {
    background-color: #D1E2EC;
  }
  
  .altRow_0 {
    background-color: #FFFFFF;
  }
  
  
  /*
  #legend {
  	font-size: 70%; 
    font-family: cursive;
    background-color: silver;
  }
  */
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/scalebar-fancy.css
  
  Index: scalebar-fancy.css
  ===================================================================
  .sbWrapper {
  	font-family: "Lucida Grande", Georgia, "Times New Roman", Times, serif;
  	padding: 30px 0 10px 20px;
  }
  
  .sbBar {
  	border: 1px solid #8C8675;
  	background: url('fancy-bar.gif');
  	height: 8px;
  }
  
  .sbBarAlt {
  	border: 1px solid #8C8675;
  	background: url('fancy-bar-alt.gif');
  	height: 8px;
  }
  
  .sbMarkerMajor {
  	width: 0px;
  }
  
  .sbMarkerMinor {
  	width: 0px;
  }
  
  .sbNumbersBox {
  	top: 7px;
  	font-size: 0.8em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: -23px;
  	font-size: 0.9em;
  	color: #333333;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.8em;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/scalebar-fat.css
  
  Index: scalebar-fat.css
  ===================================================================
  .sbWrapper {
  	font-family: Verdana, sans-serif;
  	padding: 30px 0 10px 20px;
  }
  
  .sbBar {
  	border: 1px solid #999999;
  	background-color: #cccccc;
  	height: 7px;
  }
  
  .sbBarAlt {
  	border: 1px solid #999999;
  	background-color: #ffffff;
  	height: 7px;
  }
  
  .sbMarkerMajor {
  	width: 0px;
  }
  
  .sbMarkerMinor {
  	width: 0px;
  }
  
  .sbNumbersBox {
  	top: -19px;
  	font-size: 0.65em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: 6px;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.7em;
  	font-size: 0.7em;
  	color: #333333;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/scalebar-thin.css
  
  Index: scalebar-thin.css
  ===================================================================
  .sbWrapper {
  	font-family: Tahoma, Arial, Verdana, sans-serif;
  	padding: 30px 0 10px 20px;
  }
  
  .sbBar {
  	background-color: #666666;
  	height: 1px;
  }
  
  .sbBarAlt {
  	background-color: #666666;
  	height: 1px;
  }
  
  .sbMarkerMajor {
  	height: 9px;
  	width: 1px;
  	background-color: #666666;
  }
  
  .sbMarkerMinor {
  	height: 5px;
  	width: 1px;
  	background-color: #666666;
  }
  
  .sbNumbersBox {
  	top: 7px;
  	font-size: 0.7em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: -20px;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.8em;
  	font-size: 0.8em;
  	color: #333333;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/tabList.css
  
  Index: tabList.css
  ===================================================================
  ul.tablist
  
  {
  
     padding: 3px 0;
  
     width: 540;
  
     margin-top: 10px;
  
  }
  
  
  
  ul.tablist li
  
  {
  
     list-style: none;
  
     display: inline;
  
     margin: 0;
  
  }
  
  
  
  ul.tablist li a
  
  {
  
     text-decoration: none;
  
     padding: 3px 0.5em;
  
     margin-right: 3px;
  
     border: 1px solid #778;
  
     border-bottom: none;
  
     background: #6699CC;
  
     color: #FFF;
  
     font-weight: bold;
  
  }
  
  
  
  ul.tablist li a:hover/*, li a:focus*/
  
  {  
  
     background: #003466;
  
  }
  
  
  
  ul.tablist li a.current
  
  {
  
     background: #003466;
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/en/widgetText.xml
  
  Index: widgetText.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <WidgetText xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
      version="0.2.1" id="mbDefaultText" xml:lang="en">
    <!--
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ..//mapbuilder/lib/schemas/config.xsd"
      
      Description: This file contains all text used in widgets for multilingual 
                    support.  The text values are set as XSL params before the 
                    widget is painted.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
    <widgets>
      <Widget>
        <abstract>Abstract</abstract>
        <moreInfo>Read more about this map</moreInfo>
        <searchFormTitle>Area of interest coordinates</searchFormTitle>
        <north>North:</north>
        <south>South:</south>
        <east>East:</east>
        <west>West:</west>
      </Widget>
      <ZoomIn>
        <tooltip>click and drag to zoom in</tooltip>
      </ZoomIn>
      <ZoomOut>
        <tooltip>click to zoom out</tooltip>
      </ZoomOut>
      <DragPan>
        <tooltip>click and drag to pan</tooltip>
      </DragPan>
      <SetAoi>
        <tooltip>click and drag to set the area of interest</tooltip>
      </SetAoi>
      <Reset>
        <tooltip>reset the map to full extent</tooltip>
      </Reset>
      <Back>
        <tooltip>get the previous extent</tooltip>
      </Back>
      <Forward>
        <tooltip>get the next extent</tooltip>
      </Forward>
      <GetFeatureInfo>
        <tooltip>click on feature for more info</tooltip>
      </GetFeatureInfo>
      <EditPoint>
        <tooltip>click on map to create a point feature</tooltip>
      </EditPoint>
      <EditLine>
        <tooltip>click on map to add a point to a line</tooltip>
      </EditLine>
      <InsertFeature>
        <tooltip>Save the current Feature(s) to the server</tooltip>
      </InsertFeature>
      <DeleteFeature>
        <tooltip>Delete the current Feature(s) on the server</tooltip>
      </DeleteFeature>
      <WfsGetFeature>
        <tooltip>Click on feature to query it</tooltip>
      </WfsGetFeature>
      <Save>
        <tooltip>click to save this map</tooltip>
      </Save>
      <AoiForm>
        <title>Area of interest coordinates</title>
        <north>North:</north>
        <south>South:</south>
        <east>East:</east>
        <west>West:</west>
      </AoiForm>
      <CollectionList>
        <title>Select a map to load:</title>
      </CollectionList>
      <Legend>
        <title>Map Layers</title>
      </Legend>
      <ModelStatus>
        <title>Status for:</title>
      </ModelStatus>
      <ModelUrlInput>
        <title>URL:</title>
        <load>load</load>
      </ModelUrlInput>
      <CursorTrack>
        <longitude>lon:</longitude>
        <latitude>lat:</latitude>
        <xcoord>x:</xcoord>
        <ycoord>y:</ycoord>
      </CursorTrack>
      <SelectProcess>
      </SelectProcess>
      <ProcessArgumentsForm>
      </ProcessArgumentsForm>
      <ShowProcessResult>
        <tabLabel>4. Access results</tabLabel>
      </ShowProcessResult>
      <WebServiceForm>
        <ntsTitle>NTS Lookup web service</ntsTitle>
        <mapsheet>NTS index:</mapsheet>
      </WebServiceForm>
      <Timestamp>
        <title>Timestamp:</title>
      </Timestamp>
      <TabbedContent>
        <urlInput>1. Select a service</urlInput>
        <selectProcess>2. Select a process</selectProcess>
        <argsInput>3. Set arguments</argsInput>
        <results>4. Access results</results>
      </TabbedContent>
    </widgets>
  </WidgetText>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/fr/widgetText.xml
  
  Index: widgetText.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <WidgetText xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder /mapbuilder/lib/schemas/config.xsd"
      version="0.2.1" id="mbDefaultText" xml:lang="fr">
    <!--
      
      Description: This file contains all text used in widgets for multilingual 
                    support.  The text values are set as XSL params before the 
                    widget is painted.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
    <widgets>
      <Widget>
        <abstract>Résumé</abstract>
        <moreInfo>Lisez à propos de cette carte</moreInfo>
        <searchFormTitle>Région d'intérêt</searchFormTitle>
        <north>Nord:</north>
        <south>Sud:</south>
        <east>Est:</east>
        <west>Ouest:</west>
      </Widget>
      <ZoomIn>
        <tooltip>cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut>
        <tooltip>cliquer pour réduire</tooltip>
      </ZoomOut>
      <DragPan>
        <tooltip>cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
      </DragPan>
      <SetAoi>
        <tooltip>cliquer et faire glisser la souris pour positionner une AOI</tooltip>
      </SetAoi>
      <Reset>
        <tooltip>redonner la carte ses dimensions complèts</tooltip>
      </Reset>
      <GetFeatureInfo>
        <tooltip>cliquer pour obtenir plus d'information pour cette couche</tooltip>
      </GetFeatureInfo>
      <EditPoint>
        <tooltip>cliquer pour crée un object géographique de point</tooltip>
      </EditPoint>
      <EditLine>
        <tooltip>cliquer pour crée un object géographique linéare</tooltip>
      </EditLine>
      <Save>
        <tooltip>cliquer pour sauvegarder</tooltip>
      </Save>
      <AoiForm>
        <title>Coordonées de la région d`intéret</title>
        <north>Nord:</north>
        <south>Sud:</south>
        <east>Est:</east>
        <west>Ouest:</west>
      </AoiForm>
      <CollectionList>
        <title>Choisir une carte pour regardez:</title>
      </CollectionList>
      <Legend>
        <title>Couches de la carte</title>
      </Legend>
      <ModelStatus>
        <title>Status for:</title>
      </ModelStatus>
      <ModelUrlInput>
        <title>URL:</title>
        <load>téléchargez</load>
      </ModelUrlInput>
      <CursorTrack>
        <longitude>lon:</longitude>
        <latitude>lat:</latitude>
        <xcoord>x:</xcoord>
        <ycoord>y:</ycoord>
      </CursorTrack>
      <WebServiceForm>
        <ntsTitle>Service de recherche par SNRC</ntsTitle>
        <mapsheet>code SNRC:</mapsheet>
      </WebServiceForm>
      <Timestamp>
        <title>Date de l`image:</title>
      </Timestamp>
    </widgets>
  </WidgetText>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/ButtonTemplateDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/ButtonTemplateEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/DeleteFeatureDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/DeleteLayer.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/Dot.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/EditLineDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/EditLineEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/EditPointDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/EditPointEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/EditPolygonDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/EditPolygonEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/Icon.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/LayerMoveDownDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/LayerMoveUpDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/LayerRemoveDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/Loading.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/MarkerA.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/MarkerB.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/MoveLayerDown.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/MoveLayerUp.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/PanDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/PanEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/PauseDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/PauseEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/PlayDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/PlayEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/QueryDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/QueryEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/RedoDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/ResetExtentDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/ResetExtentEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/RewindDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/RewindEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/SaveDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/SetAoiDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/SetAoiEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/Spacer.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/StepBack.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/StepForward.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/StopDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/StopEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/UndoDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/ZoomInDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/ZoomInEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/ZoomOutDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/ZoomOutEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/eye.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/id.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/blue/images/yellow_bullet.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/button.css
  
  Index: button.css
  ===================================================================
  .mbButton
  img{ 
  filter:progid:DXImageTransform.Microsoft.Alpha(opacity=60);
  -moz-opacity: 0.6;
  margin: 0px;
  border:0px;
   
  }
  
  .mbButton:hover 
  img{
  filter:progid:DXImageTransform.Microsoft.Alpha(opacity=100);
  -moz-opacity: 1;
  margin: 0px;
  border:0px;
  }
  
  .mbButton:active, .mbButtonSelected
  img{ 
  filter:progid:DXImageTransform.Microsoft.Alpha(opacity=100);
  -moz-opacity: 1;
  margin: 0px;
  border:0px;
  }
  
  .mbButtonSelected:hover
  img{ 
  filter:progid:DXImageTransform.Microsoft.Alpha(opacity=80);
  -moz-opacity: 0.8;
  margin: 0px;
  border:0px;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/docsStyle.css
  
  Index: docsStyle.css
  ===================================================================
  
  BODY { font-size: 100%; font-family: arial, helvetica, sans-serif; } 
  
  IMG { border-style: none; }
  
  P { font-size: 80%;  }
  /*
  DL { font-size: 80%;  }
  TD { font-size: 80% }
  UL { list-style: square; margin-bottom: 0%; line-height:1.3; }
  */
  
  UL { font-size: 80%; list-style: square; padding: 0 }
  OL { font-size: 80%; padding: 0 }
  UL LI { margin-left: 1em; }
  OL LI { margin-left: 1em; }
  
  UL.sidebar { font-size: 100%; list-style: none; padding: 0 }
  UL.sidebar LI { margin-left: 4px; }
  
  .title { font-weight: bold; }
  
  DT { font-weight: bold; }
  
  PRE { font-size: 120% }
  
  A:active { color: #0000CC; }
  
  A:link { color: #0000CC; }
  
  A:visited { color: #3300CC; }
  
  A:hover { color: #FF0000; }
  
  A.banner { text-decoration: none; color: white; }
  
  
  H1 { 
    font-size: 18px;  
    color: #3366cc; 
    margin: 0; 
    margin-top: 10; 
    width: 100%; 
    border-bottom: 1pt solid #3366cc; 
    text-align: left}
  
  H1 A { text-decoration: none; }
  
  H2 {  font-size: 130%; font-weight: bold; padding-top: 10px;}
  
  H3 { font-size: 110%; font-weight: bold; }
  
  H4 { font-size: 100%; font-weight: bold; }
  
  H5 { font-size: 110%; font-weight: bold; }
  
  H6 { font-size: 100%; font-weight: bold; }
  
  .footer { 
    font-size: 80%;  
    color: #3366cc; 
    margin: 0; 
    margin-bottom: 10; 
    width: 100%; 
    border-top: 1pt solid #3366cc; 
    text-align: right;
  }
  
  .exsml { font-size: 70%; font-weight: normal; }
  
  .exsmlbld { font-size: 70%; font-weight: bold; }
  
  .sml { font-size: 70%; font-weight: normal; }
  
  .smlbld { font-size: 70%; font-weight: bold; }
  
  .med { font-size: 80%; font-weight: normal; }
  
  .medbld { font-size: 80%; font-weight: bold; }
  
  .medblditalic { font-size: 80%; font-weight: bold; font-style: italic; }
  
  .meditalic { font-size: 80%; font-style: italic; font-family: arial, helvetica, sans-serif;}
  
  .reg { font-size: 100%; font-weight: normal; }
  
  .regbld { font-size: 100%; font-weight: bold; }
  
  .lg { font-size: 110%; font-weight: normal; }
  
  .lgbld { font-size: 110%; font-weight: bold; }
  
  .exlg { font-size: 130%; font-weight: normal; }
  
  .exlgbld { font-size: 130%; font-weight: bold; }
  
  .lgbldt { font-size: 90%; font-weight: bold; font-family: tahoma, arial, helvetica, sans-serif; }
  
  .exlgbldt { font-size: 140%; font-weight: bold; font-family: tahoma, arial, helvetica, sans-serif; }
  
  .exlgbldblu { font-size: 170%; font-weight: bold; color:#3366CC; }
  
  
  
  @media print {
  
    @page         { margin: 10% }
  
    H1, H2, H3,
  
    H4, H5, H6    { page-break-after: avoid; page-break-inside: avoid }
  
    BLOCKQUOTE, 
  
    UL, OL, DL    { page-break-before: avoid }
  
  }
  
  
  
  
  
  
  
  @media speech {
  
  
  
    H1, H2, H3, 
  
  
  
    H4, H5, H6    { voice-family: paul, male; stress: 20; richness: 90 }
  
  
  
    H2            { pitch: x-low; pitch-range: 80 }
  
  
  
    H3            { pitch: low; pitch-range: 70 }
  
  
  
    H4            { pitch: medium; pitch-range: 60 }
  
  
  
    H5            { pitch: medium; pitch-range: 50 }
  
  
  
    H6            { pitch: medium; pitch-range: 40 }
  
  
  
    LI, DT, DD    { pitch: medium; richness: 60 }
  
  
  
    DT            { stress: 80 }
  
  
  
    STRONG        { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
  
  
  
    I             { pitch: medium; pitch-range: 60; stress: 60; richness: 50 }
  
  
  
    B             { pitch: medium; pitch-range: 60; stress: 90; richness: 90 }
  
  
  
    U             { richness: 0 }
  
  
  
    A:link        { voice-family: harry, male }
  
  
  
    A:visited     { voice-family: betty, female }
  
  
  
    A:active      { voice-family: betty, female; pitch-range: 80; pitch: x-high }
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/mapStyle.css
  
  Index: mapStyle.css
  ===================================================================
  #cursorTrack, #cursorTrack INPUT
  {
    border: 0px blue none;
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
    background-color: transparent;
  }
  
  #mapScaleText, #mapScaleText INPUT
  {
    font: 8pt Verdana, geneva, arial, sans-serif;
    color: #000000;
  }
  
  #timestamp, #timestamp INPUT
  {
    font: 9pt Verdana, geneva, arial, sans-serif;
    color: #000000;
    background-color: transparent;
    border: 0px blue none;
  }
  
  #mainMapContainer {
    border: 1px solid olive;
    cursor: crosshair;
    background-color: #c8e5f5;
  }
  
  /* elements for the layerCOntrol widget */
  .layerControl TD {
    padding: 2px;
    font: 70% Verdana, geneva, arial, sans-serif;
  }
  
  .altRow_1 {
    background-color: #D1E2EC;
  }
  
  .altRow_0 {
    background-color: #FFFFFF;
  }
  
  .loadingIndicator
  {
    color: #000000;
    background-color: #FFFFFF;
  	opacity: .75;
  	/*filter: alpha(opacity=75);*/
  }
  
  .loadingIndicator p
  {
    margin: 0px;
    padding: 2px;
  }
  
  .loadingIndicator img
  {
    padding: 2px;
    margin: 0px;
    float: left;
  }
  /*
  #legend {
  	font-size: 70%; 
    font-family: cursive;
    background-color: silver;
  }
  */
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/scalebar-fancy.css
  
  Index: scalebar-fancy.css
  ===================================================================
  .sbWrapper {
  	font-family: "Lucida Grande", Georgia, "Times New Roman", Times, serif;
  	padding: 30px 0 10px 20px;
  }
  
  .sbBar {
  	border: 1px solid #8C8675;
  	background: url('fancy-bar.gif');
  	height: 8px;
  }
  
  .sbBarAlt {
  	border: 1px solid #8C8675;
  	background: url('fancy-bar-alt.gif');
  	height: 8px;
  }
  
  .sbMarkerMajor {
  	width: 0px;
  }
  
  .sbMarkerMinor {
  	width: 0px;
  }
  
  .sbNumbersBox {
  	top: 7px;
  	font-size: 0.8em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: -23px;
  	font-size: 0.9em;
  	color: #333333;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.8em;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/scalebar-fat.css
  
  Index: scalebar-fat.css
  ===================================================================
  .sbWrapper {
  	font-family: Verdana, sans-serif;
  	padding: 30px 0 10px 20px;
  }
  
  .sbBar {
  	border: 1px solid #999999;
  	background-color: #cccccc;
  	height: 7px;
  }
  
  .sbBarAlt {
  	border: 1px solid #999999;
  	background-color: #ffffff;
  	height: 7px;
  }
  
  .sbMarkerMajor {
  	width: 0px;
  }
  
  .sbMarkerMinor {
  	width: 0px;
  }
  
  .sbNumbersBox {
  	top: -19px;
  	font-size: 0.65em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: 6px;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.7em;
  	font-size: 0.7em;
  	color: #333333;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/scalebar-thin.css
  
  Index: scalebar-thin.css
  ===================================================================
  .sbWrapper {
  	font-family: Tahoma, Arial, Verdana, sans-serif;
  	padding: 30px 0 10px 20px;
  }
  
  .sbBar {
  	background-color: #666666;
  	height: 1px;
  }
  
  .sbBarAlt {
  	background-color: #666666;
  	height: 1px;
  }
  
  .sbMarkerMajor {
  	height: 9px;
  	width: 1px;
  	background-color: #666666;
  }
  
  .sbMarkerMinor {
  	height: 5px;
  	width: 1px;
  	background-color: #666666;
  }
  
  .sbNumbersBox {
  	top: 7px;
  	font-size: 0.7em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: -20px;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.8em;
  	font-size: 0.8em;
  	color: #333333;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/tabList.css
  
  Index: tabList.css
  ===================================================================
  ul.tablist
  
  {
  
     padding: 3px 0;
  
     width: 540;
  
     margin-top: 10px;
  
  }
  
  
  
  ul.tablist li
  
  {
  
     list-style: none;
  
     display: inline;
  
     margin: 0;
  
  }
  
  
  
  ul.tablist li a
  
  {
  
     text-decoration: none;
  
     padding: 3px 0.5em;
  
     margin-right: 3px;
  
     border: 1px solid #778;
  
     border-bottom: none;
  
     background: #6699CC;
  
     color: #FFF;
  
     font-weight: bold;
  
  }
  
  
  
  ul.tablist li a:hover/*, li a:focus*/
  
  {  
  
     background: #003466;
  
  }
  
  
  
  ul.tablist li a.current
  
  {
  
     background: #003466;
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/en/widgetText.xml
  
  Index: widgetText.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <WidgetText xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
      version="0.2.1" id="mbDefaultText" xml:lang="en">
    <!--
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder ..//mapbuilder/lib/schemas/config.xsd"
      
      Description: This file contains all text used in widgets for multilingual 
                    support.  The text values are set as XSL params before the 
                    widget is painted.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
    <widgets>
      <Widget>
        <abstract>Abstract</abstract>
        <moreInfo>Read more about this map</moreInfo>
        <searchFormTitle>Area of interest coordinates</searchFormTitle>
        <north>North:</north>
        <south>South:</south>
        <east>East:</east>
        <west>West:</west>
      </Widget>
      <ZoomIn>
        <tooltip>click and drag to zoom in</tooltip>
      </ZoomIn>
      <ZoomOut>
        <tooltip>click to zoom out</tooltip>
      </ZoomOut>
      <DragPan>
        <tooltip>click and drag to pan</tooltip>
      </DragPan>
      <SetAoi>
        <tooltip>click and drag to set the area of interest</tooltip>
      </SetAoi>
      <Reset>
        <tooltip>reset the map to full extent</tooltip>
      </Reset>
      <Back>
        <tooltip>get the previous extent</tooltip>
      </Back>
      <Forward>
        <tooltip>get the next extent</tooltip>
      </Forward>
      <GetFeatureInfo>
        <tooltip>click on feature for more info</tooltip>
      </GetFeatureInfo>
      <EditPoint>
        <tooltip>click on map to create a point feature</tooltip>
      </EditPoint>
      <EditLine>
        <tooltip>click on map to add a point to a line</tooltip>
      </EditLine>
      <InsertFeature>
        <tooltip>Save the current Feature(s) to the server</tooltip>
      </InsertFeature>
      <DeleteFeature>
        <tooltip>Delete the current Feature(s) on the server</tooltip>
      </DeleteFeature>
      <WfsGetFeature>
        <tooltip>Click on feature to query it</tooltip>
      </WfsGetFeature>
      <Save>
        <tooltip>click to save this map</tooltip>
      </Save>
      <AoiForm>
        <title>Area of interest coordinates</title>
        <north>North:</north>
        <south>South:</south>
        <east>East:</east>
        <west>West:</west>
      </AoiForm>
      <CollectionList>
        <title>Select a map to load:</title>
      </CollectionList>
      <Legend>
        <title>Legend</title>
      </Legend>
      <ModelStatus>
        <title>Status for:</title>
      </ModelStatus>
      <ModelUrlInput>
        <title>URL:</title>
        <load>load</load>
      </ModelUrlInput>
      <CursorTrack>
        <longitude>lon:</longitude>
        <latitude>lat:</latitude>
        <xcoord>x:</xcoord>
        <ycoord>y:</ycoord>
      </CursorTrack>
      <SelectProcess>
      </SelectProcess>
      <ProcessArgumentsForm>
      </ProcessArgumentsForm>
      <ShowProcessResult>
        <tabLabel>4. Access results</tabLabel>
      </ShowProcessResult>
      <WebServiceForm>
        <ntsTitle>NTS Lookup web service</ntsTitle>
        <mapsheet>NTS index:</mapsheet>
      </WebServiceForm>
      <Timestamp>
        <title>Timestamp:</title>
      </Timestamp>
      <TabbedContent>
        <urlInput>1. Select a service</urlInput>
        <selectProcess>2. Select a process</selectProcess>
        <argsInput>3. Set arguments</argsInput>
        <results>4. Access results</results>
      </TabbedContent>
    </widgets>
  </WidgetText>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/fr/widgetText.xml
  
  Index: widgetText.xml
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <WidgetText xmlns="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://mapbuilder.sourceforge.net/mapbuilder /mapbuilder/lib/schemas/config.xsd"
      version="0.2.1" id="mbDefaultText" xml:lang="fr">
    <!--
      
      Description: This file contains all text used in widgets for multilingual 
                    support.  The text values are set as XSL params before the 
                    widget is painted.
      Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html 
  
      $Id$
    -->
    <widgets>
      <Widget>
        <abstract>Résumé</abstract>
        <moreInfo>Lisez à propos de cette carte</moreInfo>
        <searchFormTitle>Région d'intérêt</searchFormTitle>
        <north>Nord:</north>
        <south>Sud:</south>
        <east>Est:</east>
        <west>Ouest:</west>
      </Widget>
      <ZoomIn>
        <tooltip>cliquer et faire glisser la souris pour agrandir</tooltip>
      </ZoomIn>
      <ZoomOut>
        <tooltip>cliquer pour réduire</tooltip>
      </ZoomOut>
      <DragPan>
        <tooltip>cliquer et faire glisser la souris pour voir un autre parti de la carte</tooltip>
      </DragPan>
      <SetAoi>
        <tooltip>cliquer et faire glisser la souris pour positionner une AOI</tooltip>
      </SetAoi>
      <Reset>
        <tooltip>redonner la carte ses dimensions complèts</tooltip>
      </Reset>
      <GetFeatureInfo>
        <tooltip>cliquer pour obtenir plus d'information pour cette couche</tooltip>
      </GetFeatureInfo>
      <EditPoint>
        <tooltip>cliquer pour crée un object géographique de point</tooltip>
      </EditPoint>
      <EditLine>
        <tooltip>cliquer pour crée un object géographique linéare</tooltip>
      </EditLine>
      <Save>
        <tooltip>cliquer pour sauvegarder</tooltip>
      </Save>
      <AoiForm>
        <title>Coordonées de la région d`intéret</title>
        <north>Nord:</north>
        <south>Sud:</south>
        <east>Est:</east>
        <west>Ouest:</west>
      </AoiForm>
      <CollectionList>
        <title>Choisir une carte pour regardez:</title>
      </CollectionList>
      <Legend>
        <title>Couches de la carte</title>
      </Legend>
      <ModelStatus>
        <title>Status for:</title>
      </ModelStatus>
      <ModelUrlInput>
        <title>URL:</title>
        <load>téléchargez</load>
      </ModelUrlInput>
      <CursorTrack>
        <longitude>lon:</longitude>
        <latitude>lat:</latitude>
        <xcoord>x:</xcoord>
        <ycoord>y:</ycoord>
      </CursorTrack>
      <WebServiceForm>
        <ntsTitle>Service de recherche par SNRC</ntsTitle>
        <mapsheet>code SNRC:</mapsheet>
      </WebServiceForm>
      <Timestamp>
        <title>Date de l`image:</title>
      </Timestamp>
    </widgets>
  </WidgetText>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ButtonTemplateDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ButtonTemplateEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/DeleteDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/DeleteEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/DeleteFeatureDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/DeleteLayer.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/Dot.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditLineDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditLineDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditLineEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditLineEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditPointDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditPointDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditPointEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditPointEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditPolygonDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditPolygonDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditPolygonEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/EditPolygonEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/GeocoderDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/GeocoderEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/HelpDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/HelpEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/Icon.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LayerAddDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LayerAddEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LayerMoveDownDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LayerMoveDownEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LayerMoveUpDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LayerMoveUpEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LayerRemoveDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LayerRemoveEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LegendDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/LegendEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/Loading.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/MarkerA.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/MarkerB.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/MeasureDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/MeasureEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/MeasurePause.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/MoveLayerDown.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/MoveLayerUp.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PanDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PanDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PanEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PanEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PauseDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PauseDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PauseEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PauseEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PlayDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PlayDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PlayEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/PlayEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/QueryDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/QueryDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/QueryEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/QueryEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/README.txt
  
  Index: README.txt
  ===================================================================
  Iconset information
  ==================================
  $Id$
  
  Many of these icons are modified versions of the chameleon iconset (http://chameleon.maptools.org/). Some are modified GIMP icons and gnome-cd-player icons.
  
  To create new icons use the template templateNew.xcf (the gimp file); it's a multi layer image where you can put your image in the icon layer and enable 'Disable' to get a default Disable icon or enable 'Enable' to get a default Enable icon. Do not enable both 'Enable' and 'Disable' since that would create dark corners in the 'Disable' icon. 
  
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  Steven Ottens
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/RedoDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/RedoEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ResetExtentDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ResetExtentDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ResetExtentEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ResetExtentEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/RewindDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/RewindDisabled.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/RewindEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/RewindEnabled.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/SaveDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/SaveDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/SaveEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/SetAoiDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/SetAoiDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/SetAoiEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/SetAoiEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/Spacer.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StepBack.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StepBackwardDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StepBackwardEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StepForward.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StepForwardDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StepForwardEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StopDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StopDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StopEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/StopEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/Template.xcf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/TemplateNew.xcf
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/UndoDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/UndoEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ZoomInDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ZoomInDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ZoomInEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ZoomInEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ZoomOutDisable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ZoomOutDisable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ZoomOutEnable.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/ZoomOutEnable.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/eye.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/skin/default/images/id.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/AoiMouseHandler.js
  
  Index: AoiMouseHandler.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
  
  /**
   * Tool which implements a click and drag behaviour to set the 
   * Area Of Interest on the model from mouse events.
   * The tool must be enabled before use by calling tool.enable(true);
   * This tool registers mouse event listeners on the parent model.
   * This tool processes screen coordinates and stores AOI in the current map
   * projection coordinates.
   * @constructor
   * @base ToolBase
   * @param toolNode The node for this tool from the configuration document.
   * @param model  The model object that contains this tool
   */
  
  function AoiMouseHandler(toolNode, model) {
    ToolBase.apply(this, new Array(toolNode, model));
  
    /**
     * Process the mouseup action by stopping the drag.
     * @param objRef      Pointer to this object.
     * @param targetNode  The HTML node that the event occured on
     */
    this.mouseUpHandler = function(objRef,targetNode) {
      if (objRef.enabled) {
        if (objRef.started) objRef.started = false;
      }
    }
  
    /**
     * Process the mousedown action by setting the anchor point.
     * @param objRef      Pointer to this object.
     * @param targetNode  The HTML node that the event occured on
     */
    this.mouseDownHandler = function(objRef,targetNode) {
      if (objRef.enabled) {
        objRef.started = true;
        objRef.anchorPoint = targetNode.evpl;
        objRef.dragBox( targetNode.evpl );
      }
    }
  
    /**
     * Process a the mousemove action as dragging out a box.
     * @param objRef      Pointer to this object.
     * @param targetNode  The HTML node that the event occured on
     */
    this.mouseMoveHandler = function(objRef,targetNode) {
      if (objRef.enabled) {
        if (objRef.started) objRef.dragBox(targetNode.evpl);
      }
    }
  
    /**
     * Process a the mouseout action when the mouse moves out of the mappane
     * @param objRef      Pointer to this object.
     * @param targetNode  The HTML node that the event occured on
     */
    this.mouseOutHandler = function(objRef,targetNode) {
      if (objRef.enabled) {
        if (objRef.started) objRef.started = false;
      }
    }
  
    /**
     * Process a the mousemove action as dragging out a box.
     * @param objRef      Pointer to this object.
     * @param targetNode  The HTML node that the event occured on
     */
    this.mouseOverHandler = function(objRef,targetNode) {
      if (objRef.enabled) {
        //if (objRef.started) objRef.dragBox(targetNode.evpl);
      }
    }
  
    /** Change the coordinate of one corner of the box.  The anchor point stays fixed. 
     * @param evpl    new corner coordinate.
     */
    this.dragBox = function( evpl ) {	
      var ul = new Array();
      var lr = new Array();
      if (this.anchorPoint[0] > evpl[0]) {
        ul[0] = evpl[0];
        lr[0] = this.anchorPoint[0];
      } else {
        ul[0] = this.anchorPoint[0];
        lr[0] = evpl[0];
      }
      if (this.anchorPoint[1] > evpl[1]) {
        ul[1] = evpl[1];
        lr[1] = this.anchorPoint[1];
      } else {
        ul[1] = this.anchorPoint[1];
        lr[1] = evpl[1];
      }
  
      //set new AOI in context
      ul = this.model.extent.getXY( ul );
      lr = this.model.extent.getXY( lr );
      this.model.setParam("aoi", new Array(ul,lr) );
    }
  
    //register the listeners on the model
    this.model.addListener('mousedown',this.mouseDownHandler,this);
    this.model.addListener('mousemove',this.mouseMoveHandler,this);
    this.model.addListener('mouseup',this.mouseUpHandler,this);
    //this.model.addListener('mouseout',this.mouseOutHandler,this);
    //this.model.addListener('mouseover',this.mouseOutHandler,this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/Caps2Context.js
  
  Index: Caps2Context.js
  ===================================================================
  /**
  
   * Build a Web Map Context (WMC) from a Web Map Server getCapabilities response.
  
   * This tool will replace the identified targetModel as opposed to editing
  
   * the target model which the EditContext tool will do. 
  
   * @constructor
  
   * @base ToolBase
  
   * @param toolNode The tools's XML object node from the configuration document.
  
   * @param model    The model that this tool belongs to
  
   */
  
  function Caps2Context(toolNode, model) {
  
    ToolBase.apply(this, new Array(toolNode, model));
  
    
  
    var styleUrl = baseDir+"/tool/xsl/Caps2Context.xsl";
  
    this.stylesheet = new XslProcessor(styleUrl,model.namespace);
  
  
  
    // Set stylesheet parameters for all the child nodes from the config file
  
    for (var j=0;j<toolNode.childNodes.length;j++) {
  
      if (toolNode.childNodes[j].firstChild && toolNode.childNodes[j].firstChild.nodeValue) {
  
        this.stylesheet.setParameter(toolNode.childNodes[j].nodeName,toolNode.childNodes[j].firstChild.nodeValue);
  
      }
  
    }
  
  
  
    /**
  
     * Listener function which does the transformation and loads the target model
  
     * @param requestName the name of the web service operation to execute
  
     * @param featureNodeId the id of the node in the doc to be processed by the stylesheet
  
     */
  
    this.mapAllLayers = function(objRef) {
  
      objRef.stylesheet.setParameter("selectedLayer",'');
  
      var newContext = objRef.stylesheet.transformNodeToObject(objRef.model.doc);
  
      objRef.targetModel.setParam("newModel", null);
  
      objRef.targetModel.url = '';
  
      objRef.targetModel.doc = newContext;
  
      objRef.targetModel.finishLoading();
  
    }
  
    this.model.addListener("mapAllLayers", this.mapAllLayers, this);
  
  
  
    /**
  
     * Listener function which does the transformation and loads the target model.
  
     * this wersion will convert a single layer from the Capabilities doc into a
  
     * context doc.
  
     * @param requestName the name of the web service operation to execute
  
     * @param featureNodeId the id of the node in the doc to be processed by the stylesheet
  
     */
  
    this.mapSingleLayer = function(objRef, layerName) {
  
      objRef.stylesheet.setParameter("selectedLayer",layerName);
  
      var newContext = objRef.stylesheet.transformNodeToObject(objRef.model.doc);
  
      objRef.targetModel.setParam("newModel", null);
  
      objRef.targetModel.url = '';
  
      objRef.targetModel.doc = newContext;
  
      objRef.targetModel.finishLoading();
  
    }
  
    this.model.addListener("mapLayer", this.mapSingleLayer, this);
  
  
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/DragPanHandler.js
  
  Index: DragPanHandler.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  /**
   * Tool to click and drag a map pane to achieve a recentering of the map.
   * This tool processes screen coordinates and stores AOI in the current map
   * projection coordinates.
   *
   * @constructor
   * @base ToolBase
   * @param toolNode The tool node from the Config XML file.
   * @param model  The model object that contains this tool.
   */
  
  function DragPanHandler(toolNode, model) {
    ToolBase.apply(this, new Array(toolNode, model));
  
    /**
     * Process the mouseup action.  This will reset the AOI on the model by 
     * shifting the AOI by the maount that the mouse was dragged.
     * @param objRef Pointer to this DragPanHandler object.
     * @param targetNode  The HTML node that the event occured on
     */
    this.mouseUpHandler = function(objRef,targetNode) {
      if (objRef.enabled) {
        if (objRef.dragging) {
          objRef.dragging = false;
  
          //set new AOI in context, only if it's been moved
          if ((objRef.deltaP==0) && (objRef.deltaL==0)) return;
          var width = objRef.model.getWindowWidth();
          var height = objRef.model.getWindowHeight();
          var ul = objRef.model.extent.getXY( new Array( -objRef.deltaP, -objRef.deltaL) );  //(0,0) was the original ul AOI 
          var lr = objRef.model.extent.getXY( new Array( width-objRef.deltaP, height-objRef.deltaL) );  //(w,h) was the original lr AOI 
          objRef.model.setParam("aoi",new Array(ul,lr));
        }
      }
    }
  
    /**
     * Process a mouse down action by starting the drag pan action.
     * @param objRef Pointer to this DragPanHandler object.
     * @param targetNode  The HTML node that the event occured on
     */
    this.mouseDownHandler = function(objRef,targetNode) {
      if (objRef.enabled) {
        //objRef.containerNode = document.getElementById( objRef.parentWidget.containerId );
        objRef.dragging = true;
        objRef.anchorPoint = targetNode.evpl;
        objRef.deltaP = 0;
        objRef.deltaL = 0;
  //Michael Jenik added this
        //objRef.oldPos stores the old positions of targetNode.childNodes divs
        var images=targetNode.childNodes;
        objRef.oldPos = new Array(images.length);
        for(var i=0; i<images.length; i++) {
          var img=images.item(i);
          var P = img.style.left;
          var L = img.style.top;
          if(P && L)
            objRef.oldPos[i] = new Array(parseInt(P),parseInt(L));
          else
            objRef.oldPos[i] = new Array(0,0);
        }
  
      }
    }
  
    /**
     * Process a mousemove action.  This method uses DHTML to move the map layers
     * and sets deltaP and deltaL properties on this tool to be used in mouse up.
     * @param objRef Pointer to this DragPanHandler object.
     * @param targetNode  The HTML node that the event occured on
     */
    this.mouseMoveHandler = function(objRef,targetNode) {
      if (objRef.enabled) {
        if (objRef.dragging) {
          objRef.deltaP = targetNode.evpl[0] - objRef.anchorPoint[0];
          objRef.deltaL = targetNode.evpl[1] - objRef.anchorPoint[1];
  
          //use this form if dragging the container node children
          //var images=targetNode.getElementsByTagName("div");
          var images=targetNode.childNodes;
          for(var i=0; i<images.length; i++) {
            var img=images.item(i);
  //Michael Jenik added the plus ...
            img.style.left=objRef.deltaP + objRef.oldPos[i][0]+'px';
            img.style.top=objRef.deltaL + objRef.oldPos[i][1]+'px';
          }
        
          //use this form if dragging the container node
          //var containerNode = document.getElementById(objRef.parentWidget.containerNodeId);
          //containerNode.style.left = objRef.deltaP;
          //containerNode.style.top = objRef.deltaL;
  
        }
      }
    }
  
    //register the listeners on the model
    this.model.addListener('mousedown',this.mouseDownHandler,this);
    this.model.addListener('mousemove',this.mouseMoveHandler,this);
    this.model.addListener('mouseup',this.mouseUpHandler,this);
  }
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/EditContext.js
  
  Index: EditContext.js
  ===================================================================
  /*
  Author:       Mike Adair  mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
  
  /**
   * Tool which manipulates the Layer list of a Web Map Context document.
   * @constructor
   * @base ToolBase
   * @param toolNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function EditContext(toolNode, model) {
    ToolBase.apply(this, new Array(toolNode, model));
  
    var styleUrl = baseDir+"/tool/xsl/wmc_AddResource.xsl";   //TBD figure out a way to set this for other operations
    this.stylesheet = new XslProcessor(styleUrl);
  
    // Set stylesheet parameters for all the child nodes from the config file
    for (var j=0;j<toolNode.childNodes.length;j++) {
      if (toolNode.childNodes[j].firstChild && toolNode.childNodes[j].firstChild.nodeValue) {
        this.stylesheet.setParameter(toolNode.childNodes[j].nodeName,toolNode.childNodes[j].firstChild.nodeValue);
      }
    }
  
    /**
     * Adds a new layer to the end of the context document
     * @param featureName the name of the feature to be added
     */
    this.addNodeToModel = function(featureName) {
      var feature = this.model.getFeatureNode(featureName);
      this.stylesheet.setParameter("version", this.model.getVersion() );
      this.stylesheet.setParameter("serverUrl", this.model.getServerUrl("GetMap","get") );
      this.stylesheet.setParameter("serverTitle", this.model.getServerTitle() );
      this.stylesheet.setParameter("serviceName", "wms");//this.model.getServiceName() );
      this.stylesheet.setParameter("format", this.model.getImageFormat() );
      var newNode = this.stylesheet.transformNodeToObject(feature);
      Sarissa.setXpathNamespaces(newNode, this.targetModel.namespace);
      if (this.debug) alert(newNode.xml);
      this.targetModel.setParam('addLayer',newNode.documentElement);
    }
  
    /**
     * Adds a new layer to the end of the context document
     * @param featureName the name of the feature to be added
     */
    this.addLayerFromCat = function(featureName) {
      var feature = this.model.getFeatureNode(featureName);
      var newNode = this.stylesheet.transformNodeToObject(feature);
      Sarissa.setXpathNamespaces(newNode, this.targetModel.namespace);
      if (this.debug) alert(newNode.xml);
      this.targetModel.setParam('addLayer',newNode.documentElement);
    }
  
    /**
     * Reorders layers in the context document
     * @param objRef Pointer to this object.
     */
    this.moveNode = function(objRef, featureName) {
      //TBD
    }
    this.model.addListener("MoveNode", this.addNodeToModel, this);
  
    /**
     * Deletes layers from a context doc
     * @param objRef Pointer to this object.
     */
    this.deleteNode = function(objRef, featureName) {
      //TBD
    }
    this.model.addListener("DeleteNode", this.addNodeToModel, this);
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/Extent.js
  
  Index: Extent.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  
  var Rearth = 6378137.0;                 // Radius of the earth (sphere); different from Proj value?
  var degToMeter = Rearth*2*Math.PI/360;
  //var mbScaleFactor = 72 * 39.3701;   //PixelsPerInch*InchesPerMapUnit; magic numbers 
                                      //need to determine magic number for lat/lon
  var mbScaleFactor = 3571.428   //magic number, for Geoserver SLD compatibility
                                 // 1/0.00028 (0.28 mm "is a common actual size for
                                 // contemporary display" as written in the SLD specification ...
  
  /*
   * FD 2005/03/04 : minScale et maxScale
   * DGR : should be in config ?
   */
  var minScale = 1000;
  var maxScale = 200000;
  
  /**
   * A tool designed to handle geography calculations for widgets which render
   * the model in 2D.
   * Use of this tool requires that it's model implements get/setWindowHeight/Width
   * methods.
   * Encapsulates all geography and image size aspects of a geographic object 
   * displayed in a rectangular area on the screen.
   * All coordinates are handled as points which is a 2 element array, where x is 
   * the first element and y is the second. Coordinates are either pixel and lixel
   * (pl) relative to the top left of the extent or projection XY values (xy). 
   *
   * @constructor
   * @param model       the model document that this extent represents
   * @param initialRes  (optional) if supplied the extent resolution will be set to this value
   */
  function Extent( model, initialRes ) {
    this.model = model;
    this.size = new Array();
    this.res = new Array();
    this.zoomBy = 4;
    this.id = model.id + "_MbExtent" + mbIds.getId();
  
    /**
     * Returns the XY center of this extent
     * @return  array of XY for th center of the extent
     */
    this.getCenter = function() {
      return new Array((this.ul[0]+this.lr[0])/2, (this.ul[1]+this.lr[1])/2);
    }
  
    /**
     * Returns XY coordinates for given pixel line coords w.r.t. top left corner
     * @param pl   pixel line in extent to calculate
     * @return     point array of XY coordinates
     */
    this.getXY = function(pl) {
      var x = this.ul[0]+pl[0]*this.res[0];
      var y = this.ul[1]- pl[1]*this.res[1];
      return new Array(x,y);
    }
  
    /**
     * Returns pixel/line coordinates for given XY projection coords
     * @param xy   projection XY coordinate to calculate
     * @return     point array of pxiel/line coordinates w.r.t. top left corner
     */
    this.getPL = function(xy) {
      var p = Math.floor( (xy[0]-this.ul[0])/this.res[0] );
      var l = Math.floor( (this.ul[1]-xy[1])/this.res[1] );
      return new Array(p,l);
    }
  
    /**
     * Adjust the extent so that it is centered at given XY coordinate with given
     * resolution.  Extent width and height remain fixed.  Optionally check to 
     * ensure that it doesn't go beyond available extent.
     *
     * @param center      projection XY coordinate to center at
     * @param newres      resolution to display at
     * @param limitExtent ensure that the extent doesn't go beyond available bbox (TBD: not complete/tested)
     * @return            none
     */
    this.centerAt = function(center, newres, limitExtent) {
      var half = new Array(this.size[0]/2, this.size[1]/2);
  /*
   * FD 2005/03/04 : respect de minScale et maxScale
   * DGR : scale constraints
      var nRmin= minScale/mbScaleFactor;
      var nRmax= maxScale/mbScaleFactor;
      if (newres < nRmin) {
        newres= nRmin ;
      }
      if (newres > nRmax) {
        newres= nRmax ;
      }
   */
      this.lr = new Array(center[0]+half[0]*newres, center[1]-half[1]*newres);
      this.ul = new Array(center[0]-half[0]*newres, center[1]+half[1]*newres);
  
      //make sure the request doesn't extend beyond the available model
      //TBD this block not tested
      if ( limitExtent ) {
        var xShift = 0;
        if ( this.lr[0] > ContextExtent.lr[0] ) xShift = ContextExtent.lr[0] - this.lr[0];
        if ( this.ul[0] < ContextExtent.ul[0] ) xShift = ContextExtent.ul[0] - this.ul[0];
        this.lr[0] += xShift;
        this.ul[0] += xShift;
  
        var yShift = 0;
        if ( this.lr[1] < ContextExtent.lr[1] ) yShift = ContextExtent.lr[1] - this.lr[1];
        if ( this.ul[1] > ContextExtent.ul[1] ) yShift = ContextExtent.ul[1] - this.ul[1];
        this.lr[1] += yShift;
        this.ul[1] += yShift;
      }
  
      this.model.setBoundingBox( new Array(this.ul[0], this.lr[1], this.lr[0], this.ul[1]) );
      //this.setResolution(size);
      this.setSize(newres);
    }
  
    /**
     * Adjust the extent to the given bbox.  Resolution is recalculated. 
     * Extent width and height remain fixed.  
     * @param ul      upper left coordinate of bbox in XY projection coords
     * @param lr      lower right coordinate of bbox in XY projection coords
     */
    this.zoomToBox = function(ul, lr) {    //pass in xy
      var center = new Array((ul[0]+lr[0])/2, (ul[1]+lr[1])/2);
      newres = Math.max((lr[0] - ul[0])/this.size[0], (ul[1] - lr[1])/this.size[1]);
      this.centerAt( center, newres );
    } 
  
  /**
     * Adjust the width and height to that bbox is displayed at specified resolution
     * @param res   the resolution to be set
     */
    //TBD update the model doc
    this.setSize = function(res) {     //pass in a resolution and width, height are recalculated
      this.res[0] = this.res[1] = res;
      this.size[0] = (this.lr[0] - this.ul[0])/this.res[0];
      this.size[1] = (this.ul[1] - this.lr[1])/this.res[1];
      this.width = Math.ceil(this.size[0]);
      this.height = Math.ceil(this.size[1]);
    }
  
    /**
     * Adjust the resolution so the bbox fits in the specified width and height
     * @param size   width, height array passed in
     */
    //TBD update the model doc
    this.setResolution = function(size) {    //pass in a width, height and res is recalculated
      this.size[0] = size[0];
      this.size[1] = size[1];
      this.res[0] = (this.lr[0] - this.ul[0])/this.size[0];
      this.res[1] = (this.ul[1] - this.lr[1])/this.size[1];
      this.width = Math.ceil(this.size[0]);
      this.height = Math.ceil(this.size[1]);
    }
  
    /**
     * Returns the map scale denominator for the current extent resolution
     * @return map scale denominator
     */
    this.getScale = function() {
      var pixRes = null;
      switch(this.model.getSRS()) {
        case "EPSG:4326":				//all projection codes in degrees
        case "EPSG:4269":				
          pixRes = this.res[0]*degToMeter;
          break;
        default:                //all projection codes in meters
          pixRes = this.res[0];
          break;
      }
      return mbScaleFactor*pixRes;
    }
  
    /**
     * Sets the model's resolution from mapScale input value.  The map center 
     * remains fixed.
     * @param scale   map scale denominator value
     */
    this.setScale = function(scale) {
      var newRes = null;
  /*
   * FD 2005/03/04
   * On contraint l'echelle min et max de l'application.
   * A externaliser dans le fichier de config de l'application ;-)
   * DGR : should be in the config
      if (scale < minScale) {
        scale= minScale ;
      }
      if (scale > maxScale) {
        scale= maxScale ;
      }
   */
      switch(this.model.getSRS()) {
        case "EPSG:4326":				//all projection codes in degrees
        case "EPSG:4269":				
          //convert to resolution in degrees
          newRes = scale/(mbScaleFactor*degToMeter);
          break;
        default:                //all projection codes in meters
          newRes = scale/mbScaleFactor;
          break;
      }
      this.centerAt(this.getCenter(), newRes );
    }
  
  
    /**
     * Initialization of the Extent tool, called as a loadModel event listener.
     * @param extent      the object being initialized
     * @param initialRes  (optional) if supplied the extent resolution will be set to this value
     */
    this.init = function(extent, initialRes) {
      var bbox = extent.model.getBoundingBox();
      extent.ul = new Array(bbox[0],bbox[3]);
      extent.lr = new Array(bbox[2],bbox[1]);
  /*
  TBD: when called as a listener this gets a bbox array passed in, not initialRes value
      if ( initialRes ) {
        extent.setSize( initialRes );
      } else {
        extent.setResolution( new Array(extent.model.getWindowWidth(), extent.model.getWindowHeight() ) );
      }
  */
      extent.setResolution( new Array(extent.model.getWindowWidth(), extent.model.getWindowHeight() ) );
    }
    if ( initialRes ) this.init(this, initialRes);
  
  
    this.firstInit = function(extent, initialRes) {
    	extent.init(extent, initialRes);
      //TBD: this causes 2 paint() calls on initial load, not sure why it's here - MA
  	  //extent.zoomToBox(extent.ul,extent.lr);
    }
  
  }
  
    
    
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/GetFeatureInfo.xsl
  
  Index: GetFeatureInfo.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parses an OGC context document to generate a GetFeatureInfo url
  Author:      Nedjo
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  <xsl:stylesheet version="1.0" xmlns:wmc="http://www.opengis.net/context" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
    <xsl:output method="xml"/>
    <xsl:strip-space elements="*"/>
  
    <!-- parameters to be passed into the XSL -->
    <!-- The name of the WMS GetFeatureInfo layer -->
    <xsl:param name="queryLayer">highways</xsl:param>
    <xsl:param name="xCoord">1</xsl:param>
    <xsl:param name="yCoord">1</xsl:param>
    <xsl:param name="infoFormat">text/html</xsl:param>
    <xsl:param name="featureCount">1</xsl:param>
  
    <!-- Global variables -->
    <xsl:variable name="bbox">
      <xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@minx"/>,<xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@miny"/>,<xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@maxx"/>,<xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@maxy"/>
    </xsl:variable>
    <xsl:variable name="width">
      <xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:Window/@width"/>
    </xsl:variable>
    <xsl:variable name="height">
      <xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:Window/@height"/>
    </xsl:variable>
    <xsl:variable name="srs" select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@SRS"/>
  
    <!-- Root template -->
    <xsl:template match="/">
      <url>
        <xsl:apply-templates select="wmc:ViewContext/wmc:LayerList"/>
        <error>URL not calculated for layer=<xsl:value-of select="$queryLayer"/></error>
      </url>
    </xsl:template>
  
    <!-- Layer template -->
    <xsl:template match="wmc:Layer">
      <xsl:if test="contains($queryLayer,wmc:Name)">
        <!-- Layer variables -->
        <xsl:variable name="version">
          <xsl:value-of select="wmc:Server/@version"/>    
        </xsl:variable>
        <xsl:variable name="baseUrl">
          <xsl:value-of select="wmc:Server/wmc:OnlineResource/@xlink:href"/>    
        </xsl:variable>
        <xsl:variable name="firstJoin">
          <xsl:choose>
            <xsl:when test="substring($baseUrl,string-length($baseUrl))='?'"></xsl:when>
            <xsl:when test="contains($baseUrl, '?')">&amp;</xsl:when> 
            <xsl:otherwise>?</xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
  
        <!-- Print the URL -->
        <xsl:value-of select="$baseUrl"/><xsl:value-of select="$firstJoin"/>VERSION=<xsl:value-of select="$version"/>&amp;REQUEST=GetFeatureInfo&amp;LAYERS=<xsl:value-of select="$queryLayer"/>&amp;SRS=<xsl:value-of select="$srs"/>&amp;BBOX=<xsl:value-of select="$bbox"/>&amp;WIDTH=<xsl:value-of select="$width"/>&amp;HEIGHT=<xsl:value-of select="$height"/>&amp;INFO_FORMAT=<xsl:value-of select="$infoFormat"/>&amp;FEATURE_COUNT=<xsl:value-of select="$featureCount"/>&amp;QUERY_LAYERS=<xsl:value-of select="$queryLayer"/>&amp;X=<xsl:value-of select="$xCoord"/>&amp;Y=<xsl:value-of select="$yCoord"/>&amp;FORMAT
      </xsl:if>
    </xsl:template>
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/History.js
  
  Index: History.js
  ===================================================================
  /*
  Author:       Steven Ottens AT geodan.nl
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
  
  
  /**
   * A tool designed to store the history of the extent during a session
   *
   * @constructor
   * @base ToolBase
   * @param toolNode  The node for this tool from the configuration document.
   * @param model     The model object that contains this tool
   */
  function History(toolNode, model) {
    ToolBase.apply(this, new Array(toolNode, model));
  
  	
    var doAdd = new Boolean();
  
    /**
      * Inititialising the history and setting start parameters
      * @param objRef  pointer to this object.
      */
  
  	this.init = function(objRef) {
      place = -1;
      list = new Array();
  
  		var bbox = objRef.targetModel.getBoundingBox();
      newExtent = new Array();
      newExtent[0] = new Array(bbox[0],bbox[3]);
      newExtent[1] = new Array(bbox[2],bbox[1]);
  		list.push(newExtent); 
  
  		place = place+1; 
  
  		objRef.model.active = place;
      objRef.model.historyList = list;
  
    }
  
    /**
     * This adds the current extent to the historyList
     * @param objRef  pointer to this object.
     */
    this.add = function(objRef) {
      if (objRef.model.active!=null) {
        var place = objRef.model.active;
        var list = objRef.model.historyList;
        newExtent = new Array();
        newExtent[0] = objRef.model.extent.ul;
        newExtent[1] = objRef.model.extent.lr;
  
        if( place==(list.length-1)) { //If we are already at the end of the list add a new item
          list.push(newExtent); 
          place = place+1; 
        }
        else { //If we are somewhere in the middle of the list clear the rest of the list and add a new item
          place = place+1;
          list = list.slice(0,place);
          list.push(newExtent);
        }
        objRef.model.active = place;
        objRef.model.historyList = list;
      }
    }
  
    /**
     * This returns the previous extent in the list
     * @param objRef  pointer to this object.
     */
  
    this.back = function(objRef){
      place = objRef.model.active;
      if(place<1) {
        objRef.model.previousExtent = null;
        alert("You can't go further back");
      }
      else {
        place = place -1;
        objRef.model.active = place;
        objRef.model.previousExtent = objRef.model.historyList[place];
      }
  
    }
    /**
     * This returns the next extent in the list
     * @param objRef  pointer to this object.
     */
    this.forward = function(objRef) {
      place = objRef.model.active;
      if(place<(objRef.model.historyList.length-1)) {
        place = place +1;
        objRef.model.active = place;
        objRef.model.nextExtent = objRef.model.historyList[place];
      }
      else {
        objRef.model.nextExtent = null;
        alert("You can't go further forward");
      }
    }
  
    /**
     * This stops the listener, to prevent the undo/redo steps to appear in the list
     * @param objRef  pointer to this object.
     */
    this.stop = function(objRef) {
      objRef.model.removeListener("bbox",objRef.add, objRef);
    }
    
    /**
     * This restarts the listener after undo/redo is done.
     * @param objRef  pointer to this object.
     */
    this.start = function(objRef) {
      objRef.model.addListener("bbox",objRef.add, objRef);
    }
    /**
      * Set the loadModel listener in response to the init event
      * @param objRef pointer to this object.
      */
    this.initReset = function(objRef) {
      objRef.targetModel.addListener("bbox", objRef.add, objRef);
      objRef.targetModel.addListener("loadModel", objRef.init, objRef);
  	}
  
  	this.model.addListener("historyBack", this.back, this);
  	this.model.addListener("historyForward", this.forward, this);
  	this.model.addListener("historyStart", this.start, this);
  	this.model.addListener("historyStop", this.stop, this);
  	this.model.addListener("init", this.initReset, this);
  }
  
    
    
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/MouseClickHandler.js
  
  Index: MouseClickHandler.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
  
  /**
   * Tool which processes mouse clicks on a widget.
   * The tool must be enabled before use by calling tool.enable(true);
   * This tool registers mouse event listeners on the parent widget.
   * This tool works entirely in pixel/line coordinate space and knows nothing
   * about geography.
   * @constructor
   * @base ToolBase
   * @param toolNode  The node for this tool from the configuration document.
   * @param model     The model object that contains this tool
   */
  function MouseClickHandler(toolNode, model) {
    ToolBase.apply(this, new Array(toolNode, model));
  
    /**
     * Process a mouse click action.
     * @param objRef      Pointer to this MouseClickHandler object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.clickHandler = function(objRef,targetNode) {
      objRef.model.setParam("clickPoint", targetNode.evpl);
    }
  
    model.addListener('mouseup',this.clickHandler,this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/MovieLoop.js
  
  Index: MovieLoop.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  Dependancies: Context
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
  
  /**
   * Controller for a movie loop.  Set framesPerSec to control the frame rate 
   * and frameIncrement (+n/-n) to control the steps through the loop (n is number
   * of frames to increment.
   * @constructor
   * @base ToolBase
   * @author Adair
   * @param toolNode The tool node from the config document for this tool
   * @param model  the model object that contains this tool
   */
  function MovieLoop(toolNode, model) {
    ToolBase.apply(this, new Array(toolNode, model));
  
    this.frameIncrement = 1;
    this.model.setParam("firstFrame", 0);
    this.timestampIndex = 0;
    window.movieLoop = this;
  
    //
    var framesPerSecond = toolNode.selectSingleNode("mb:framesPerSecond");
    if (framesPerSecond) {
      this.delay = 1000/framesPerSecond.firstChild.nodeValue;
    } else {
      this.delay = 1000/10; //milliseconds
    }
  
    //set a limit to the munber of frames to be loaded
    this.maxFrames = 30;
    var maxFrames = toolNode.selectSingleNode("mb:maxFrames");
    if (maxFrames) this.maxFrames = maxFrames.firstChild.nodeValue;
  
    /**
     * Sets the frame to the specified index in the frame array
     * @param index the 0-based frame index in the frame array
     */
    this.setFrame = function(index) {
      var timestampList = this.model.timestampList;
      if (this.timestampIndex!=null) {
        var timestamp = timestampList.childNodes[this.timestampIndex];
        timestamp.setAttribute("current", "0");
        this.model.setParam("timestamp", this.timestampIndex);
      }
      var firstFrame = this.model.getParam("firstFrame");
      var lastFrame = this.model.getParam("lastFrame");
      if (index > lastFrame) index = firstFrame;
      if (index < firstFrame) index = lastFrame;
      this.timestampIndex = index;
      timestamp = timestampList.childNodes[this.timestampIndex];
      timestamp.setAttribute("current", "1");
      this.model.setParam("timestamp", this.timestampIndex);
    }
  
    /**
     * Advances the frame array by the frame increment
     * @param step optional parameter to override default frame increment
     */
    this.nextFrame = function(step) {
      var objRef = window.movieLoop;
      var increment = objRef.frameIncrement;
      if (step) increment = step;   //arg passed in overrides default
      objRef.setFrame(objRef.timestampIndex + increment);
    }
  
    /**
     * Listener fucntion to set the start and end frames based on the 
     * firstFrame and maxFrames property values.
     * @param objRef pointer to this object
     */
    this.setFrameLimits = function(objRef) {
      var timestampList = objRef.model.timestampList;
      //timestampList.firstFrame = objRef.firstFrame;  //set these from a widget, or config
      var firstFrame = objRef.model.getParam("firstFrame");
      var lastFrame = firstFrame+objRef.maxFrames;
      if (lastFrame > timestampList.childNodes.length) lastFrame = timestampList.childNodes.length-1;
      objRef.model.setParam("lastFrame",lastFrame);
      timestampList.childNodes[firstFrame].setAttribute("current","1");
    }
    this.model.addFirstListener("refresh",this.setFrameLimits,this);
    this.model.addListener("firstFrame",this.setFrameLimits,this);
  
    /**
     * Resets the frame index to the firstFrame property
     * @param objRef pointer to this object
     */
    this.reset = function(objRef) {
      objRef.pause();
      objRef.setFrame(objRef.model.getParam("firstFrame"));
    }
    this.model.addListener("loadModel",this.reset,this);
    this.model.addListener("bbox",this.reset,this);
  
    /**
     * Starts the movie loop playing by using a JavaScript timer.
     */
    this.play = function() {
      this.movieTimer = setInterval('window.movieLoop.nextFrame()',this.delay);
    }
    
    /**
     * Stops the JavaScript movie loop timer.
     */
    this.pause = function() {
      clearInterval(this.movieTimer);
    }
    
    /**
     * Stops the JavaScript movie loop timer and sets the index back to the first 
     * frame.
     */
    this.stop = function() {
      this.pause();
      this.reset(this);
    }
  
    /**
     * A "stopLoop" event listener to call the stop method
     * @param objRef pointer to this object
     */
    this.stopListener = function(objRef) {
      objRef.stop();
    }
    this.model.addListener("stopLoop",this.stopListener,this);
  
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/ToolBase.js
  
  Index: ToolBase.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Base Tool object that all Tools extend.
   * @constructor
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param toolNode The tool node from the Config XML file.
   * @param model    The widget object which created this tool.
   */
  function ToolBase(toolNode, model) {
    this.model = model;
    this.toolNode = toolNode;
  
    //set the ID for this tool
    var id = toolNode.selectSingleNode("@id");
    if (id) {
      this.id = id.firstChild.nodeValue;
    } else {
      this.id = "MbTool_" + mbIds.getId();
    }
  
    /**
     * Initialize the targetModel property to point to the object.  This happens
     * as an init listener to ensure that the referenced model has been created.
     * @param toolRef Pointer to this object.
     */
    this.initTargetModel = function(toolRef) {
      /** The model this tool will update. */
      var targetModel = toolRef.toolNode.selectSingleNode("mb:targetModel");
      if (targetModel) {
        var targetModelName = targetModel.firstChild.nodeValue;
        toolRef.targetModel = eval("config.objects."+targetModelName);
        if (!toolRef.targetModel) alert("error finding targetModel:"+targetModelName+" for tool:"+toolRef.id);
      } else {
        toolRef.targetModel = toolRef.model;
      }
    }
    this.model.addListener( "init", this.initTargetModel, this );
  
    /**
     * Initialize the mouseHandler property to point to the object.  This happens
     * as an init listener to ensure that the referenced model has been created.
     * @param toolRef Pointer to this object.
     */
    this.initMouseHandler = function(toolRef) {
      /** Mouse handler which this tool will register listeners with. */
      var mouseHandler = toolRef.toolNode.selectSingleNode("mb:mouseHandler");
      if (mouseHandler) {
        toolRef.mouseHandler = eval("config.objects." + mouseHandler.firstChild.nodeValue);
        if (!toolRef.mouseHandler) {
          alert("error finding mouseHandler:"+mouseHandler.firstChild.nodeValue+" for tool:"+toolRef.id);
        }
      }
    }
    this.model.addListener( "init", this.initMouseHandler, this );
  
    //tools enabled by default; can set to false in config for initial loading
    this.enabled = true;
    var enabled = toolNode.selectSingleNode("mb:enabled");
    if (enabled) this.enabled = eval(enabled.firstChild.nodeValue);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/WebServiceRequest.js
  
  Index: WebServiceRequest.js
  ===================================================================
  /*
  Author:       Mike Adair  mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
  
  /**
   * A controller issuing OGC web service requests.  The request is generated
   * by applying a stylesheet to a Layer/FeatureType/Coverage node from a 
   * capabilities document as a listener function.  The listener event name is 
   * a combination of the service type and the request name (e.g. wfs_GetFeature)
   * and the parameter passed to the listener is the featureName (Layer/FeatureType/Coverage).
   * The response from the request is stored in the targetModel.  If the 
   * targetModel is a template model (attribute template="true") the a new model 
   * is created and appended to the parentModel's <models> list.
   * @constructor
   * @base ToolBase
   * @param toolNode The tools's XML object node from the configuration document.
   * @param model    The model that this tool belongs to
   */
  function WebServiceRequest(toolNode, model) {
    ToolBase.apply(this, new Array(toolNode, model));
  
    //this.debug=true;
    
    //get the request name to add listener to
    var requestName = toolNode.selectSingleNode("mb:requestName");
    if (requestName) {
      this.requestName = requestName.firstChild.nodeValue;
    }
  
    //get the request filter to add to the request
    var requestFilter = toolNode.selectSingleNode("mb:requestFilter");
    if (requestFilter) {
      this.requestFilter = requestFilter.firstChild.nodeValue;
    }
  
    var styleUrl = baseDir+"/tool/xsl/"+this.requestName.replace(/:/,"_")+".xsl";
    this.requestStylesheet = new XslProcessor(styleUrl);
  
    // Set stylesheet parameters for all the child nodes from the config file
    for (var j=0;j<toolNode.childNodes.length;j++) {
      if (toolNode.childNodes[j].firstChild && toolNode.childNodes[j].firstChild.nodeValue) {
        this.requestStylesheet.setParameter(toolNode.childNodes[j].nodeName,toolNode.childNodes[j].firstChild.nodeValue);
      }
    }
  
    /**
     * Function which create the HTTP payload for a request
     * @param requestName the name of the web service operation to execute
     * @param featureNodeId the id of the node in the doc to be processed by the stylesheet
     */
    this.createHttpPayload = function(feature) {
      //confirm inputs
      if (this.debug) alert("source:"+Sarissa.serialize(feature));
      //if (this.debug) alert("stylesheet:"+Sarissa.serialize(this.requestStylesheet.xslDom));
  
  
      //prepare the stylesheet
      var httpPayload = new Object();
      httpPayload.method = this.targetModel.method;
      this.requestStylesheet.setParameter("httpMethod", httpPayload.method );
      this.requestStylesheet.setParameter("version", this.model.getVersion(feature) );
      if (this.requestFilter) {
        var filter = config.objects[this.requestFilter];
        this.requestStylesheet.setParameter("filter", escape(Sarissa.serialize(filter.doc).replace(/[\n\f\r\t]/g,'') ));
        if (this.debug) alert(Sarissa.serialize(filter.doc));
      }
  
      //process the doc with the stylesheet
      httpPayload.postData = this.requestStylesheet.transformNodeToObject(feature);
      if (this.debug) {
        alert("request data:"+Sarissa.serialize(httpPayload.postData));
        if (config.serializeUrl) var response = postLoad(config.serializeUrl, httpPayload.postData);
      }
  
      //allow the tool to have a serverUrl property which overrides the model server URL
      //TBD: this still used?
      if (this.serverUrl) {
        httpPayload.url = this.serverUrl;
      } else {
        httpPayload.url = this.model.getServerUrl(this.requestName, httpPayload.method, feature);
      }
  
      //extract the URL from the transformation result for GET method
      if (httpPayload.method.toLowerCase() == "get") {
        httpPayload.postData.setProperty("SelectionLanguage", "XPath");
        Sarissa.setXpathNamespaces(httpPayload.postData, "xmlns:mb='http://mapbuilder.sourceforge.net/mapbuilder'");
        var queryString = httpPayload.postData.selectSingleNode("//mb:QueryString");
        if (httpPayload.url.indexOf("?") < 0) httpPayload.url += "?";
        httpPayload.url += queryString.firstChild.nodeValue;
        httpPayload.postData = null;
      }
      if (this.debug) alert("URL:"+httpPayload.url);
      return httpPayload;
    }
  
  
    /**
     * Listener function which will actually issue the request.  This method
     * will prepare the HTTP payload for a particular featureName.
     * @param requestName the name of the web service operation to execute
     * @param featureNodeId the id of the node in the doc to be processed by the stylesheet
     */
    this.doRequest = function(objRef, featureName) {
      objRef.targetModel.featureName = featureName;
  
      var feature = objRef.model.getFeatureNode(featureName);
      if (objRef.model.setRequestParameters) objRef.model.setRequestParameters(featureName, objRef.requestStylesheet);
      var httpPayload = objRef.createHttpPayload(feature);
      objRef.targetModel.newRequest(objRef.targetModel,httpPayload);
    }
    this.model.addListener(this.requestName.replace(/:/,"_"), this.doRequest, this);
  
    this.setAoiParameters = function(objRef,bbox) {
      //TBD: this depends on the targetModel having a containerModel to extract the AOI from.
      //we probably need a config property to point to the AOI model to handle this properly.
      if (objRef.targetModel.containerModel) {
        var featureSRS = null;
        var containerSRS = "EPSG:4326";
        //var bbox = objRef.targetModel.containerModel.getBoundingBox();
    /*
        //convert the BBOX to the feature SRS for the request
        var containerSRS = objRef.targetModel.containerModel.getSRS();
        if (featureSRS) {
          var sourceProj = new Proj(featureSRS.firstChild.nodeValue);
          if ( !sourceProj.matchSrs( containerSRS )) {  
            var containerProj = new Proj(objRef.targetModel.containerModel.getSRS());
            var llTemp = containerProj.Inverse(new Array(bbox[0],bbox[1]));
            var xy = sourceProj.Forward(llTemp);
            bbox[0] = xy[0]; bbox[1] = xy[1];
            llTemp = containerProj.Inverse(new Array(bbox[2],bbox[3]));
            xy = sourceProj.Forward(llTemp);
            bbox[2] = xy[0]; bbox[3] = xy[1];
          }
        }
    */
        objRef.requestStylesheet.setParameter("bBoxMinX", bbox[0][0] );
        objRef.requestStylesheet.setParameter("bBoxMinY", bbox[1][1] );
        objRef.requestStylesheet.setParameter("bBoxMaxX", bbox[1][0] );
        objRef.requestStylesheet.setParameter("bBoxMaxY", bbox[0][1] );
        objRef.requestStylesheet.setParameter("srs", containerSRS );
        objRef.requestStylesheet.setParameter("width", objRef.targetModel.containerModel.getWindowWidth() );
        objRef.requestStylesheet.setParameter("height", objRef.targetModel.containerModel.getWindowHeight() );
      }
    }
  
    this.init = function(objRef) {
      if (objRef.targetModel.containerModel) {
        objRef.targetModel.containerModel.addListener("aoi", objRef.setAoiParameters, objRef);
        //TBD: another one for bbox
      }
    }
    this.model.addListener("init", this.init, this);
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/ZoomToAoi.js
  
  Index: ZoomToAoi.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  Dependancies: Context
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  
  /**
   * Controller for the locator map widget.  
   * Specify the context that this widget follows by setting the targetModel 
   * property in config.
   * This will display the AOI of the target model using the AoiBox tool. 
   * This will also process mouse events (click and dragbox) to recenter the 
   * target model and includes coordinate projection transformations if required.
   * Checking for extent limits is not yet implemented.
   * @constructor
   * @base ToolBase
   * @author Adair
   * @param toolNode      The tool node from the config document for this tool
   * @param model  Reference to the widget object that creates this tool
   */
  function ZoomToAoi(toolNode, model) {
    ToolBase.apply(this, new Array(toolNode, model));
  
    /**
     * Target model loadModel change listener.  This resets the projection objects
     * if the target model changes.
     * @param tool        Pointer to this ZoomToAoi object.
     */
    this.initProj = function( toolRef ) {
      if( toolRef.model.doc && toolRef.targetModel.doc ) {
        if ( toolRef.model.getSRS() != toolRef.targetModel.getSRS() ) {
            toolRef.model.proj = new Proj( toolRef.model.getSRS() );
            toolRef.targetModel.proj = new Proj( toolRef.targetModel.getSRS() );
        }
      }
    }
    this.setListeners = function( toolRef ) {
      toolRef.model.addListener( "loadModel", toolRef.initProj, toolRef );
      toolRef.targetModel.addListener( "loadModel", toolRef.initProj, toolRef );
      toolRef.initProj( toolRef );
    }
    this.model.addListener( "loadModel", this.setListeners, this);
  
    /**
     * Target model bbox change listener.  This sets this model's AOI to be the
     * same as the target model bounding box.
     * @param tool        Pointer to this ZoomToAoi object.
     */
    this.showTargetAoi = function( tool ) {
      if( tool.targetModel.doc ) {
  	    var bbox = tool.targetModel.getBoundingBox();  
  	    var ul = new Array(bbox[0],bbox[3]);
  	    var lr = new Array(bbox[2],bbox[1]);
  	    if ( tool.model.getSRS() != tool.targetModel.getSRS() ) {
  	      ul = tool.targetModel.proj.Inverse( ul ); //to lat-long
  	      lr = tool.targetModel.proj.Inverse( lr );
  	      if (ul[0]>lr[0]) ul[0] = ul[0]-360.0;     //make sure ul is left of lr
  	      ul = tool.model.proj.Forward( ul );       //back to XY
  	      lr = tool.model.proj.Forward( lr );
  	    }
  	    tool.model.setParam("aoi", new Array(ul, lr) );
      }
    }
    this.firstInit = function(tool) {
      tool.targetModel.addListener( "loadModel", tool.showTargetAoi, tool );
      tool.targetModel.addListener( "bbox", tool.showTargetAoi, tool );
      tool.showTargetAoi(tool);
    }
    this.model.addListener( "loadModel", this.firstInit, this );
  
  
    /**
     * Process a mouse up action.  This will recenter the target model's bbox
     * to be equal to this model's AOI.
     * @param tool        Pointer to this ZoomToAoi object.
     * @param targetNode  The node for the enclosing HTML tag for this widget, not used.
     */
    this.mouseUpHandler = function(tool,targetNode) {
      var bbox = tool.model.getParam("aoi");
      var ul = bbox[0];
      var lr = bbox[1];
      if ( tool.model.getSRS() != tool.targetModel.getSRS() ) {
        //TBD: convert XY to lat/long first
        ul = tool.targetModel.proj.Forward( ul ); //to target XY
        lr = tool.targetModel.proj.Forward( lr );
      }
      if ( ( ul[0]==lr[0] ) && ( ul[1]==lr[1] ) ) {
        tool.targetModel.extent.centerAt( ul, tool.targetModel.extent.res[0] );
      } else {
        tool.targetModel.extent.zoomToBox( ul, lr );
      }
    }
    this.model.addListener('mouseup',this.mouseUpHandler,this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/Caps2Context.xsl
  
  Index: Caps2Context.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:wms="http://www.opengis.net/wms"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xlink="http://www.w3.org/1999/xlink">
  <!--
  Description: Convert a WMS Capabilities document to a Web Map Context
  Author:      Nedjo Rogers nedjo AT gworks.ca
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  
  -->
    <xsl:output method="xml" indent="yes"/>
  
    <xsl:param name="width">400</xsl:param>
    <xsl:param name="selectedLayer"/>
    <xsl:param name="styleName">composite</xsl:param>
    
  
    <xsl:template match="/WMT_MS_Capabilities">
      <xsl:param name="wmsVersion" select="@version"/>    
      <xsl:param name="wmsTitle" select="Service/Title"/>    
      <xsl:param name="wmsOnlineResource" select="Capability/Request/GetMap/DCPType/HTTP/Get/OnlineResource/@xlink:href"/>    
      <ViewContext version="1.0.0"
  			    id="autoGeneratedContext_"
            xmlns="http://www.opengis.net/context">
        <General>
          <Title><xsl:value-of select="$wmsTitle"/></Title>
          <!-- TBD: The following should be extracted -->
          <xsl:variable name="minx" select="number(Capability/Layer/LatLonBoundingBox/@minx)"/>
          <xsl:variable name="maxx" select="number(Capability/Layer/LatLonBoundingBox/@maxx)"/>
          <xsl:variable name="miny" select="number(Capability/Layer/LatLonBoundingBox/@miny)"/>
          <xsl:variable name="maxy" select="number(Capability/Layer/LatLonBoundingBox/@maxy)"/>
          <xsl:variable name="dy" select=" $maxy - $miny "/>
          <xsl:variable name="dx" select=" $maxx - $minx "/>
          <xsl:variable name="height" select="round(($dy div $dx)*$width)"/>
          <Window width="{$width}" height="{$height}"/>
          <BoundingBox SRS="EPSG:4326" minx="{$minx}" miny="{$miny}" maxx="{$maxx}" maxy="{$maxy}"/>
        </General>
        <LayerList>
          <xsl:choose><xsl:when test="string-length($selectedLayer)>0">
            <xsl:apply-templates select="Capability/Layer/Layer[Name=$selectedLayer]">
              <xsl:with-param name="version" select="$wmsVersion"/>
              <xsl:with-param name="title" select="$wmsTitle"/>
              <xsl:with-param name="url" select="$wmsOnlineResource"/>
            </xsl:apply-templates>
          </xsl:when><xsl:otherwise>
            <xsl:apply-templates select="Capability/Layer/Layer">
              <xsl:with-param name="version" select="$wmsVersion"/>
              <xsl:with-param name="title" select="$wmsTitle"/>
              <xsl:with-param name="url" select="$wmsOnlineResource"/>
            </xsl:apply-templates>
          </xsl:otherwise></xsl:choose>
        </LayerList>
      </ViewContext>
    </xsl:template>
  
    <!-- Layer -->
    <xsl:template match="Layer">
      <xsl:param name="version"/>
      <xsl:param name="title"/>
      <xsl:param name="url"/>
      <xsl:element name="Layer" namespace="http://www.opengis.net/context">
        <xsl:attribute name="queryable">
          <xsl:value-of select="@queryable"/>
        </xsl:attribute>
        <xsl:attribute name="hidden">
          <xsl:text>0</xsl:text>
        </xsl:attribute>
        <xsl:element name="Server" namespace="http://www.opengis.net/context">
          <xsl:attribute name="service">
            <xsl:text>OGC:WMS</xsl:text>
          </xsl:attribute>
          <xsl:attribute name="version">
            <xsl:value-of select="$version"/>
          </xsl:attribute>
          <xsl:attribute name="title">
            <xsl:value-of select="$title"/>
          </xsl:attribute>
          <xsl:element name="OnlineResource" namespace="http://www.opengis.net/context">
            <xsl:attribute name="type">
              <xsl:text>simple</xsl:text>
            </xsl:attribute>
            <xsl:attribute name="xlink:href">
              <xsl:value-of select="$url"/>
            </xsl:attribute>
          </xsl:element>
        </xsl:element>
        <Name xmlns="http://www.opengis.net/context"><xsl:value-of select="Name"/></Name>
        <Title xmlns="http://www.opengis.net/context"><xsl:value-of select="Title"/></Title>
        <Abstract xmlns="http://www.opengis.net/context"><xsl:value-of select="Abstract"/></Abstract>
        <FormatList xmlns="http://www.opengis.net/context">
          <Format current="1" xmlns="http://www.opengis.net/context">image/png</Format>
        </FormatList>
        <StyleList xmlns="http://www.opengis.net/context">
          <Style xmlns="http://www.opengis.net/context" current="1">
            <xsl:copy-of select="Style[Name=$styleName]/*"/>
          </Style>
        </StyleList>
        <xsl:if test="Dimension">
          <DimensionList xmlns="http://www.opengis.net/context">
            <xsl:copy-of select="Dimension"/>
          </DimensionList>
        </xsl:if>
      </xsl:element>
    </xsl:template>
    
    <!-- duplicate everything with namespace prefix for WMS 1.3.x -->
    <xsl:template match="/wms:WMS_Capabilities">
      <xsl:param name="wmsVersion" select="/wms:WMS_Capabilities/@version"/>    
      <xsl:param name="wmsTitle" select="/wms:WMS_Capabilities/wms:Service/wms:Title"/>    
      <xsl:param name="wmsOnlineResource" select="/wms:WMS_Capabilities/wms:Capability/wms:Request/wms:GetMap/wms:DCPType/wms:HTTP/wms:Get/wms:OnlineResource/@xlink:href"/>    
    
      <xsl:param name="defLayers" select="wms:Capability//wms:Layer[wms:Name=$selectedLayer]"/>    
      <xsl:param name="defLayer" select="$defLayers[1]"/>
      <xsl:variable name="abstract" select="$defLayer/wms:Abstract"/>
      <xsl:variable name="title" select="$defLayer/wms:Title"/>
      <xsl:variable name="infoLink" select="$defLayer/wms:MetadataURL/wms:OnlineResource/@xlink:href"/>
      <xsl:variable name="logoLink" select="$defLayer/wms:Attribution/wms:LogoURL/wms:OnlineResource/@xlink:href"/>
      <xsl:variable name="providerName" select="wms:Service/wms:Title"/>
      <ViewContext version="1.0.0"
  			    id="autoGeneratedContext_"
            xmlns="http://www.opengis.net/context">
        <General>
          <Title><xsl:value-of select="$title"/></Title>
          <Abstract><xsl:value-of select="$abstract"/></Abstract>
          <xsl:variable name="bbox" select="$defLayer/wms:BoundingBox"/>
          <xsl:variable name="minx" select="number($bbox/@minx)"/>
          <xsl:variable name="maxx" select="number($bbox/@maxx)"/>
          <xsl:variable name="miny" select="number($bbox/@miny)"/>
          <xsl:variable name="maxy" select="number($bbox/@maxy)"/>
          <xsl:variable name="srs" select="$bbox/@CRS"/>
          <xsl:choose><xsl:when test="$defLayer/@fixedWidth">
            <xsl:variable name="fWidth" select="$defLayer/@fixedWidth"/>
            <xsl:variable name="fHeight" select="$defLayer/@fixedHeight"/>
            <Window width="{$fWidth}" height="{$fHeight}"/>
          </xsl:when><xsl:otherwise>
            <xsl:variable name="dy" select=" $maxy - $miny "/>
            <xsl:variable name="dx" select=" $maxx - $minx "/>
            <xsl:variable name="height" select="round(($dy div $dx)*$width)"/>
            <Window width="{$width}" height="{$height}"/>
          </xsl:otherwise></xsl:choose>
          <BoundingBox SRS="{$srs}" minx="{$minx}" miny="{$miny}" maxx="{$maxx}" maxy="{$maxy}"/>
          <DescriptionURL format="text/html">
              <OnlineResource xlink:href="{$infoLink}" xlink:type="simple"/>
          </DescriptionURL>
          <LogoURL format="text/html">
              <OnlineResource xlink:href="{$logoLink}" xlink:type="simple"/>
          </LogoURL>
          <ContactInformation>
            <ContactPersonPrimary>
              <ContactOrganization><xsl:value-of select="$providerName"/></ContactOrganization>
            </ContactPersonPrimary>
          </ContactInformation>
          
        </General>
        <LayerList>
          <xsl:choose><xsl:when test="string-length($selectedLayer)>0">
            <xsl:apply-templates select="$defLayer">
              <xsl:with-param name="version" select="$wmsVersion"/>
              <xsl:with-param name="title" select="$wmsTitle"/>
              <xsl:with-param name="url" select="$wmsOnlineResource"/>
            </xsl:apply-templates>
          </xsl:when><xsl:otherwise>
            <xsl:apply-templates select="wms:Capability/wms:Layer/*">
              <xsl:with-param name="version" select="$wmsVersion"/>
              <xsl:with-param name="title" select="$wmsTitle"/>
              <xsl:with-param name="url" select="$wmsOnlineResource"/>
            </xsl:apply-templates>
          </xsl:otherwise></xsl:choose>
        </LayerList>
      </ViewContext>
    </xsl:template>
  
    <!-- Layer -->
    <xsl:template match="wms:Layer">
      <xsl:param name="version"/>
      <xsl:param name="title"/>
      <xsl:param name="url"/>
      <xsl:element name="Layer" namespace="http://www.opengis.net/context">
        <xsl:attribute name="queryable">
          <xsl:value-of select="@queryable"/>
        </xsl:attribute>
        <xsl:attribute name="hidden">
          <xsl:text>0</xsl:text>
        </xsl:attribute>
        <xsl:element name="Server" namespace="http://www.opengis.net/context">
          <xsl:attribute name="service">
            <xsl:text>OGC:WMS</xsl:text>
          </xsl:attribute>
          <xsl:attribute name="version">
            <xsl:value-of select="$version"/>
          </xsl:attribute>
          <xsl:attribute name="title">
            <xsl:value-of select="$title"/>
          </xsl:attribute>
          <xsl:element name="OnlineResource" namespace="http://www.opengis.net/context">
            <xsl:attribute name="type">
              <xsl:text>simple</xsl:text>
            </xsl:attribute>
            <xsl:attribute name="xlink:href">
              <xsl:value-of select="$url"/>
            </xsl:attribute>
          </xsl:element>
        </xsl:element>
        <Name xmlns="http://www.opengis.net/context"><xsl:value-of select="wms:Name"/></Name>
        <Title xmlns="http://www.opengis.net/context"><xsl:value-of select="wms:Title"/></Title>
        <Abstract xmlns="http://www.opengis.net/context"><xsl:value-of select="wms:Abstract"/></Abstract>
        <FormatList xmlns="http://www.opengis.net/context">
          <Format current="1" xmlns="http://www.opengis.net/context">image/png</Format>
        </FormatList>
        <StyleList xmlns="http://www.opengis.net/context">
          <Style xmlns="http://www.opengis.net/context" current="1">
            <Name xmlns="http://www.opengis.net/context"><xsl:value-of select="$styleName"/></Name>
            <xsl:if test="wms:Style/wms:LegendURL">
            <LegendURL xmlns="http://www.opengis.net/context">
              <OnlineResource xmlns="http://www.opengis.net/context">
                <xsl:attribute name="xlink:href">
                  <xsl:value-of select="wms:Style/wms:LegendURL/wms:OnlineResource/@xlink:href"/>
                </xsl:attribute>
              </OnlineResource>
            </LegendURL>
            </xsl:if>
          </Style>
        </StyleList>
        <xsl:if test="wms:Dimension[@name='time']">
          <DimensionList xmlns="http://www.opengis.net/context">
            <Dimension name="time" units="ISO8601"><xsl:value-of select="wms:Dimension[@name='time']"/></Dimension>
          </DimensionList>
        </xsl:if>
      </xsl:element>
    </xsl:template>
      
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/GetMap.xsl
  
  Index: GetMap.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  
  Description: transforms a WMS Layer node into an XML structure that contains
  
               the URL for the GetMap request for both context docs and WMS caps.
  
  Author:      adair
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
      xmlns:wmc="http://www.opengis.net/context" 
  
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
  
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
  
  
    <xsl:output method="xml"/>
  
    <xsl:strip-space elements="*"/>
  
    <!--
  
    <xsl:include href="ogcMapImgObjects.xsl" />
  
    -->
  
  
  
    <xsl:param name="bbox"/>
  
    <xsl:param name="width"/>
  
    <xsl:param name="height"/>
  
    <xsl:param name="srs"/>
  
    <xsl:param name="version"/>
  
    <xsl:param name="format">image/gif</xsl:param>
  
    
  
    <xsl:template match="Layer">
  
      <xsl:variable name="styleParam"/>
  
      <xsl:variable name="visibility"/>
  
      <xsl:variable name="mapRequest">
  
        <xsl:choose>
  
          <xsl:when test="starts-with($version, '1.0')">
  
              WMTVER=<xsl:value-of select="$version"/>&amp;REQUEST=map
  
          </xsl:when>            
  
          <xsl:otherwise>
  
              VERSION=<xsl:value-of select="$version"/>&amp;REQUEST=GetMap
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <GetMap>
  
        <mb:QueryString>
  
          <xsl:variable name="src">    
  
              <xsl:value-of select="$mapRequest"/>
  
     &amp;SRS=<xsl:value-of select="$srs"/>
  
    &amp;BBOX=<xsl:value-of select="translate($bbox,' ',',')"/>
  
   &amp;WIDTH=<xsl:value-of select="$width"/>
  
  &amp;HEIGHT=<xsl:value-of select="$height"/>
  
  &amp;LAYERS=<xsl:value-of select="Name"/>
  
  &amp;FORMAT=<xsl:value-of select="$format"/>
  
         &amp;<xsl:value-of select="$styleParam"/>
  
  &amp;TRANSPARENT=TRUE
  
  <!--	
  
    //TBD: these still to be properly handled 
  
    //also sld support
  
    if (this.transparent) src += '&' + 'TRANSPARENT=' + this.transparent;
  
  	if (this.bgcolor) src += '&' + 'BGCOLOR=' + this.bgcolor;
  
  	//if (this.exceptions) src += '&' + 'EXCEPTIONS=' + this.exceptions;
  
  	if (this.vendorstr) src += '&' + this.vendorstr;
  
    // -->
  
          </xsl:variable>
  
          <xsl:value-of select="translate(normalize-space($src),' ', '' )" disable-output-escaping="no"/>
  
        </mb:QueryString>
  
      </GetMap>
  
    </xsl:template>
  
  
  
    <xsl:template match="wmc:Layer">
  
      <xsl:param name="version">
  
          <xsl:value-of select="wmc:Server/@version"/>    
  
      </xsl:param>
  
      <xsl:variable name="format">
  
        <xsl:choose>
  
          <xsl:when test="wmc:FormatList"><xsl:value-of select="wmc:FormatList/wmc:Format[@current='1']"/></xsl:when>
  
          <xsl:otherwise>image/gif</xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
      <xsl:variable name="styleParam">
  
        <xsl:choose>
  
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD">
  
            SLD=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:OnlineResource/@xlink:href"/>
  
          </xsl:when>
  
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:StyeLayerDescriptor">
  
            SLD=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:StyeLayerDescriptor"/>
  
          </xsl:when>
  
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:FeatureTypeStyle">
  
            SLD=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:FeatureTypeStyle"/>
  
          </xsl:when>
  
          <xsl:otherwise>
  
            STYLES=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:Name"/>
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
      <xsl:variable name="visibility">
  
        <xsl:choose>
  
          <xsl:when test="@hidden='1'">hidden</xsl:when>
  
          <xsl:otherwise>visible</xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
      <xsl:variable name="mapRequest">
  
        <xsl:choose>
  
          <xsl:when test="starts-with($version, '1.0')">
  
              WMTVER=<xsl:value-of select="$version"/>&amp;REQUEST=map
  
          </xsl:when>            
  
          <xsl:otherwise>
  
              VERSION=<xsl:value-of select="$version"/>&amp;REQUEST=GetMap
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <GetMap>
  
        <mb:QueryString>
  
          <xsl:variable name="src">    
  
              <xsl:value-of select="$mapRequest"/>
  
     &amp;SRS=<xsl:value-of select="$srs"/>
  
    &amp;BBOX=<xsl:value-of select="$bbox"/>
  
   &amp;WIDTH=<xsl:value-of select="$width"/>
  
  &amp;HEIGHT=<xsl:value-of select="$height"/>
  
  &amp;LAYERS=<xsl:value-of select="wmc:Name"/>
  
  &amp;FORMAT=<xsl:value-of select="$format"/>
  
         &amp;<xsl:value-of select="$styleParam"/>
  
  &amp;TRANSPARENT=true
  
  <!--	
  
    //TBD: these still to be properly handled 
  
    //also sld support
  
    if (this.transparent) src += '&' + 'TRANSPARENT=' + this.transparent;
  
  	if (this.bgcolor) src += '&' + 'BGCOLOR=' + this.bgcolor;
  
  	//if (this.exceptions) src += '&' + 'EXCEPTIONS=' + this.exceptions;
  
  	if (this.vendorstr) src += '&' + this.vendorstr;
  
    // -->
  
          </xsl:variable>
  
          <xsl:value-of select="translate(normalize-space($src),' ', '' )" disable-output-escaping="no"/>
  
        </mb:QueryString>
  
      </GetMap>
  
    </xsl:template>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wcs_GetCoverage.xsl
  
  Index: wcs_GetCoverage.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!--
  Description: transforms an OWS Context document Coverage resource element into
               the request string (HTTP GET only for now)
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:param="http;//www.opengis.net/param"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml"/>
    <xsl:strip-space elements="*"/>
  
    <xsl:param name="bBoxMinX"/>
    <xsl:param name="bBoxMinY"/>
    <xsl:param name="bBoxMaxX"/>
    <xsl:param name="bBoxMaxY"/>
    <xsl:param name="width"/>
    <xsl:param name="height"/>
    <xsl:param name="srs"/>
    <xsl:param name="version"/>
    
    <xsl:template match="wmc:Coverage">
      <xsl:variable name="bbox">
        <xsl:value-of select="$bBoxMinX"/>,<xsl:value-of select="$bBoxMinY"/>,
        <xsl:value-of select="$bBoxMaxX"/>,<xsl:value-of select="$bBoxMaxY"/>
      </xsl:variable>
      <GetCoverage>
        <mb:QueryString>
          <xsl:variable name="src">    
        VERSION=<xsl:value-of select="$version"/>
   &amp;REQUEST=GetCoverage
   &amp;SERVICE=WCS
       &amp;CRS=<xsl:value-of select="$srs"/>
      &amp;BBOX=<xsl:value-of select="$bbox"/>
     &amp;WIDTH=<xsl:value-of select="$width"/>
    &amp;HEIGHT=<xsl:value-of select="$height"/>
  &amp;COVERAGE=<xsl:value-of select="wmc:Name"/>
    &amp;FORMAT=<xsl:value-of select="wmc:FormatList/wmc:Format[@current='1']"/>
          <xsl:for-each select="wmc:DimensionList/wmc:Dimension">
  &amp;<xsl:value-of select="@name"/>=<xsl:value-of select="."/>
          </xsl:for-each>
          <xsl:for-each select="wmc:ParameterList/wmc:Parameter">
  &amp;<xsl:value-of select="param:kvp/@name"/>=<xsl:value-of select="param:kvp/@value"/>          
          </xsl:for-each>
          </xsl:variable>
          <xsl:value-of select="translate(normalize-space($src),' ', '' )" disable-output-escaping="no"/>
        </mb:QueryString>
      </GetCoverage>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wfs_Delete.xsl
  
  Index: wfs_Delete.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: Extract FeatureMembers from a FeatureCollection and build
  
    into a WFS Insert transaction.
  
  Author:      Cameron Shorter
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
      xmlns:wfs="http://www.opengis.net/wfs"
  
      xmlns:ogc="http://www.opengis.net/ogc"
  
      xmlns:gml="http://www.opengis.net/gml">
  
  
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
  
  
    <!-- Match root -->
  
    <xsl:template match="/">
  
      <wfs:Transaction service="WFS" version="1.0.0">
  
        <xsl:apply-templates/>
  
      </wfs:Transaction>
  
    </xsl:template>
  
  
  
    <!-- Match featureMember -->
  
    <xsl:template match="gml:featureMember/*[@fid]">
  
      <wfs:Delete typeName="{name()}">
  
        <ogc:Filter>
  
          <ogc:FeatureId fid="{./@fid}"/>
  
        </ogc:Filter>
  
      </wfs:Delete>
  
    </xsl:template>
  
  
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wfs_DescribeFeatureType.xsl
  
  Index: wfs_DescribeFeatureType.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: transforms a WFS FeatureType node to a DescribeFeatureType request
  
  Author:      adair
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
      xmlns:wfs="http://www.opengis.net/wfs"
  
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
  		xmlns:ogc="http://www.opengis.net/ogc"
  
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
  
  		xmlns:gml="http://www.opengis.net/gml"
  
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
  
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
  
  
    <xsl:param name="httpMethod">get</xsl:param>
  
    
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="/wfs:WFS_Capabilities/wfs:FeatureTypeList">
  
      <DescribeFeatureType version="1.0.0" service="WFS">
  
        <xsl:apply-templates select="wfs:FeatureType"/>
  
      </DescribeFeatureType>
  
    </xsl:template>
  
  
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="wfs:FeatureType">
  
      <xsl:choose>
  
        <xsl:when test="$httpMethod='post'">
  
          <TypeName><xsl:value-of select="wfs:Name"/></TypeName>
  
        </xsl:when>
  
        <xsl:otherwise>
  
          <mb:QueryString>
  
            <xsl:variable name="query">
  
        request=DescribeFeatureType
  
   &amp;version=1.0.0
  
   &amp;service=WFS
  
  &amp;typename=<xsl:value-of select="wfs:Name"/>
  
            </xsl:variable>
  
            <xsl:value-of select="translate(normalize-space($query),' ', '' )" disable-output-escaping="no"/>
  
          </mb:QueryString>
  
        </xsl:otherwise>
  
      </xsl:choose>
  
    </xsl:template>
  
  
  
    <xsl:template match="text()|@*"/>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wfs_GetFeature.xsl
  
  Index: wfs_GetFeature.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: transforms a WFS FeatureType node to a GetFeatureType request
  
  Author:      adair
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
      xmlns:wfs="http://www.opengis.net/wfs"
  
      xmlns:wmc="http://www.opengis.net/context" 
  
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
  
  		xmlns:ogc="http://www.opengis.net/ogc"
  
  		xmlns:gml="http://www.opengis.net/gml"
  
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
  
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="no"/>
  
    <xsl:preserve-space elements="gml:coordinates"/>
  
  
  
    <xsl:param name="cs" select="','"/>
  
    <xsl:param name="ts" select="' '"/>
  
    <xsl:param name="bBoxMinX"/>
  
    <xsl:param name="bBoxMinY"/>
  
    <xsl:param name="bBoxMaxX"/>
  
    <xsl:param name="bBoxMaxY"/>
  
    <xsl:param name="srs"/>
  
    <xsl:param name="version"/>
  
    
  
    <xsl:param name="httpMethod">get</xsl:param>
  
    <xsl:param name="filter"/>
  
    <xsl:param name="maxFeatures">500</xsl:param>
  
    <xsl:param name="geometry"/>
  
    
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="wfs:FeatureType">
  
      <xsl:param name="resourceName" select="wfs:Name"/>
  
      <xsl:param name="featureSrs" select="wfs:SRS"/>
  
      <GetFeature version="1.0.0" service="WFS" maxFeatures="{$maxFeatures}">
  
      
  
      <xsl:choose>
  
        <xsl:when test="$httpMethod='post'">
  
        <Query typeName="{$resourceName}">
  
           <ogc:Filter>
  
              <ogc:And>
  
                <xsl:if test="$bBoxMinX">
  
                  <ogc:BBOX>
  
                    <ogc:PropertyName><xsl:value-of select="$geometry"/></ogc:PropertyName>
  
                    <gml:Box srsName="{$srs}">
  
              <xsl:value-of select="$bBoxMinX"/><xsl:value-of select="$cs"/>
  
              <xsl:value-of select="$bBoxMinY"/><xsl:value-of select="$ts"/>
  
              <xsl:value-of select="$bBoxMaxX"/><xsl:value-of select="$cs"/>
  
              <xsl:value-of select="$bBoxMaxY"/>
  
                    </gml:Box>
  
                  </ogc:BBOX>
  
                </xsl:if>
  
                <xsl:if test="$filter">
  
                  <xsl:value-of select="$filter"/>
  
                </xsl:if>
  
              </ogc:And>
  
            </ogc:Filter>
  
        </Query>
  
        </xsl:when>
  
        <xsl:otherwise>
  
          <mb:QueryString>
  
            <xsl:variable name="bbox">
  
              <xsl:value-of select="$bBoxMinX"/>,<xsl:value-of select="$bBoxMinY"/>,
  
              <xsl:value-of select="$bBoxMaxX"/>,<xsl:value-of select="$bBoxMaxY"/>
  
            </xsl:variable>
  
            <xsl:variable name="query">
  
           request=GetFeature
  
      &amp;service=WFS
  
      &amp;version=<xsl:value-of select="$version"/>
  
  &amp;maxfeatures=<xsl:value-of select="$maxFeatures"/>
  
     &amp;typename=<xsl:value-of select="$resourceName"/>
  
            <xsl:if test="$bBoxMinX">
  
     &amp;bbox=<xsl:value-of select="$bbox"/>
  
            </xsl:if>
  
            </xsl:variable>
  
            <xsl:value-of select="translate(normalize-space($query),' ','')" disable-output-escaping="no"/><xsl:if test="$filter">&amp;filter=<xsl:value-of select="$filter"/></xsl:if>
  
          </mb:QueryString>
  
        </xsl:otherwise>
  
      </xsl:choose>
  
      </GetFeature>
  
    </xsl:template>
  
    
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="wmc:FeatureType[wmc:Server/@service='OGC:WFS']">
  
      <xsl:param name="resourceName" select="wmc:Name"/>
  
      <xsl:param name="featureSrs" select="wmc:SRS"/>
  
      <GetFeature version="1.0.0" service="WFS" maxFeatures="{$maxFeatures}"
  
        xmlns="http://www.opengis.net/wfs"
  
        xmlns:ogc="http://www.opengis.net/ogc">
  
      <xsl:choose>
  
        <xsl:when test="$httpMethod='post'">
  
        <Query typeName="{$resourceName}">
  
           <!--ogc:PropertyName>GML_Geometry</ogc:PropertyName>
  
           <ogc:PropertyName>DEFINITION</ogc:PropertyName>
  
           <ogc:PropertyName>LU37_CODE</ogc:PropertyName>
  
           <ogc:PropertyName>YEAR</ogc:PropertyName-->
  
           <ogc:Filter>
  
              <ogc:And>
  
                <xsl:if test="wmc:Geometry">
  
  <xsl:variable name="bbox" select="concat($bBoxMinX,concat(',',concat($bBoxMinY,concat(' ',concat($bBoxMaxX,concat(',',$bBoxMaxY))))))"/>
  
                  <ogc:BBOX>
  
                    <ogc:PropertyName><xsl:value-of select="wmc:Geometry"/></ogc:PropertyName>
  
                    <gml:Box srsName="{$srs}">
  
                      <gml:coordinates><xsl:value-of select="$bbox"/></gml:coordinates>
  
                    </gml:Box>
  
                  </ogc:BBOX>
  
                </xsl:if>
  
                <xsl:if test="ogc:Filter">
  
                  <xsl:copy-of select="ogc:Filter/*"/>
  
                </xsl:if>
  
              </ogc:And>
  
            </ogc:Filter>
  
        </Query>
  
        </xsl:when>
  
        <xsl:otherwise>
  
          <mb:QueryString>
  
            <xsl:variable name="cFilterStr"><xsl:value-of select="ogc:Filter"/></xsl:variable>
  
            <xsl:variable name="bbox">
  
              <xsl:value-of select="$bBoxMinX"/>,<xsl:value-of select="$bBoxMinY"/>,
  
              <xsl:value-of select="$bBoxMaxX"/>,<xsl:value-of select="$bBoxMaxY"/>
  
            </xsl:variable>
  
            <xsl:variable name="query">
  
           request=GetFeature
  
      &amp;service=WFS
  
      &amp;version=<xsl:value-of select="$version"/>
  
  &amp;maxfeatures=<xsl:value-of select="$maxFeatures"/>
  
     &amp;typename=<xsl:value-of select="$resourceName"/>
  
            <xsl:if test="$bBoxMinX">
  
     &amp;bbox=<xsl:value-of select="$bbox"/>
  
            </xsl:if>
  
            </xsl:variable>
  
            <xsl:value-of select="translate(normalize-space($query),' ','')" disable-output-escaping="no"/><xsl:if test="$cFilterStr">&amp;filter=<xsl:value-of select="normalize-space($cFilterStr)"/></xsl:if>
  
  <!-- TBD something still wrong with filter parameter here -->
  
          </mb:QueryString>
  
        </xsl:otherwise>
  
      </xsl:choose>
  
      </GetFeature>
  
    </xsl:template>
  
    
  
    
  
    <xsl:template match="text()|@*"/>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wfs_Insert.xsl
  
  Index: wfs_Insert.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: Extract FeatureMembers from a FeatureCollection and build
  
    into a WFS Insert transaction.
  
  Author:      Cameron Shorter
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
      xmlns:wfs="http://www.opengis.net/wfs"
  
      xmlns:gml="http://www.opengis.net/gml">
  
  
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
  
  
    <!-- Match root -->
  
    <xsl:template match="/">
  
      <wfs:Transaction>
  
        <wfs:Insert>
  
          <xsl:apply-templates/>
  
        </wfs:Insert>
  
      </wfs:Transaction>
  
    </xsl:template>
  
  
  
    <!-- Match featureMember -->
  
    <xsl:template match="gml:featureMember">
  
      <xsl:for-each select="./*">
  
        <xsl:copy-of select="."/>
  
      </xsl:for-each>
  
    </xsl:template>
  
  
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wfs_Transaction.xsl
  
  Index: wfs_Transaction.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: Extract FeatureMembers from a FeatureCollection and build
    into a WFS Insert transaction.
  Author:      Cameron Shorter
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:wfs="http://www.opengis.net/wfs"
      xmlns:gml="http://www.opengis.net/gml"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- Match root -->
    <xsl:template match="/">
      <wfs:Transaction>
        <wfs:Insert>
          <xsl:apply-templates/>
        </wfs:Insert>
      </wfs:Transaction>
    </xsl:template>
  
    <!-- Match featureMember -->
    <xsl:template match="gml:featureMember">
      <xsl:for-each select="./*">
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wfs_Update.xsl
  
  Index: wfs_Update.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: Extract FeatureMembers from a FeatureCollection and build
  
    into a WFS Insert transaction.
  
  Author:      Cameron Shorter
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
      xmlns:wfs="http://www.opengis.net/wfs"
  
      xmlns:ogc="http://www.opengis.net/ogc"
  
      xmlns:gml="http://www.opengis.net/gml">
  
  
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
  
  
    <!-- Match root -->
  
    <xsl:template match="/">
  
      <wfs:Transaction service="WFS" version="1.0.0">
  
        <xsl:apply-templates/>
  
      </wfs:Transaction>
  
    </xsl:template>
  
  
  
    <!-- Match featureMember -->
  
    <xsl:template match="gml:featureMember/*[@fid]">
  
      <wfs:Update typeName="{name()}">
  
        <ogc:Filter>
  
          <ogc:FeatureId fid="{./@fid}"/>
  
        </ogc:Filter>
  
        <xsl:for-each select="./*">
  
          <wfs:Property>
  
            <wfs:Name>
  
              <xsl:value-of select="name()"/>
  
            </wfs:Name>
  
            <wfs:Value>
  
              <xsl:if test="./*">
  
                <xsl:copy-of select="./*"/>
  
              </xsl:if>
  
              <xsl:if test="not(./*)">
  
                <xsl:value-of select="."/>
  
              </xsl:if>
  
            </wfs:Value>
  
          </wfs:Property>
  
        </xsl:for-each>
  
      </wfs:Update>
  
    </xsl:template>
  
  
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wmc_AddResource.xsl
  
  Index: wmc_AddResource.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!--
  Description: parses a WMS capabilities Layer element and transforms it to a
               Web Map Context document Layer element.
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:wms="http://www.opengis.net/wms" 
      xmlns:wfs="http://www.opengis.net/wfs" 
  		xmlns:sld="http://www.opengis.net/sld"
      xmlns:owscat="http://www.ec.gc.ca/owscat"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml"/>
    <xsl:strip-space elements="*"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    
    <xsl:param name="version"/>
    <xsl:param name="serverUrl"/>
    <xsl:param name="serviceName"/>
    <xsl:param name="serverTitle"/>
    <xsl:param name="format"/>
    
    <!-- for selecting nodes from an WMS Capabilities document -->
    <xsl:template match="Layer">
      <wmc:Layer>
        <xsl:attribute name="queryable">0</xsl:attribute>
        <xsl:attribute name="hidden">0</xsl:attribute>
  			<wmc:Server>
          <xsl:attribute name="service"><xsl:value-of select="$serviceName"/></xsl:attribute>
          <xsl:attribute name="version"><xsl:value-of select="$version"/></xsl:attribute>
          <xsl:attribute name="title"><xsl:value-of select="$serverTitle"/></xsl:attribute>
  				<wmc:OnlineResource xlink:type="simple" xlink:href="{$serverUrl}"/>
  			</wmc:Server>
        <xsl:apply-templates select="child::node()"/>
        <wmc:FormatList>
          <wmc:Format current="1"><xsl:value-of select="$format"/></wmc:Format>
        </wmc:FormatList>
      </wmc:Layer>
    </xsl:template>
    
    <xsl:template match="Layer/Title">
      <wmc:Title><xsl:value-of select="."/></wmc:Title>
    </xsl:template>
    
    <xsl:template match="Layer/Name">
      <wmc:Name><xsl:value-of select="."/></wmc:Name>
    </xsl:template>
    
    <xsl:template match="Layer/Abstract">
      <wmc:Abstract><xsl:value-of select="."/></wmc:Abstract>
    </xsl:template>
    
    <xsl:template match="DataURL">
      <wmc:DataURL><xsl:value-of select="."/></wmc:DataURL>
    </xsl:template>
    
    <xsl:template match="MetadataURL">
      <wmc:MetadataURL><xsl:value-of select="."/></wmc:MetadataURL>
    </xsl:template>
    
    <xsl:template match="SRS">
      <wmc:SRS><xsl:value-of select="."/></wmc:SRS>
    </xsl:template>
  
    <!-- for selecting nodes from an OWSCat result set -->
    <xsl:template match="owscat:service_resources">
      <xsl:variable name="serverUrl"><xsl:value-of select="owscat:endpoint_getresource"/></xsl:variable>
      <wmc:Layer>
        <xsl:attribute name="queryable">0</xsl:attribute>
        <xsl:attribute name="hidden">0</xsl:attribute>
  			<wmc:Server>
          <xsl:attribute name="service"><xsl:value-of select="owscat:service_type"/></xsl:attribute>
          <xsl:attribute name="version"><xsl:value-of select="owscat:service_version"/></xsl:attribute>
          <xsl:attribute name="title"><xsl:value-of select="owscat:organization"/></xsl:attribute>
  				<wmc:OnlineResource xlink:type="simple" xlink:href="{$serverUrl}"/>
  			</wmc:Server>
        <xsl:apply-templates/>
      </wmc:Layer>
    </xsl:template>
    
    <xsl:template match="owscat:title">
      <wmc:Title><xsl:value-of select="."/></wmc:Title>
    </xsl:template>
    
    <xsl:template match="owscat:name">
      <wmc:Name><xsl:value-of select="."/></wmc:Name>
    </xsl:template>
    
    <xsl:template match="owscat:abstract">
      <wmc:Abstract><xsl:value-of select="."/></wmc:Abstract>
    </xsl:template>
    
    <xsl:template match="owscat:dataurl">
      <wmc:DataURL><xsl:value-of select="."/></wmc:DataURL>
    </xsl:template>
    
    <xsl:template match="owscat:metadataurl">
      <wmc:MetadataURL><xsl:value-of select="."/></wmc:MetadataURL>
    </xsl:template>
    
    <xsl:template match="owscat:srs">
      <wmc:SRS><xsl:value-of select="."/></wmc:SRS>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wms_GetFeatureInfo.xsl
  
  Index: wms_GetFeatureInfo.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: parses an OGC context document to generate a GetFeatureInfo url
  
  Author:      Nedjo
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  <xsl:stylesheet version="1.0" xmlns:cml="http://www.opengis.net/context" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml"/>
  
    <!--xsl:strip-space elements="*"/-->
  
  
  
    <!-- parameters to be passed into the XSL -->
  
    <!-- The name of the WMS GetFeatureInfo layer -->
  
    <xsl:param name="queryLayer"/>
  
    <xsl:param name="xCoord"/>
  
    <xsl:param name="yCoord"/>
  
    <xsl:param name="infoFormat" select="text/html"/>
  
    <xsl:param name="featureCount" select="1"/>
  
  
  
    <!-- Global variables -->
  
    <xsl:variable name="bbox">
  
      <xsl:value-of select="/cml:ViewContext/cml:General/cml:BoundingBox/@minx"/>,<xsl:value-of select="/cml:ViewContext/cml:General/cml:BoundingBox/@miny"/>,<xsl:value-of select="/cml:ViewContext/cml:General/cml:BoundingBox/@maxx"/>,<xsl:value-of select="/cml:ViewContext/cml:General/cml:BoundingBox/@maxy"/>
  
    </xsl:variable>
  
    <xsl:variable name="width">
  
      <xsl:value-of select="/cml:ViewContext/cml:General/cml:Window/@width"/>
  
    </xsl:variable>
  
    <xsl:variable name="height">
  
      <xsl:value-of select="/cml:ViewContext/cml:General/cml:Window/@height"/>
  
    </xsl:variable>
  
    <xsl:variable name="srs" select="/cml:ViewContext/cml:General/cml:BoundingBox/@SRS"/>
  
  
  
    <!-- Root template -->
  
    <xsl:template match="/">
  
      <xsl:apply-templates select="cml:ViewContext/cml:LayerList/cml:Layer[cml:Name=$queryLayer]"/>
  
    </xsl:template>
  
  
  
    <!-- Layer template -->
  
    <xsl:template match="cml:Layer">
  
  
  
      <!-- Layer variables -->
  
      <xsl:variable name="version">
  
        <xsl:value-of select="cml:Server/@version"/>    
  
      </xsl:variable>
  
      <xsl:variable name="baseUrl">
  
        <xsl:value-of select="cml:Server/cml:OnlineResource/@xlink:href"/>    
  
      </xsl:variable>
  
      <xsl:variable name="firstJoin">
  
        <xsl:choose>
  
          <xsl:when test="substring($baseUrl,string-length($baseUrl))='?'"></xsl:when>
  
          <xsl:when test="contains($baseUrl, '?')">&amp;</xsl:when> 
  
          <xsl:otherwise>?</xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <!-- Print the URL -->
  
      <url>
  
        <xsl:value-of select="$baseUrl"/><xsl:value-of select="$firstJoin"/>VERSION=<xsl:value-of select="$version"/>&amp;REQUEST=GetFeatureInfo&amp;SRS=<xsl:value-of select="$srs"/>&amp;BBOX=<xsl:value-of select="$bbox"/>&amp;WIDTH=<xsl:value-of select="$width"/>&amp;HEIGHT=<xsl:value-of select="$height"/>&amp;INFO_FORMAT=<xsl:value-of select="$infoFormat"/>&amp;FEATURE_COUNT=<xsl:value-of select="$featureCount"/>&amp;QUERY_LAYERS=<xsl:value-of select="$queryLayer"/>&amp;X=<xsl:value-of select="$xCoord"/>&amp;Y=<xsl:value-of select="$yCoord"/>
  
      </url>
  
    </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wms_GetMap.xsl
  
  Index: wms_GetMap.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  
  Description: transforms a WMS Layer node into an XML structure that contains
  
               the URL for the GetMap request for both context docs and WMS caps.
  
               This one is not used yet, because WMS caps don't use a namespace,
  
               use GteMap.xsl instead.
  
  Author:      adair
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
      xmlns:wmc="http://www.opengis.net/context" 
  
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
  
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
  
  
    <xsl:output method="xml"/>
  
    <xsl:strip-space elements="*"/>
  
    <!--
  
    <xsl:include href="ogcMapImgObjects.xsl" />
  
    -->
  
  
  
    <xsl:param name="bbox"/>
  
    <xsl:param name="width"/>
  
    <xsl:param name="height"/>
  
    <xsl:param name="srs"/>
  
    <xsl:param name="version"/>
  
    <xsl:param name="timeList"/>
  
    <xsl:param name="timeListName"/>
  
    
  
    <xsl:template match="Layer | wmc:Layer">
  
      
  
      <xsl:choose>
  
        <xsl:when test="$timeList and wmc:DimensionList/wmc:Dimension[@name='time']">
  
            <xsl:call-template name="tokenize">
  
              <xsl:with-param name="str" select="$timeList"/>
  
              <xsl:with-param name="sep" select="','"/>
  
            </xsl:call-template>
  
        </xsl:when>
  
        <xsl:otherwise>
  
          <xsl:call-template name="layerOutput"/>
  
        </xsl:otherwise>
  
      </xsl:choose>
  
      
  
    </xsl:template>
  
  
  
    <xsl:template name="layerOutput">
  
      <xsl:variable name="format">image/png</xsl:variable>
  
      <xsl:variable name="styleParam"/>
  
      <xsl:variable name="visibility"/>
  
      <xsl:variable name="mapRequest">
  
        <xsl:choose>
  
          <xsl:when test="starts-with($version, '1.0')">
  
              WMTVER=<xsl:value-of select="$version"/>&amp;REQUEST=map
  
          </xsl:when>            
  
          <xsl:otherwise>
  
              VERSION=<xsl:value-of select="$version"/>&amp;REQUEST=GetMap
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <GetMap>
  
        <mb:QueryString>
  
          <xsl:variable name="src">    
  
              <xsl:value-of select="$mapRequest"/>
  
     &amp;SRS=<xsl:value-of select="$srs"/>
  
    &amp;BBOX=<xsl:value-of select="$bbox"/>
  
   &amp;WIDTH=<xsl:value-of select="$width"/>
  
  &amp;HEIGHT=<xsl:value-of select="$height"/>
  
  &amp;LAYERS=<xsl:value-of select="Name"/>
  
  &amp;FORMAT=<xsl:value-of select="$format"/>
  
         &amp;<xsl:value-of select="$styleParam"/>
  
  &amp;TRANSPARENT=true
  
          <xsl:if test="$timestamp">
  
         &amp;TIME=<xsl:value-of select="$timestamp"/>
  
          </xsl:if>
  
  <!--	
  
    //TBD: these still to be properly handled 
  
    //also sld support
  
    if (this.transparent) src += '&' + 'TRANSPARENT=' + this.transparent;
  
  	if (this.bgcolor) src += '&' + 'BGCOLOR=' + this.bgcolor;
  
  	//if (this.exceptions) src += '&' + 'EXCEPTIONS=' + this.exceptions;
  
  	if (this.vendorstr) src += '&' + this.vendorstr;
  
    // -->
  
          </xsl:variable>
  
          <xsl:value-of select="translate(normalize-space($src),' ', '' )" disable-output-escaping="no"/>
  
        </mb:QueryString>
  
      </GetMap>
  
    </xsl:template>
  
    
  
    <xsl:template name="tokenize"> <!-- tokenize a string -->
  
     <xsl:param name="str"/> <!-- String to process -->
  
     <xsl:param name="sep"/> <!-- Legal separator character -->
  
     <xsl:choose>
  
      <xsl:when test="contains($str,$sep)"> <!-- Only tokenize if there is a separator present in the string -->
  
        <xsl:call-template name="process-token"> <!-- Process the token before the separator -->
  
          <xsl:with-param name="token" select="substring-before($str,$sep)"/>
  
        </xsl:call-template>
  
        <xsl:call-template name="tokenize">  <!-- Re-tokenize the new string which is contained after the separator -->
  
          <xsl:with-param name="str" select="substring-after($str,$sep)"/>
  
          <xsl:with-param name="sep" select="$sep"/> <!-- carriage return -->
  
        </xsl:call-template>
  
      </xsl:when>
  
      <xsl:otherwise>  <!-- If there is nothing else to tokenize, just treat the last part of the str as a regular token -->
  
        <xsl:call-template name="process-token">
  
          <xsl:with-param name="token" select="$str"/>
  
        </xsl:call-template>
  
      </xsl:otherwise>
  
     </xsl:choose>
  
    </xsl:template>
  
  
  
    <xsl:template name="process-token">  <!-- process - separate with <br> -->
  
      <xsl:param name="token"/> <!-- token to process -->
  
      <xsl:call-template name="layerOutput">
  
        <xsl:with-param name="timestamp" select="$token"/>
  
        <xsl:with-param name="visibility">hidden</xsl:with-param>
  
      </xsl:call-template>
  
    </xsl:template>
  
  
  
    <xsl:template match="wmc:Layer">
  
      <xsl:param name="version">
  
          <xsl:value-of select="wmc:Server/@version"/>    
  
      </xsl:param>
  
      <xsl:variable name="format">
  
        <xsl:choose>
  
          <xsl:when test="wmc:FormatList"><xsl:value-of select="wmc:FormatList/wmc:Format[@current='1']"/></xsl:when>
  
          <xsl:otherwise>image/gif</xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
      <xsl:variable name="styleParam">
  
        <xsl:choose>
  
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD">
  
            SLD=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:OnlineResource/@xlink:href"/>
  
          </xsl:when>
  
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:StyeLayerDescriptor">
  
            SLD=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:StyeLayerDescriptor"/>
  
          </xsl:when>
  
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:FeatureTypeStyle">
  
            SLD=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:FeatureTypeStyle"/>
  
          </xsl:when>
  
          <xsl:otherwise>
  
            STYLES=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:Name"/>
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
      <xsl:variable name="visibility">
  
        <xsl:choose>
  
          <xsl:when test="@hidden='1'">hidden</xsl:when>
  
          <xsl:otherwise>visible</xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
      <xsl:variable name="mapRequest">
  
        <xsl:choose>
  
          <xsl:when test="starts-with($version, '1.0')">
  
              WMTVER=<xsl:value-of select="$version"/>&amp;REQUEST=map
  
          </xsl:when>            
  
          <xsl:otherwise>
  
              VERSION=<xsl:value-of select="$version"/>&amp;REQUEST=GetMap
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <GetMap>
  
        <mb:QueryString>
  
          <xsl:variable name="src">    
  
              <xsl:value-of select="$mapRequest"/>
  
     &amp;SRS=<xsl:value-of select="$srs"/>
  
    &amp;BBOX=<xsl:value-of select="$bbox"/>
  
   &amp;WIDTH=<xsl:value-of select="$width"/>
  
  &amp;HEIGHT=<xsl:value-of select="$height"/>
  
  &amp;LAYERS=<xsl:value-of select="wmc:Name"/>
  
  &amp;FORMAT=<xsl:value-of select="$format"/>
  
         &amp;<xsl:value-of select="$styleParam"/>
  
  &amp;TRANSPARENT=true
  
          <xsl:if test="$timestamp">
  
         &amp;TIME=<xsl:value-of select="$timestamp"/>
  
          </xsl:if>
  
  <!--	
  
    //TBD: these still to be properly handled 
  
    //also sld support
  
    if (this.transparent) src += '&' + 'TRANSPARENT=' + this.transparent;
  
  	if (this.bgcolor) src += '&' + 'BGCOLOR=' + this.bgcolor;
  
  	//if (this.exceptions) src += '&' + 'EXCEPTIONS=' + this.exceptions;
  
  	if (this.vendorstr) src += '&' + this.vendorstr;
  
    // -->
  
          </xsl:variable>
  
          <xsl:value-of select="translate(normalize-space($src),' ', '' )" disable-output-escaping="no"/>
  
        </mb:QueryString>
  
      </GetMap>
  
    </xsl:template>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wps_DescribeProcess.xsl
  
  Index: wps_DescribeProcess.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: transforms a WFS FeatureType node to a DescribeFeatureType request
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wps="http://www.opengis.net/wps"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  		xmlns:ogc="http://www.opengis.net/ogc"
      xmlns:ows="http://www.opengis.net/ows"
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
  		xmlns:gml="http://www.opengis.net/gml"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <xsl:param name="httpMethod">get</xsl:param>
    <xsl:param name="version"/>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/wps:Capabilities/wps:ProcessOfferings">
      <DescribeProcess version="{$version}" service="WPS">
        <xsl:apply-templates select="wps:Process"/>
      </DescribeProcess>
    </xsl:template>
  
    <!-- template rule matching source root element -->
    <xsl:template match="wps:Process">
      <xsl:choose>
        <xsl:when test="$httpMethod='post'">
          <ProcessName><xsl:value-of select="wps:Name"/></ProcessName>
        </xsl:when>
        <xsl:otherwise>
          <mb:QueryString>
            <xsl:variable name="query">
        request=DescribeProcess
   &amp;service=WPS
   &amp;version=<xsl:value-of select="$version"/>
  &amp;ProcessName=<xsl:value-of select="wps:Name"/>
            </xsl:variable>
            <xsl:value-of select="translate(normalize-space($query),' ', '' )" disable-output-escaping="no"/>
          </mb:QueryString>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/tool/xsl/wps_Execute.xsl
  
  Index: wps_Execute.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: geberates an HTTP payload to execute a WPS request
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wps="http://www.opengis.net/wps"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  		xmlns:ogc="http://www.opengis.net/ogc"
      xmlns:ows="http://www.opengis.net/ows"
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
  		xmlns:gml="http://www.opengis.net/gml"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <xsl:param name="httpMethod">get</xsl:param>
    <xsl:param name="version"/>
    <xsl:param name="processName"/>
    <xsl:param name="store">false</xsl:param>
    
    <!-- template rule matching source root element -->
    <xsl:template match="wps:Process">
      <wps:Execute version="{$version}" service="WPS">
        <xsl:attribute name="store"><xsl:value-of select="$store"/></xsl:attribute>
        <xsl:choose>
          <xsl:when test="$httpMethod='post'">
          	<wps:ProcessName><xsl:value-of select="$processName"/></wps:ProcessName>
          </xsl:when>
          <xsl:otherwise>
            <mb:QueryString>
              <xsl:variable name="query">
          request=Execute
     &amp;service=WPS
     &amp;version=<xsl:value-of select="$version"/>
    &amp;ProcessName=<xsl:value-of select="wps:Name"/>
                <xsl:apply-templates select="wps:Input"/>
              </xsl:variable>
              <xsl:value-of select="translate(normalize-space($query),' ', '' )" disable-output-escaping="no"/>
            </mb:QueryString>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:apply-templates select="wps:Output"/>
      </wps:Execute>
    </xsl:template>
        
    <xsl:template match="wps:Output/wps:Parameter">
      &amp;<xsl:value-of select="wps:Name"/>=<xsl:apply-templates select="wps:Datatype"/>
    </xsl:template>
  
    <xsl:template match="wps:Input/wps:Parameter">
      &amp;<xsl:value-of select="wps:Name"/>=<xsl:apply-templates select="wps:Datatype"/>
    </xsl:template>
  
    <xsl:template match="wps:Datatype/wps:Reference">
      <xsl:value-of select="@xlink:href"/>
    </xsl:template>
  
    <xsl:template match="wps:Datatype/wps:LiteralValue">
      <xsl:value-of select="."/>
    </xsl:template>
  
    <xsl:template match="wps:Datatype/wps:ComplexValue">
      <xsl:value-of select="."/>
    </xsl:template>
  
    <xsl:template match="wps:Datatype/wps:BoundingBox">
      <xsl:value-of select="."/>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/Listener.js
  
  Index: Listener.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Base Listener class that is instanciated by all objects which provide
   * event listeners.
   * @constructor
   * @author Cameron Shorter
   */
  function Listener() {
    /** An array [params] of (listener, target). */
    this.listeners=new Array();
  
    /**
     * An array [params] of values. These values might not be used if the set/get
     * functions are overwritten.
     */
    this.values=new Array();
  
    /**
     * Add a listener function which will be called when param is updated;  The
     * listener function should usually be: paint(target).
     * @param listener The function to call when the parameter changes.
     * @param target The object which owns the listener function.
     * @param param Parameter name; if this parameter changes then an event is
     * sent to all interested listeners.
     */
    this.addListener=function(param, listener, target) {
      if (window.logger) logger.logEvent("addListener: "+param,this.id,target.id);
      if(!this.listeners[param]){
        this.listeners[param]=new Array();
      }
      this.removeListener(param,listener,target);
      //for(var i=0;i<this.listeners[param].length;i++){
      //  if(this.listeners[param][i][0]==listener && this.listeners[param][i][1]==target){
      //    return;
      //    alert("Listener.addListener again: target="+target.id);
      //  }
      //}
      this.listeners[param].push(new Array(listener,target));
    }
  
    /**
     * Add a listener function at the start of the list.  
     * @param listener The function to call when the parameter changes.
     * @param target The object which owns the listener function.
     * @param param Parameter name; if this parameter changes then an event is
     * sent to all interested listeners.
     */
    this.addFirstListener=function(param, listener, target) {
      if (window.logger) logger.logEvent("addFirstListener: "+param,this.id,target.id);
      if(!this.listeners[param]){
        this.listeners[param]=new Array();
      }
      this.removeListener(param,listener,target);
      this.listeners[param].unshift(new Array(listener,target));
    }
  
    /**
     * Remove a listener so that it is not called anymore when a param changes.
     * @param listener The function to call when the parameter changes.
     * @param target The object which owns the listener function.
     * @param param Parameter name; if this parameter changes then an event is
     * sent to all interested listeners.
     */
    this.removeListener=function(param,listener,target){
      if(this.listeners[param]){
        for(var i=0;i<this.listeners[param].length;i++){
          if(this.listeners[param][i][0]==listener && this.listeners[param][i][1]==target){
            for(var j=i;j<this.listeners[param].length-1;j++){
              this.listeners[param][j]=this.listeners[param][j+1];
            }
            this.listeners[param].pop();
            return;
          }
        }
      }
    }
  
    /**
     * Call all the listeners that have registered interest in this parameter
     * using addListener.
     * @param param The parameter that has changed.
     * @param value The new parameter value.
     */
    this.callListeners=function(param,value) {
      if (this.listeners[param]){
        var count = this.listeners[param].length;
        for(var i=0;i<count;i++){
          if (window.logger) logger.logEvent(param,this.id,this.listeners[param][i][1].id,value);
          //this is listenerFunction(target,value)
          if (this.listeners[param][i][0]) {
            this.listeners[param][i][0](this.listeners[param][i][1],value);
          } else {
            alert("Listener error: param="+param+", target="+this.listeners[param][i][1].id+", callBackFunction="+this.listeners[param][i][0]);
          }
        }
      }
    }
  
    /**
     * Update parameter and call all interested listeners.  This function may
     * be overloaded to store the parameter in a elsewhere (eg in an XML
     * document).
     * @param param The parameter to change.
     * @parma value The new value of the param.
     */
    this.setParam=function(param,value) {
      this.values[param] = value;
  
      // Call all the interested listeners
      this.callListeners(param,value);
    }
  
    /**
     * Return the param value, or return null if it does not exist.  This
     * function may be overloaded to store the param elsewhere (eg in
     * an XML document).
     * @param param The parameter to get.
     * @return The value of the param.
     */
    this.getParam=function(param) {
      return this.values[param];
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/MGRS.js
  
  Index: MGRS.js
  ===================================================================
  /*
  Author:       Patrice G. Cappelaere (Got library from somewhere but cant remember where as it got translated several times)
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  
  function MGRS() {
  	 /**
       * UTM zones are grouped, and assigned to one of a group of 6
       * sets.
       */
      var NUM_100K_SETS = 6;
  
      /**
       * The column letters (for easting) of the lower left value, per
       * set.
       */
      var SET_ORIGIN_COLUMN_LETTERS = new Array('A','J','S','A','J','S');
  
      /**
       * The row letters (for northing) of the lower left value, per
       * set.
       */
     var SET_ORIGIN_ROW_LETTERS = new Array('A','F','A','F','A','F');
  
      /**
       * The column letters (for easting) of the lower left value, per
       * set,, for Bessel Ellipsoid.
       */
      var BESSEL_SET_ORIGIN_COLUMN_LETTERS = new Array( 'A', 'J',  'S', 'A', 'J', 'S' );
  
      /**
       * The row letters (for northing) of the lower left value, per
       * set, for Bessel Ellipsoid.
       */
      var BESSEL_SET_ORIGIN_ROW_LETTERS = new Array( 'L', 'R', 'L', 'R', 'L', 'R' );
      var SET_NORTHING_ROLLOVER = 20000000;
  
      /**
       * Use 5 digits for northing and easting values, for 1 meter
       * accuracy of coordinate.
       */
  
      var ACCURACY_1_METER = 5;
  
      /**
       * Use 4 digits for northing and easting values, for 10 meter
       * accuracy of coordinate.
       */
      var ACCURACY_10_METER = 4;
  
      /**
       * Use 3 digits for northing and easting values, for 100 meter
       * accuracy of coordinate.
       */
      var ACCURACY_100_METER = 3;
  
      /**
       * Use 2 digits for northing and easting values, for 1000 meter
       * accuracy of coordinate.
       */
  
      var ACCURACY_1000_METER = 2;
      /**
       * Use 1 digits for northing and easting values, for 10000 meter
       * accuracy of coordinate.
       */
      var ACCURACY_10000_METER = 1;
  
      /** The set origin column letters to use. */
      var originColumnLetters = SET_ORIGIN_COLUMN_LETTERS;
  
      /** The set origin row letters to use. */
      var originRowLetters = SET_ORIGIN_ROW_LETTERS;
  
      var A = 65;	//AsciiToNum('A');
      var I = 73;	//AsciiToNum('I');
      var O = 79;	//AsciiToNum('O');
      var V = 86;	//AsciiToNum('V');
      var Z = 90;	//AsciiToNum('Z');
  
      var DEBUG = false;
  
      /** The String holding the MGRS coordinate value. */
      var  mgrs_;
  	  var lat_;
      var lon_;
      var radlat_ ;
      var radlon_ ;
  
   		var northing_;
      var easting_;
      var zone_number_;
      var zone_letter_;
      
  		/**
  		  * Conversion of lat/lon to MGRS
  		  */
  		this.convert = function(latitude, longitude) {
        lat_    = parseFloat(latitude);
  		  lon_    = parseFloat(longitude);
  		  radlat_ = degToRad(lat_);
        radlon_ = degToRad(lon_);
  
  		  LLtoUTM();
  		  return formatMGRS();
  	  }
  
      function degToRad(deg) {
          return (deg * (Math.PI / 180.0));
      }
      
  	 /**
       * Converts a set of Longitude and Latitude co-ordinates to UTM
       * given an ellipsoid
       * 
       * @param ellip an ellipsoid definition.
       * @param llpoint the coordinate to be converted
       * @param utmpoint A UTMPoint instance to put the results in. If
       *        null, a new UTMPoint will be allocated.
       * @return A UTM class instance containing the value of
       *         <code>null</code> if conversion failed. If you pass
       *         in a UTMPoint, it will be returned as well if
       *         successful.
       */
     function LLtoUTM() {
          var Lat = lat_;
          var Long = lon_;
          var a = 6378137.0;	//ellip.radius;
          var eccSquared = 0.00669438;	//ellip.eccsq;
          var k0 = 0.9996;
          var LongOrigin;
          var eccPrimeSquared;
          var N, T, C, A, M;
          var LatRad = radlat_;
          var LongRad = radlon_;
          var LongOriginRad;
          var ZoneNumber;
  		// (int)
          ZoneNumber = Math.floor((Long + 180) / 6) + 1;
  
          //Make sure the longitude 180.00 is in Zone 60
          if (Long == 180) {
              ZoneNumber = 60;
          }
  
          // Special zone for Norway
          if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) {
              ZoneNumber = 32;
          }
  
          // Special zones for Svalbard
          if (Lat >= 72.0 && Lat < 84.0) {
              if (Long >= 0.0 && Long < 9.0)
                  ZoneNumber = 31;
              else if (Long >= 9.0 && Long < 21.0)
                  ZoneNumber = 33;
              else if (Long >= 21.0 && Long < 33.0)
                  ZoneNumber = 35;
              else if (Long >= 33.0 && Long < 42.0)
                  ZoneNumber = 37;
          }
  
          LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin
                                                       // in middle of
                                                       // zone
          LongOriginRad = degToRad(LongOrigin);
  
          eccPrimeSquared = (eccSquared) / (1 - eccSquared);
  
          N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));
          T = Math.tan(LatRad) * Math.tan(LatRad);
          C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);
          A = Math.cos(LatRad) * (LongRad - LongOriginRad);
  
          M = a
                  * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5
                          * eccSquared * eccSquared * eccSquared / 256)
                          * LatRad
                          - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared
                                  / 32 + 45 * eccSquared * eccSquared
                                  * eccSquared / 1024)
                          * Math.sin(2 * LatRad)
                          + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared
                                  * eccSquared * eccSquared / 1024)
                          * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared
                          * eccSquared / 3072)
                          * Math.sin(6 * LatRad));
  
          var UTMEasting = (k0
                  * N
                  * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T
                          + 72 * C - 58 * eccPrimeSquared)
                          * A * A * A * A * A / 120.0) + 500000.0);
  
          var UTMNorthing =  (k0 * (M + N
                  * Math.tan(LatRad)
                  * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A
                          / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared)
                          * A * A * A * A * A * A / 720.0)));
          if (Lat < 0.0) {
              UTMNorthing += 10000000.0; //10000000 meter offset for
                                          // southern hemisphere
          }
  
          northing_ = Math.round(UTMNorthing);
          easting_ =  Math.round(UTMEasting);
          zone_number_ = ZoneNumber;
          zone_letter_ = getLetterDesignator(Lat);
      }
      
  	function getLetterDesignator(lat) {
          //This is here as an error flag to show that the Latitude is
          //outside MGRS limits
          var LetterDesignator = 'Z';
  
          if ((84 >= lat) && (lat >= 72))
              LetterDesignator = 'X';
          else if ((72 > lat) && (lat >= 64))
              LetterDesignator = 'W';
          else if ((64 > lat) && (lat >= 56))
              LetterDesignator = 'V';
          else if ((56 > lat) && (lat >= 48))
              LetterDesignator = 'U';
          else if ((48 > lat) && (lat >= 40))
              LetterDesignator = 'T';
          else if ((40 > lat) && (lat >= 32))
              LetterDesignator = 'S';
          else if ((32 > lat) && (lat >= 24))
              LetterDesignator = 'R';
          else if ((24 > lat) && (lat >= 16))
              LetterDesignator = 'Q';
          else if ((16 > lat) && (lat >= 8))
              LetterDesignator = 'P';
          else if ((8 > lat) && (lat >= 0))
              LetterDesignator = 'N';
          else if ((0 > lat) && (lat >= -8))
              LetterDesignator = 'M';
          else if ((-8 > lat) && (lat >= -16))
              LetterDesignator = 'L';
          else if ((-16 > lat) && (lat >= -24))
              LetterDesignator = 'K';
          else if ((-24 > lat) && (lat >= -32))
              LetterDesignator = 'J';
          else if ((-32 > lat) && (lat >= -40))
              LetterDesignator = 'H';
          else if ((-40 > lat) && (lat >= -48))
              LetterDesignator = 'G';
          else if ((-48 > lat) && (lat >= -56))
              LetterDesignator = 'F';
          else if ((-56 > lat) && (lat >= -64))
              LetterDesignator = 'E';
          else if ((-64 > lat) && (lat >= -72))
              LetterDesignator = 'D';
          else if ((-72 > lat) && (lat >= -80))
              LetterDesignator = 'C';
          return LetterDesignator;
      }
  
  	 function formatMGRS() {
  		 var seasting = "" + easting_;
  		 var snorthing = ""+ northing_;
  		 while( snorthing.length > 6 )
  			 snorthing = snorthing.substr(1,snorthing.length-1);
  
  		 var str= zone_number_ + "" + zone_letter_ +
         get100kID(easting_, northing_, zone_number_) +
  			 seasting.substr(1,4) + snorthing.substr(1,4);
  
  		  return str;
  	  }
  	
  	   /**
       * Get the two letter 100k designator for a given UTM easting,
       * northing and zone number value.
       */
      function get100kID( easting, northing, zone_number) {
          var setParm = get100kSetForZone(zone_number);
          var setColumn = Math.floor( easting / 100000);
          var setRow = Math.floor( northing  / 100000) % 20;
  		//trace("get100kID:"+setParm+" "+setColumn+" "+setRow);
          return getLetter100kID(setColumn, setRow, setParm);
      }
  
  	 /**
       * Given a UTM zone number, figure out the MGRS 100K set it is in.
       */
      function get100kSetForZone(i) {
          var setParm = i % NUM_100K_SETS;
          if (setParm == 0)
              setParm = NUM_100K_SETS;
  		
          return setParm;
      }
      
     /**
       * Get the two-letter MGRS 100k designator given information
       * translated from the UTM northing, easting and zone number.
       * 
       * @param setColumn the column index as it relates to the MGRS
       *        100k set spreadsheet, created from the UTM easting.
       *        Values are 1-8.
       * @param setRow the row index as it relates to the MGRS 100k set
       *        spreadsheet, created from the UTM northing value. Values
       *        are from 0-19.
       * @param setParm the set block, as it relates to the MGRS 100k set
       *        spreadsheet, created from the UTM zone. Values are from
       *        1-60.
       * @return two letter MGRS 100k code.
       */
  
      function getLetter100kID( column, row, parm) {
  		    // colOrigin and rowOrigin are the letters at the origin of the set
  		    var index = parm-1;
          var colOrigin = AsciiToNum(SET_ORIGIN_COLUMN_LETTERS[index]);
          var rowOrigin = AsciiToNum(SET_ORIGIN_ROW_LETTERS[index]);
  
          // colInt and rowInt are the letters to build to return
          var colInt = colOrigin + column - 1;
          var rowInt = rowOrigin + row;
          var rollover = false;
  
  		    if ( colInt > Z ) {
              colInt = colInt - Z + A - 1;
              rollover = true;
          }
  
  		    if (colInt == I || (colOrigin < I && colInt > I)
                  || ((colInt > I || colOrigin < I) && rollover)) {
              colInt++;
          }
  
  		    if (colInt == O || (colOrigin < O && colInt > O)
                  || ((colInt > O || colOrigin < O) && rollover)) {
              colInt++;
  
              if (colInt == I) {
                  colInt++;
               }
          }
  
  	  	   if (colInt > Z) {
              colInt = colInt - Z + A - 1;
          }
  
          if (rowInt > V) {
              rowInt = rowInt - V + A - 1;
              rollover = true;
          } else {
              rollover = false;
          }
  
          if( ((rowInt == I) || ((rowOrigin < I) && (rowInt > I)))
                  || (((rowInt > I)||(rowOrigin < I)) && rollover)) {
              rowInt++;
          }
  
          if( ((rowInt == O) || ((rowOrigin < O) && (rowInt > O)))
                  || (((rowInt > O)|| (rowOrigin < O)) && rollover)) {
              rowInt++;
  
              if (rowInt == I) {
                  rowInt++;
              }
          }
  
          if (rowInt > V) {
              rowInt = rowInt - V + A - 1;
          }
  
          var twoLetter = NumToAscii(colInt) + "" + NumToAscii(rowInt);
          return twoLetter;
  	}
  
  
  	function AsciiToNum( ascii ) {
  		switch( ascii ) {
  			case 'A':
  				return 65;
  			case 'B':
  				return 66;
  			case 'C':
  				return 67;
  			case 'D':
  				return 68;
  			case 'E':
  				return 69;
  			case 'F':
  				return 70;
  			case 'G':
  				return 71;
  			case 'H':
  				return 72;
  			case 'I':
  				return 73;
  			case 'J':
  				return 74;
  			case 'K':
  				return 75;
  			case 'L':
  				return 76;
  			case 'M':
  				return 77;
  			case 'N':
  				return 78;
  			case 'O':
  				return 79;
  			case 'P':
  				return 80;
  			case 'Q':
  				return 81;
  			case 'R':
  				return 82;
  			case 'S':
  				return 83;
  			case 'T':
  				return 84;
  			case 'U':
  				return 85;
  			case 'V':
  				return 86;
  			case 'W':
  				return 87;
  			case 'X':
  				return 88;
  			case 'Y':
  				return 89;
  			case 'Z':
  				return 90;
  		}
  	}
  	
  	function NumToAscii( num ) {
  		switch( num ) {
  			case 65:
  				return 'A';
  			case 66:
  				return 'B';
  			case 67:
  				return 'C';
  			case 68:
  				return 'D';
  			case 69:
  				return 'E';
  			case 70:
  				return 'F';
  			case 71:
  				return 'G';
  			case 72:
  				return 'H';
  			case 73:
  				return 'I';
  			case 74:
  				return  'J';
  			case 75 :
  				return 'K';
  			case 76:
  				return 'L';
  			case 77:
  				return 'M';
  			case 78:
  				return 'N';
  			case 79:
  				return 'O';
  			case 80:
  				return 'P';
  			case 81:
  				return 'Q';
  			case 82:
  				return 'R';
  			case 83:
  				return 'S';
  			case 84:
  				return 'T';
  			case 85:
  				return 'U';
  			case 86:
  				return 'V';
  			case 87:
  				return 'W';
  			case 88:
  				return 'X';
  			case 89:
  				return 'Y';
  			case 90:
  				return 'Z';
  		}
  	}
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/Util.js
  
  Index: Util.js
  ===================================================================
  /*
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  Dependancies: Sarissa
  
  $Id$
  */
  
  // some basic browser detection
  var MB_IS_MOZ = (document.implementation && document.implementation.createDocument)?true:false;
  
  /**
  Transform an XML document using the provided XSL and use the results to build
  a web page.
  @constructor
  @param xslUrl The URL of an XSL stylesheet.
  @author Cameron Shorter - Cameron AT Shorter.net
  */
  function XslProcessor(xslUrl,docNSUri) {
    // get the stylesheet document
    this.xslUrl=xslUrl;
    this.xslDom = Sarissa.getDomDocument();
    this.xslDom.async = false;
    this.xslDom.validateOnParse=false;  //IE6 SP2 parsing bug
    this.xslDom.load(xslUrl);
    if ( this.xslDom.parseError < 0 )
      alert("error loading XSL stylesheet: " + xslUrl);
  
    this.processor = new XSLTProcessor();
    this.processor.importStylesheet(this.xslDom);
  
    this.docNSUri = docNSUri;
  
    /**
     * Transforms XML in the provided xml node according to this XSL.
     * @param xmlNode The XML node to be transformed.
     * @return The transformed String.
     */
    this.transformNodeToString = function(xmlNode) {
      try {
        // transform and build a web page with result
        var newDoc = this.transformNodeToObject(xmlNode);
        var s = Sarissa.serialize(newDoc);
        return Sarissa.unescape(s);
      } catch(e){
        alert("Exception transforming doc with XSL: " + this.xslUrl);
        alert("XSL="+Sarissa.serialize(this.xslDom));
        alert("XML="+Sarissa.serialize(xmlNode));
      }
    }
  
    /**
     * Transforms XML in the provided xml node according to this XSL.
     * @param xmlNode The XML node to be transformed.
     * @return a DOM document object
     */
    this.transformNodeToObject=function(xmlNode) {
      var newFragment = this.processor.transformToDocument(xmlNode);
      return newFragment;
    }
  
    /**
     * Set XSL parameter.
     */
    this.setParameter=function(paramName, paramValue, nsUri) {
      //if ( typeof paramValue == "string" || typeof paramValue == "number") paramValue="'"+paramValue+"'";
      if (!paramValue) {
        //alert("null value for stylesheet param:"+paramName+":"+paramValue);
        return;
      }
      this.processor.setParameter( null, paramName, paramValue);
    }
  }
  
  /**
   * A more flexible interface for loading docs that allows POST and async loading
   */
  function postLoad(sUri, docToSend, contentType ) {
     var xmlHttp = new XMLHttpRequest();
     if ( sUri.indexOf("http://")==0 ) {
       xmlHttp.open("POST", config.proxyUrl, false);
       xmlHttp.setRequestHeader("serverUrl",sUri);//escape(sUri).replace(/\+/g, '%2C').replace(/\"/g,'%22').replace(/\'/g, '%27'));
     } else {
       xmlHttp.open("POST", sUri, false);
     }
     xmlHttp.setRequestHeader("content-type","text/xml");
     if (contentType) xmlHttp.setRequestHeader("content-type",contentType);
     //alert("sending:"+docToSend.xml);
     xmlHttp.send( docToSend );
  /*
     if (_SARISSA_IS_IE) {
  alert("before");
      xmlHttp.status = xmlHttp.Status;
  alert("after");
      xmlHttp.statusText = xmlHttp.StatusText;
      xmlHttp.responseText = xmlHttp.ResponseText;
     }
  */
     if (xmlHttp.status >= 400) {   //http errors status start at 400
        alert("error loading document: " + sUri + " - " + xmlHttp.statusText + "-" + xmlHttp.responseText );
        var outDoc = Sarissa.getDomDocument();
        outDoc.parseError = -1;
        return outDoc;
     } else {
       //alert(xmlHttp.getResponseHeader("Content-Type"));
       if ( null==xmlHttp.responseXML ) alert( "null XML response:" + xmlHttp.responseText );
       return xmlHttp.responseXML;
     }
  }
  
    /**
     * If URL is local, then return URL unchanged,
     * else return URL of http://proxy?url=URL , or null if proxy not defined.
     * @param url Url of the file to access.
     * @return Url of the proxy and service in the form http://host/proxy?url=service
     */
  function getProxyPlusUrl(url) {
    if ( url.indexOf("http://")==0 ) {
      if ( config.proxyUrl ) {
        url=config.proxyUrl+"?url="+escape(url).replace(/\+/g, '%2C').replace(/\"/g,'%22').replace(/\'/g, '%27');
      } else {
        alert("unable to load external document:"+url+"  Set the proxyUrl property in config.");
        url=null;
      }
    }
    return url;
  }
  
    /**
     * Browser independant version of createElementNS() because creating elements
     * with namespaces other than the defalut namespace isn't dupported in IE,
     * or at least I can't figure out how to do it.  
     * Caution: In IE the new element doesn't appear to a namespace!!
     * @param doc the owner document for the new element
     * @param name the name for the new element
     * @param ns the URL for the namespace (without a prefix)
     * @return element in the document with the specified namespace
     */
  function createElementWithNS(doc,name,nsUri) {
    if (_SARISSA_IS_IE) {
      var newElement = doc.createElement(name);
      //newElement.namespaceURI = nsUri;  //can't do this for some reason?
      return newElement;
    } else {
      return doc.createElementNS(nsUri,name);
    }
  }
  
  /**
   * Create a unique Id which can be used for classes to link themselves to HTML
   * Ids.
   * @constructor
   */
  function UniqueId(){
    this.lastId=0;
  
    /** Return a numeric unique Id. */
    this.getId=function() {
      this.lastId++;
      return this.lastId;
    }
  }
  //use this global object to generate a unique ID via the getId function
  var mbIds = new UniqueId();
  
  function setISODate(isoDateStr) {
    var parts = isoDateStr.match(/(\d{4})-?(\d{2})?-?(\d{2})?T?(\d{2})?:?(\d{2})?:?(\d{2})?\.?(\d{0,3})?(Z)?/);
    var res = null;
    for (var i=1;i<parts.length;++i){
      if (!parts[i]) {
        parts[i] = (i==3)?1:0; //months start with day number 1, not 0
        if (!res) res = i;
      }
    }
    var isoDate = new Date();
    isoDate.setFullYear(parseInt(parts[1],10));
    isoDate.setMonth(parseInt(parts[2]-1,10));
    isoDate.setDate(parseInt(parts[3],10));
    isoDate.setHours(parseInt(parts[4],10));
    isoDate.setMinutes(parseInt(parts[5],10));
    isoDate.setSeconds(parseFloat(parts[6],10));
    if (!res) res = 6;
    isoDate.res = res;
    return isoDate;
  }
  
  function getISODate(isoDate) {
    var res = isoDate.res?isoDate.res:6;
    var dateStr = "";
    dateStr += res>1?isoDate.getFullYear():"";
    dateStr += res>2?"-"+leadingZeros(isoDate.getMonth()+1,2):"";
    dateStr += res>3?"-"+leadingZeros(isoDate.getDate(),2):"";
    dateStr += res>4?"T"+leadingZeros(isoDate.getHours(),2):"";
    dateStr += res>5?":"+leadingZeros(isoDate.getMinutes(),2):"";
    dateStr += res>6?":"+leadingZeros(isoDate.getSeconds(),2):"";
    return dateStr;
  }
  
  function leadingZeros(num,digits) {
    var intNum = parseInt(num,10);
    var base = Math.pow(10,digits);
    if (intNum<base) intNum += base;
    return intNum.toString().substr(1);
  }
  
  
  // Correctly handle PNG transparency in Win IE 5.5 or higher.
  // this method should be set as an IMG onload handler for PNG map layers
  // thanks to Caroklyn Cole for this fix.  For an explanation see:
  // http://homepage.ntlworld.com/bobosola. Updated 02-March-2004
  // modified to the images as visible after this has been called.
  function fixPNG(myImage,myId) {
    if (_SARISSA_IS_IE) {
      var imgID = "id='" + myId + "' ";
      var imgClass = (myImage.className) ? "class='" + myImage.className + "' " : ""
      var imgTitle = (myImage.title) ? "title='" + myImage.title + "' " : "title='" + myImage.alt + "' "
      var imgStyle = "display:inline-block;" + myImage.style.cssText 
      var strNewHTML = "<span " + imgID + imgClass + imgTitle
      strNewHTML += " style=\"" + "width:" + myImage.width + "px; height:" + myImage.height + "px;" + imgStyle + ";"
      // Escape some chars (don't use encode() that would escape %xx previously used in XSL)
      var src = myImage.src;
      src = src.replace(/\(/g,'%28');
      src = src.replace(/\)/g,'%29');
      src = src.replace(/'/g,'%27');
      // AlphaImageLoader converts '%23' in src to '#' and cuts URL on '#'
      src = src.replace(/%23/g,'%2523');
      strNewHTML += "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader";
      strNewHTML += "(src=\'" + src + "\', sizingMethod='scale'); \"></span>" ;
      //myImage.outerHTML = strNewHTML;
      //alert(strNewHTML);
      return strNewHTML;
    }
  }
  
  
  
  /**
   * get the absolute position of HTML element NS4, IE4/5 & NS6, even if it's in a table.
   * @param element The HTML element.
   * @return Top left X position.
   */
  function getAbsX(elt) {
          return (elt.x) ? elt.x : getAbsPos(elt,"Left") + 2;
  }
  
  /**
   * get the absolute position of HTML element NS4, IE4/5 & NS6, even if it's in a table.
   * @param element The HTML element.
   * @return Top left Y position.
   */
  function getAbsY(elt) {
          return (elt.y) ? elt.y : getAbsPos(elt,"Top") + 2;
  }
  
  /**
   * TBD: Comment me.
   * @param elt TBD
   * @param which TBD
   */
  function getAbsPos(elt,which) {
   iPos = 0;
   while (elt != null) {
          iPos += elt["offset" + which];
          elt = elt.offsetParent;
   }
   return iPos;
  }
  
  /**
   * get the absolute position of a user event (e.g., a mousedown).
   * @param e The user event.
   * @return Left or top position.
   */
  function getPageX(e){
    var posx = 0;
    if (!e) var e = window.event;
    if (e.pageX) {
      posx = e.pageX;
    }
    else if (e.clientX) {
     posx = e.clientX;
    }
    if (document.body && document.body.scrollLeft){
      posx += document.body.scrollLeft;
    }
    else if (document.documentElement && document.documentElement.scrollLeft){
      posx += document.documentElement.scrollLeft;
    }
    return posx;
  }
  
  /**
   * get the absolute position of a user event (e.g., a mousedown).
   * @param e The user event.
   * @return Left or top position.
   */
  function getPageY(e){
    var posy = 0;
    if (!e) var e = window.event;
    if (e.pageY) {
      posy = e.pageY;
    }
    else if (e.clientY) {
      posy = e.clientY;
    }
    if (document.body && document.body.scrollTop){
      posy += document.body.scrollTop;
    }
    else if (document.documentElement && document.documentElement.scrollTop){
      posy += document.documentElement.scrollTop;
    }
    return posy;
  }
  
  /**
   * parse comma-separated name=value argument pairs from the query string of the URL; the function stores name=value pairs in properties of an object and returns that object. 
   * @return args Array of arguments passed to page, in form args[argname] = value.
   */
  function getArgs(){
    var args = new Object();
    var query = location.search.substring(1);
    var pairs = query.split("&");
    for(var i = 0; i < pairs.length; i++) {
      var pos = pairs[i].indexOf('=');
      if (pos == -1) continue;
      var argname = pairs[i].substring(0,pos);
      var value = pairs[i].substring(pos+1);
      args[argname] = unescape(value.replace(/\+/g, " "));
    }
    return args;
  }
  //initialize the array once
  window.cgiArgs = getArgs();
  
  /**
   * convert geographic x coordinate to screen coordinate.
   * @param context The context object.
   * @param xCoord The geographic x coordinate to be converted.
   * @return x the converted x coordinate.
   */
  function getScreenX(context, xCoord){
    bbox=context.getBoundingBox();
    width=context.getWindowWidth();
    bbox[0]=parseFloat(bbox[0]);
    bbox[2]=parseFloat(bbox[2]);
    var xfac = (width/(bbox[2]-bbox[0]));
    x=xfac*(xCoord-bbox[0]);
    return x;
  }
  
  /**
   * convert geographic y coordinate to screen coordinate.
   * @param context The context object.
   * @param yCoord The geographic x coordinate to be converted.
   * @return y the converted x coordinate.
   */
  function getScreenY(context, yCoord){
    var bbox=context.getBoundingBox();
    var height=context.getWindowHeight();
    bbox[1]=parseFloat(bbox[1]);
    bbox[3]=parseFloat(bbox[3]);
    var yfac = (heighteight/(bbox[3]-bbox[1]));
    var y=height-(yfac*(pt.y-bbox[1]));
    return y;
  }
  
  /**
   * convert screen x coordinate to geographic coordinate.
   * @param context The context object.
   * @param xCoord The screen x coordinate to be converted.
   * @return x the converted x coordinate.
   */
  function getGeoCoordX(context, xCooord) {
    var bbox=context.getBoundingBox();
    var width=context.getWindowWidth();
    bbox[0]=parseFloat(bbox[0]);
    bbox[2]=parseFloat(bbox[2]);
    var xfac = ((bbox[2]-bbox[0]) / width);
    var x=bbox[0] + xfac*(xCoord);
    return x;
  }
  
  /**
   * convert screen coordinate to screen coordinate.
   * @param context The context object.
   * @param yCoord The geographic y coordinate to be converted.
   * @return y the converted y coordinate.
   */
  function getGeoCoordY(yCoord){
    var bbox=context.getBoundingBox();
    var height=context.getWindowHeight();
    bbox[1]=parseFloat(bbox[1]);
    bbox[3]=parseFloat(bbox[3]);
    var yfac = ((bbox[3]-bbox[1]) / height);
    var y=bbox[1] + yfac*(height-yCoord);
    return y;
  }
  
  /**
   * create an element and append it to the document body element.
   * @param type The type of element to be created.
   * @return node The node created and appended.
   */
  function makeElt(type) {
    var node=document.createElement(type);
    document.getElementsByTagName("body").item(0).appendChild(node);
    return node;
  }
  
  // variable needed to determine if a popup window is currently open
  var newWindow = '';
  /**
   * open a popup window, adapted from http://www.quirksmode.org/js/croswin.html
   * @param url The url of the page to be opened.
   * @param width Width of the popup window, in pixels.
   * @param height Height of the popup window, in pixels.
   */
  function openPopup(url, width, height) {
    if(width == null) {
      width = 300;
    }
    if(height == null) {
      height = 200;
    }
    if (!newWindow.closed && newWindow.location) {
      newWindow.location.href = url;
    }
    else {
      newWindow=window.open(url,'name','height=' + height + ',width=' + width);
      if (!newWindow.opener) newwindow.opener = self;
    }
    if (window.focus) {newWindow.focus()}
    return false;
  }
  
  /**
   * write debugging info to a textbox onscreen.
   * @param output String to be output.
   */
  function debug(output){
    tarea=makeElt("textarea");
    tarea.setAttribute("rows","3");
    tarea.setAttribute("cols","40");
    tnode=document.createTextNode(output);
    tarea.appendChild(tnode);
  }
  
  /**
   * determine and return the target element of an event.
   * @param evt The event.
   * @return elt The element.
   */
  function returnTarget(evt){
    evt = (evt) ? evt : ((window.event) ? window.event : "");
    var elt=null;
    if(evt.target){
      elt=evt.target;
    }
    else if(evt.srcElement){
      elt=evt.srcElement;
    }
    return elt;
  }
  
  /**
   * attach an event to an element.
   * @param elementObject The object.
   * @param eventName The name of the event.
   * @param functionObject The function to be called.
   */
  function addEvent(elementObject, eventName, functionObject) {
    if(document.addEventListener) {
      elementObject.addEventListener(eventName, functionObject, false);
    }
    else if(document.attachEvent) {
      elementObject.attachEvent("on" + eventName, functionObject);
    }
  }
  
  /**
   * handle event attached to an object.
   * @param evt The event.
   */
  function handleEventWithObject(evt){
    var elt = returnTarget(evt);
    var obj = elt.ownerObj;
    if (obj!=null) obj.handleEvent(evt);
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib.js
  
  Index: overlib.js
  ===================================================================
  //\/////
  
  //\  overLIB 4.21 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\
  
  //\  Contributors are listed on the homepage.
  
  //\  This file might be old, always check for the latest version at:
  
  //\  http://www.bosrup.com/web/overlib/
  
  //\
  
  //\  Please read the license agreement (available through the link above)
  
  //\  before using overLIB. Direct any licensing questions to erik at bosrup.com.
  
  //\
  
  //\  Do not sell this as your own work or remove this copyright notice. 
  
  //\  For full details on copying or changing this script please read the
  
  //\  license agreement at the link above. Please give credit on sites that
  
  //\  use overLIB and submit changes of the script so other people can use
  
  //\  them as well.
  
  //   $Revision$                $Date$
  
  //\/////
  
  //\mini
  
  
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  var olLoaded = 0;var pmStart = 10000000; var pmUpper = 10001000; var pmCount = pmStart+1; var pmt=''; var pms = new Array(); var olInfo = new Info('4.21', 1);
  
  var FREPLACE = 0; var FBEFORE = 1; var FAFTER = 2; var FALTERNATE = 3; var FCHAIN=4;
  
  var olHideForm=0;  // parameter for hiding SELECT and ActiveX elements in IE5.5+ 
  
  var olHautoFlag = 0;  // flags for over-riding VAUTO and HAUTO if corresponding
  
  var olVautoFlag = 0;  // positioning commands are used on the command line
  
  var hookPts = new Array(), postParse = new Array(), cmdLine = new Array(), runTime = new Array();
  
  // for plugins
  
  registerCommands('donothing,inarray,caparray,sticky,background,noclose,caption,left,right,center,offsetx,offsety,fgcolor,bgcolor,textcolor,capcolor,closecolor,width,border,cellpad,status,autostatus,autostatuscap,height,closetext,snapx,snapy,fixx,fixy,relx,rely,fgbackground,bgbackground,padx,pady,fullhtml,above,below,capicon,textfont,captionfont,closefont,textsize,captionsize,closesize,timeout,function,delay,hauto,vauto,closeclick,wrap,followmouse,mouseoff,closetitle,cssoff,compatmode,cssclass,fgclass,bgclass,textfontclass,captionfontclass,closefontclass');
  
  
  
  ////////
  
  // DEFAULT CONFIGURATION
  
  // Settings you want everywhere are set here. All of this can also be
  
  // changed on your html page or through an overLIB call.
  
  ////////
  
  if (typeof ol_fgcolor=='undefined') var ol_fgcolor="#CCCCFF";
  
  if (typeof ol_bgcolor=='undefined') var ol_bgcolor="#333399";
  
  if (typeof ol_textcolor=='undefined') var ol_textcolor="#000000";
  
  if (typeof ol_capcolor=='undefined') var ol_capcolor="#FFFFFF";
  
  if (typeof ol_closecolor=='undefined') var ol_closecolor="#9999FF";
  
  if (typeof ol_textfont=='undefined') var ol_textfont="Verdana,Arial,Helvetica";
  
  if (typeof ol_captionfont=='undefined') var ol_captionfont="Verdana,Arial,Helvetica";
  
  if (typeof ol_closefont=='undefined') var ol_closefont="Verdana,Arial,Helvetica";
  
  if (typeof ol_textsize=='undefined') var ol_textsize="1";
  
  if (typeof ol_captionsize=='undefined') var ol_captionsize="1";
  
  if (typeof ol_closesize=='undefined') var ol_closesize="1";
  
  if (typeof ol_width=='undefined') var ol_width="200";
  
  if (typeof ol_border=='undefined') var ol_border="1";
  
  if (typeof ol_cellpad=='undefined') var ol_cellpad=2;
  
  if (typeof ol_offsetx=='undefined') var ol_offsetx=10;
  
  if (typeof ol_offsety=='undefined') var ol_offsety=10;
  
  if (typeof ol_text=='undefined') var ol_text="Default Text";
  
  if (typeof ol_cap=='undefined') var ol_cap="";
  
  if (typeof ol_sticky=='undefined') var ol_sticky=0;
  
  if (typeof ol_background=='undefined') var ol_background="";
  
  if (typeof ol_close=='undefined') var ol_close="Close";
  
  if (typeof ol_hpos=='undefined') var ol_hpos=RIGHT;
  
  if (typeof ol_status=='undefined') var ol_status="";
  
  if (typeof ol_autostatus=='undefined') var ol_autostatus=0;
  
  if (typeof ol_height=='undefined') var ol_height=-1;
  
  if (typeof ol_snapx=='undefined') var ol_snapx=0;
  
  if (typeof ol_snapy=='undefined') var ol_snapy=0;
  
  if (typeof ol_fixx=='undefined') var ol_fixx=-1;
  
  if (typeof ol_fixy=='undefined') var ol_fixy=-1;
  
  if (typeof ol_relx=='undefined') var ol_relx=null;
  
  if (typeof ol_rely=='undefined') var ol_rely=null;
  
  if (typeof ol_fgbackground=='undefined') var ol_fgbackground="";
  
  if (typeof ol_bgbackground=='undefined') var ol_bgbackground="";
  
  if (typeof ol_padxl=='undefined') var ol_padxl=1;
  
  if (typeof ol_padxr=='undefined') var ol_padxr=1;
  
  if (typeof ol_padyt=='undefined') var ol_padyt=1;
  
  if (typeof ol_padyb=='undefined') var ol_padyb=1;
  
  if (typeof ol_fullhtml=='undefined') var ol_fullhtml=0;
  
  if (typeof ol_vpos=='undefined') var ol_vpos=BELOW;
  
  if (typeof ol_aboveheight=='undefined') var ol_aboveheight=0;
  
  if (typeof ol_capicon=='undefined') var ol_capicon="";
  
  if (typeof ol_frame=='undefined') var ol_frame=self;
  
  if (typeof ol_timeout=='undefined') var ol_timeout=0;
  
  if (typeof ol_function=='undefined') var ol_function=null;
  
  if (typeof ol_delay=='undefined') var ol_delay=0;
  
  if (typeof ol_hauto=='undefined') var ol_hauto=0;
  
  if (typeof ol_vauto=='undefined') var ol_vauto=0;
  
  if (typeof ol_closeclick=='undefined') var ol_closeclick=0;
  
  if (typeof ol_wrap=='undefined') var ol_wrap=0;
  
  if (typeof ol_followmouse=='undefined') var ol_followmouse=1;
  
  if (typeof ol_mouseoff=='undefined') var ol_mouseoff=0;
  
  if (typeof ol_closetitle=='undefined') var ol_closetitle='Close';
  
  if (typeof ol_compatmode=='undefined') var ol_compatmode=0;
  
  if (typeof ol_css=='undefined') var ol_css=CSSOFF;
  
  if (typeof ol_fgclass=='undefined') var ol_fgclass="";
  
  if (typeof ol_bgclass=='undefined') var ol_bgclass="";
  
  if (typeof ol_textfontclass=='undefined') var ol_textfontclass="";
  
  if (typeof ol_captionfontclass=='undefined') var ol_captionfontclass="";
  
  if (typeof ol_closefontclass=='undefined') var ol_closefontclass="";
  
  
  
  ////////
  
  // ARRAY CONFIGURATION
  
  ////////
  
  
  
  // You can use these arrays to store popup text here instead of in the html.
  
  if (typeof ol_texts=='undefined') var ol_texts = new Array("Text 0", "Text 1");
  
  if (typeof ol_caps=='undefined') var ol_caps = new Array("Caption 0", "Caption 1");
  
  
  
  ////////
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  
  
  
  
  
  
  
  
  
  
  ////////
  
  // INIT
  
  ////////
  
  // Runtime variables init. Don't change for config!
  
  var o3_text="";
  
  var o3_cap="";
  
  var o3_sticky=0;
  
  var o3_background="";
  
  var o3_close="Close";
  
  var o3_hpos=RIGHT;
  
  var o3_offsetx=2;
  
  var o3_offsety=2;
  
  var o3_fgcolor="";
  
  var o3_bgcolor="";
  
  var o3_textcolor="";
  
  var o3_capcolor="";
  
  var o3_closecolor="";
  
  var o3_width=100;
  
  var o3_border=1;
  
  var o3_cellpad=2;
  
  var o3_status="";
  
  var o3_autostatus=0;
  
  var o3_height=-1;
  
  var o3_snapx=0;
  
  var o3_snapy=0;
  
  var o3_fixx=-1;
  
  var o3_fixy=-1;
  
  var o3_relx=null;
  
  var o3_rely=null;
  
  var o3_fgbackground="";
  
  var o3_bgbackground="";
  
  var o3_padxl=0;
  
  var o3_padxr=0;
  
  var o3_padyt=0;
  
  var o3_padyb=0;
  
  var o3_fullhtml=0;
  
  var o3_vpos=BELOW;
  
  var o3_aboveheight=0;
  
  var o3_capicon="";
  
  var o3_textfont="Verdana,Arial,Helvetica";
  
  var o3_captionfont="Verdana,Arial,Helvetica";
  
  var o3_closefont="Verdana,Arial,Helvetica";
  
  var o3_textsize="1";
  
  var o3_captionsize="1";
  
  var o3_closesize="1";
  
  var o3_frame=self;
  
  var o3_timeout=0;
  
  var o3_timerid=0;
  
  var o3_allowmove=0;
  
  var o3_function=null; 
  
  var o3_delay=0;
  
  var o3_delayid=0;
  
  var o3_hauto=0;
  
  var o3_vauto=0;
  
  var o3_closeclick=0;
  
  var o3_wrap=0;
  
  var o3_followmouse=1;
  
  var o3_mouseoff=0;
  
  var o3_closetitle='';
  
  var o3_compatmode=0;
  
  var o3_css=CSSOFF;
  
  var o3_fgclass="";
  
  var o3_bgclass="";
  
  var o3_textfontclass="";
  
  var o3_captionfontclass="";
  
  var o3_closefontclass="";
  
  
  
  // Display state variables
  
  var o3_x = 0;
  
  var o3_y = 0;
  
  var o3_showingsticky = 0;
  
  var o3_removecounter = 0;
  
  
  
  // Our layer
  
  var over = null;
  
  var fnRef, hoveringSwitch = false;
  
  var olHideDelay;
  
  
  
  // Decide browser version
  
  var isMac = (navigator.userAgent.indexOf("Mac") != -1);
  
  var olOp = (navigator.userAgent.toLowerCase().indexOf('opera') > -1 && document.createTextNode);  // Opera 7
  
  var olNs4 = (navigator.appName=='Netscape' && parseInt(navigator.appVersion) == 4);
  
  var olNs6 = (document.getElementById) ? true : false;
  
  var olKq = (olNs6 && /konqueror/i.test(navigator.userAgent));
  
  var olIe4 = (document.all) ? true : false;
  
  var olIe5 = false; 
  
  var olIe55 = false; // Added additional variable to identify IE5.5+
  
  var docRoot = 'document.body';
  
  
  
  // Resize fix for NS4.x to keep track of layer
  
  if (olNs4) {
  
  	var oW = window.innerWidth;
  
  	var oH = window.innerHeight;
  
  	window.onresize = function() { if (oW != window.innerWidth || oH != window.innerHeight) location.reload(); }
  
  }
  
  
  
  // Microsoft Stupidity Check(tm).
  
  if (olIe4) {
  
  	var agent = navigator.userAgent;
  
  	if (/MSIE/.test(agent)) {
  
  		var versNum = parseFloat(agent.match(/MSIE[ ](\d\.\d+)\.*/i)[1]);
  
  		if (versNum >= 5){
  
  			olIe5=true;
  
  			olIe55=(versNum>=5.5&&!olOp) ? true : false;
  
  			if (olNs6) olNs6=false;
  
  		}
  
  	}
  
  	if (olNs6) olIe4 = false;
  
  }
  
  
  
  // Check for compatability mode.
  
  if (document.compatMode && document.compatMode == 'CSS1Compat') {
  
  	docRoot= ((olIe4 && !olOp) ? 'document.documentElement' : docRoot);
  
  }
  
  
  
  // Add window onload handlers to indicate when all modules have been loaded
  
  // For Netscape 6+ and Mozilla, uses addEventListener method on the window object
  
  // For IE it uses the attachEvent method of the window object and for Netscape 4.x
  
  // it sets the window.onload handler to the OLonload_handler function for Bubbling
  
  if(window.addEventListener) window.addEventListener("load",OLonLoad_handler,false);
  
  else {
  
    if (window.attachEvent) {
  
      var pc_result = window.attachEvent("onload",OLonLoad_handler);
  
      if( pc_result == false ) alert("Failed onload attach");
  
    } else {
  
      alert( "failed attach");
  
    }
  
  }
  
  
  
  var capExtent;
  
  
  
  ////////
  
  // PUBLIC FUNCTIONS
  
  ////////
  
  
  
  // overlib(arg0,...,argN)
  
  // Loads parameters into global runtime variables.
  
  function overlib() {
  
  	if (!olLoaded || isExclusive(overlib.arguments)) return true;
  
  	if (olCheckMouseCapture) olMouseCapture();
  
  	if (over) {
  
  		over = (typeof over.id != 'string') ? o3_frame.document.all['overDiv'] : over;
  
  		cClick();
  
  	}
  
  
  
  	// Load defaults to runtime.
  
    olHideDelay=0;
  
  	o3_text=ol_text;
  
  	o3_cap=ol_cap;
  
  	o3_sticky=ol_sticky;
  
  	o3_background=ol_background;
  
  	o3_close=ol_close;
  
  	o3_hpos=ol_hpos;
  
  	o3_offsetx=ol_offsetx;
  
  	o3_offsety=ol_offsety;
  
  	o3_fgcolor=ol_fgcolor;
  
  	o3_bgcolor=ol_bgcolor;
  
  	o3_textcolor=ol_textcolor;
  
  	o3_capcolor=ol_capcolor;
  
  	o3_closecolor=ol_closecolor;
  
  	o3_width=ol_width;
  
  	o3_border=ol_border;
  
  	o3_cellpad=ol_cellpad;
  
  	o3_status=ol_status;
  
  	o3_autostatus=ol_autostatus;
  
  	o3_height=ol_height;
  
  	o3_snapx=ol_snapx;
  
  	o3_snapy=ol_snapy;
  
  	o3_fixx=ol_fixx;
  
  	o3_fixy=ol_fixy;
  
  	o3_relx=ol_relx;
  
  	o3_rely=ol_rely;
  
  	o3_fgbackground=ol_fgbackground;
  
  	o3_bgbackground=ol_bgbackground;
  
  	o3_padxl=ol_padxl;
  
  	o3_padxr=ol_padxr;
  
  	o3_padyt=ol_padyt;
  
  	o3_padyb=ol_padyb;
  
  	o3_fullhtml=ol_fullhtml;
  
  	o3_vpos=ol_vpos;
  
  	o3_aboveheight=ol_aboveheight;
  
  	o3_capicon=ol_capicon;
  
  	o3_textfont=ol_textfont;
  
  	o3_captionfont=ol_captionfont;
  
  	o3_closefont=ol_closefont;
  
  	o3_textsize=ol_textsize;
  
  	o3_captionsize=ol_captionsize;
  
  	o3_closesize=ol_closesize;
  
  	o3_timeout=ol_timeout;
  
  	o3_function=ol_function;
  
  	o3_delay=ol_delay;
  
  	o3_hauto=ol_hauto;
  
  	o3_vauto=ol_vauto;
  
  	o3_closeclick=ol_closeclick;
  
  	o3_wrap=ol_wrap;	
  
  	o3_followmouse=ol_followmouse;
  
  	o3_mouseoff=ol_mouseoff;
  
  	o3_closetitle=ol_closetitle;
  
  	o3_css=ol_css;
  
  	o3_compatmode=ol_compatmode;
  
  	o3_fgclass=ol_fgclass;
  
  	o3_bgclass=ol_bgclass;
  
  	o3_textfontclass=ol_textfontclass;
  
  	o3_captionfontclass=ol_captionfontclass;
  
  	o3_closefontclass=ol_closefontclass;
  
  	
  
  	setRunTimeVariables();
  
  	
  
  	fnRef = '';
  
  	
  
  	// Special for frame support, over must be reset...
  
  	o3_frame = ol_frame;
  
  	
  
  	if(!(over=createDivContainer())) return false;
  
  
  
  	parseTokens('o3_', overlib.arguments);
  
  	if (!postParseChecks()) return false;
  
  
  
  	if (o3_delay == 0) {
  
  		return runHook("olMain", FREPLACE);
  
   	} else {
  
  		o3_delayid = setTimeout("runHook('olMain', FREPLACE)", o3_delay);
  
  		return false;
  
  	}
  
  }
  
  
  
  // Clears popups if appropriate
  
  function nd(time) {
  
  	if (olLoaded && !isExclusive()) {
  
  		hideDelay(time);  // delay popup close if time specified
  
  
  
  		if (o3_removecounter >= 1) { o3_showingsticky = 0 };
  
  		
  
  		if (o3_showingsticky == 0) {
  
  			o3_allowmove = 0;
  
  			if (over != null && o3_timerid == 0) runHook("hideObject", FREPLACE, over);
  
  		} else {
  
  			o3_removecounter++;
  
  		}
  
  	}
  
  	
  
  	return true;
  
  }
  
  
  
  // The Close onMouseOver function for stickies
  
  function cClick() {
  
  	if (olLoaded) {
  
  		runHook("hideObject", FREPLACE, over);
  
  		o3_showingsticky = 0;	
  
  	}	
  
  	return false;
  
  }
  
  
  
  // Method for setting page specific defaults.
  
  function overlib_pagedefaults() {
  
  	parseTokens('ol_', overlib_pagedefaults.arguments);
  
  }
  
  
  
  
  
  ////////
  
  // OVERLIB MAIN FUNCTION
  
  ////////
  
  
  
  // This function decides what it is we want to display and how we want it done.
  
  function olMain() {
  
  	var layerhtml, styleType;
  
   	runHook("olMain", FBEFORE);
  
   	
  
  	if (o3_background!="" || o3_fullhtml) {
  
  		// Use background instead of box.
  
  		layerhtml = runHook('ol_content_background', FALTERNATE, o3_css, o3_text, o3_background, o3_fullhtml);
  
  	} else {
  
  		// They want a popup box.
  
  		styleType = (pms[o3_css-1-pmStart] == "cssoff" || pms[o3_css-1-pmStart] == "cssclass");
  
  
  
  		// Prepare popup background
  
  		if (o3_fgbackground != "") o3_fgbackground = "background=\""+o3_fgbackground+"\"";
  
  		if (o3_bgbackground != "") o3_bgbackground = (styleType ? "background=\""+o3_bgbackground+"\"" : o3_bgbackground);
  
  
  
  		// Prepare popup colors
  
  		if (o3_fgcolor != "") o3_fgcolor = (styleType ? "bgcolor=\""+o3_fgcolor+"\"" : o3_fgcolor);
  
  		if (o3_bgcolor != "") o3_bgcolor = (styleType ? "bgcolor=\""+o3_bgcolor+"\"" : o3_bgcolor);
  
  
  
  		// Prepare popup height
  
  		if (o3_height > 0) o3_height = (styleType ? "height=\""+o3_height+"\"" : o3_height);
  
  		else o3_height = "";
  
  
  
  		// Decide which kinda box.
  
  		if (o3_cap=="") {
  
  			// Plain
  
  			layerhtml = runHook('ol_content_simple', FALTERNATE, o3_css, o3_text);
  
  		} else {
  
  			// With caption
  
  			if (o3_sticky) {
  
  				// Show close text
  
  				layerhtml = runHook('ol_content_caption', FALTERNATE, o3_css, o3_text, o3_cap, o3_close);
  
  			} else {
  
  				// No close text
  
  				layerhtml = runHook('ol_content_caption', FALTERNATE, o3_css, o3_text, o3_cap, "");
  
  			}
  
  		}
  
  	}	
  
  
  
  	// We want it to stick!
  
  	if (o3_sticky) {
  
  		if (o3_timerid > 0) {
  
  			clearTimeout(o3_timerid);
  
  			o3_timerid = 0;
  
  		}
  
  		o3_showingsticky = 1;
  
  		o3_removecounter = 0;
  
  	}
  
  
  
  	// Created a separate routine to generate the popup to make it easier
  
  	// to implement a plugin capability
  
  	if (!runHook("createPopup", FREPLACE, layerhtml)) return false;
  
  
  
  	// Prepare status bar
  
  	if (o3_autostatus > 0) {
  
  		o3_status = o3_text;
  
  		if (o3_autostatus > 1) o3_status = o3_cap;
  
  	}
  
  
  
  	// When placing the layer the first time, even stickies may be moved.
  
  	o3_allowmove = 0;
  
  
  
  	// Initiate a timer for timeout
  
  	if (o3_timeout > 0) {          
  
  		if (o3_timerid > 0) clearTimeout(o3_timerid);
  
  		o3_timerid = setTimeout("cClick()", o3_timeout);
  
  	}
  
  
  
  	// Show layer
  
  	runHook("disp", FREPLACE, o3_status);
  
  	runHook("olMain", FAFTER);
  
  
  
  	return (olOp && event && event.type == 'mouseover' && !o3_status) ? '' : (o3_status != '');
  
  }
  
  
  
  ////////
  
  // LAYER GENERATION FUNCTIONS
  
  ////////
  
  // These functions just handle popup content with tags that should adhere to the W3C standards specification.
  
  
  
  // Makes simple table without caption
  
  function ol_content_simple(text) {
  
  	var cpIsMultiple = /,/.test(o3_cellpad);
  
  	var txt = '<table width="'+o3_width+ '" border="0" cellpadding="'+o3_border+'" cellspacing="0" '+(o3_bgclass ? 'class="'+o3_bgclass+'"' : o3_bgcolor+' '+o3_height)+'><tr><td><table width="100%" border="0" '+((olNs4||!cpIsMultiple) ? 'cellpadding="'+o3_cellpad+'" ' : '')+'cellspacing="0" '+(o3_fgclass ? 'class="'+o3_fgclass+'"' : o3_fgcolor+' '+o3_fgbackground+' '+o3_height)+'><tr><td valign="TOP"'+(o3_textfontclass ? ' class="'+o3_textfontclass+'">' : ((!olNs4&&cpIsMultiple) ? ' style="'+setCellPadStr(o3_cellpad)+'">' : '>'))+(o3_textfontclass ? '' : wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass ? '' : wrapStr(1,o3_textsize))+'</td></tr></table></td></tr></table>';
  
  
  
  	set_background("");
  
  	return txt;
  
  }
  
  
  
  // Makes table with caption and optional close link
  
  function ol_content_caption(text,title,close) {
  
  	var nameId, txt, cpIsMultiple = /,/.test(o3_cellpad);
  
  	var closing, closeevent;
  
  
  
  	closing = "";
  
  	closeevent = "onmouseover";
  
  	if (o3_closeclick == 1) closeevent = (o3_closetitle ? "title='" + o3_closetitle +"'" : "") + " onclick";
  
  	if (o3_capicon != "") {
  
  	  nameId = ' hspace = \"5\"'+' align = \"middle\" alt = \"\"';
  
  	  if (typeof o3_dragimg != 'undefined' && o3_dragimg) nameId =' hspace=\"5\"'+' name=\"'+o3_dragimg+'\" id=\"'+o3_dragimg+'\" align=\"middle\" alt=\"Drag Enabled\" title=\"Drag Enabled\"';
  
  	  o3_capicon = '<img src=\"'+o3_capicon+'\"'+nameId+' />';
  
  	}
  
  
  
  	if (close != "")
  
  		closing = '<td '+(!o3_compatmode && o3_closefontclass ? 'class="'+o3_closefontclass : 'align="RIGHT')+'"><a href="javascript:return '+fnRef+'cClick();"'+((o3_compatmode && o3_closefontclass) ? ' class="' + o3_closefontclass + '" ' : ' ')+closeevent+'="return '+fnRef+'cClick();">'+(o3_closefontclass ? '' : wrapStr(0,o3_closesize,'close'))+close+(o3_closefontclass ? '' : wrapStr(1,o3_closesize,'close'))+'</a></td>';
  
  	txt = '<table width="'+o3_width+ '" border="0" cellpadding="'+o3_border+'" cellspacing="0" '+(o3_bgclass ? 'class="'+o3_bgclass+'"' : o3_bgcolor+' '+o3_bgbackground+' '+o3_height)+'><tr><td><table width="100%" border="0" cellpadding="2" cellspacing="0"><tr><td'+(o3_captionfontclass ? ' class="'+o3_captionfontclass+'">' : '>')+(o3_captionfontclass ? '' : '<b>'+wrapStr(0,o3_captionsize,'caption'))+o3_capicon+title+(o3_captionfontclass ? '' : wrapStr(1,o3_captionsize)+'</b>')+'</td>'+closing+'</tr></table><table width="100%" border="0" '+((olNs4||!cpIsMultiple) ? 'cellpadding="'+o3_cellpad+'" ' : '')+'cellspacing="0" '+(o3_fgclass ? 'class="'+o3_fgclass+'"' : o3_fgcolor+' '+o3_fgbackground+' '+o3_height)+'><tr><td valign="TOP"'+(o3_textfontclass ? ' class="'+o3_textfontclass+'">' :((!olNs4&&cpIsMultiple) ? ' style="'+setCellPadStr(o3_cellpad)+'">' : '>'))+(o3_textfontclass ? '' : wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass ? '' : wrapStr(1,o3_textsize)) + '</td></tr
 ></table></td></tr></table>';
  
  
  
  	set_background("");
  
  	return txt;
  
  }
  
  
  
  // Sets the background picture,padding and lots more. :)
  
  function ol_content_background(text,picture,hasfullhtml) {
  
  	if (hasfullhtml) {
  
  		txt=text;
  
  	} else {
  
  		txt='<table width="'+o3_width+'" border="0" cellpadding="0" cellspacing="0" height="'+o3_height+'"><tr><td colspan="3" height="'+o3_padyt+'"></td></tr><tr><td width="'+o3_padxl+'"></td><td valign="TOP" width="'+(o3_width-o3_padxl-o3_padxr)+(o3_textfontclass ? '" class="'+o3_textfontclass : '')+'">'+(o3_textfontclass ? '' : wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass ? '' : wrapStr(1,o3_textsize))+'</td><td width="'+o3_padxr+'"></td></tr><tr><td colspan="3" height="'+o3_padyb+'"></td></tr></table>';
  
  	}
  
  
  
  	set_background(picture);
  
  	return txt;
  
  }
  
  
  
  // Loads a picture into the div.
  
  function set_background(pic) {
  
  	if (pic == "") {
  
  		if (olNs4) {
  
  			over.background.src = null; 
  
  		} else if (over.style) {
  
  			over.style.backgroundImage = "none";
  
  		}
  
  	} else {
  
  		if (olNs4) {
  
  			over.background.src = pic;
  
  		} else if (over.style) {
  
  			over.style.width=o3_width + 'px';
  
  			over.style.backgroundImage = "url("+pic+")";
  
  		}
  
  	}
  
  }
  
  
  
  ////////
  
  // HANDLING FUNCTIONS
  
  ////////
  
  var olShowId=-1;
  
  
  
  // Displays the popup
  
  function disp(statustext) {
  
  	runHook("disp", FBEFORE);
  
  	
  
  	if (o3_allowmove == 0) {
  
  		runHook("placeLayer", FREPLACE);
  
  		(olNs6&&olShowId<0) ? olShowId=setTimeout("runHook('showObject', FREPLACE, over)", 1) : runHook("showObject", FREPLACE, over);
  
  		o3_allowmove = (o3_sticky || o3_followmouse==0) ? 0 : 1;
  
  	}
  
  	
  
  	runHook("disp", FAFTER);
  
  
  
  	if (statustext != "") self.status = statustext;
  
  }
  
  
  
  // Creates the actual popup structure
  
  function createPopup(lyrContent){
  
  	runHook("createPopup", FBEFORE);
  
  	
  
  	if (o3_wrap) {
  
  		var wd,ww,theObj = (olNs4 ? over : over.style);
  
  		theObj.top = theObj.left = ((olIe4&&!olOp) ? 0 : -10000) + (!olNs4 ? 'px' : 0);
  
  		layerWrite(lyrContent);
  
  		wd = (olNs4 ? over.clip.width : over.offsetWidth);
  
  		if (wd > (ww=windowWidth())) {
  
  			lyrContent=lyrContent.replace(/\&nbsp;/g, ' ');
  
  			o3_width=ww;
  
  			o3_wrap=0;
  
  		} 
  
  	}
  
  
  
  	layerWrite(lyrContent);
  
  	
  
  	// Have to set o3_width for placeLayer() routine if o3_wrap is turned on
  
  	if (o3_wrap) o3_width=(olNs4 ? over.clip.width : over.offsetWidth);
  
  	
  
  	runHook("createPopup", FAFTER, lyrContent);
  
  
  
  	return true;
  
  }
  
  
  
  // Decides where we want the popup.
  
  function placeLayer() {
  
  	var placeX, placeY, widthFix = 0;
  
  	
  
  	// HORIZONTAL PLACEMENT, re-arranged to work in Safari
  
  	if (o3_frame.innerWidth) widthFix=18; 
  
  	iwidth = windowWidth();
  
  
  
  	// Horizontal scroll offset
  
  	winoffset=(olIe4) ? eval('o3_frame.'+docRoot+'.scrollLeft') : o3_frame.pageXOffset;
  
  
  
  	placeX = runHook('horizontalPlacement',FCHAIN,iwidth,winoffset,widthFix);
  
  
  
  	// VERTICAL PLACEMENT, re-arranged to work in Safari
  
  	if (o3_frame.innerHeight) {
  
  		iheight=o3_frame.innerHeight;
  
  	} else if (eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientHeight=='number'")&&eval('o3_frame.'+docRoot+'.clientHeight')) { 
  
  		iheight=eval('o3_frame.'+docRoot+'.clientHeight');
  
  	}			
  
  
  
  	// Vertical scroll offset
  
  	scrolloffset=(olIe4) ? eval('o3_frame.'+docRoot+'.scrollTop') : o3_frame.pageYOffset;
  
  	placeY = runHook('verticalPlacement',FCHAIN,iheight,scrolloffset);
  
  
  
  	// Actually move the object.
  
  	repositionTo(over, placeX, placeY);
  
  }
  
  
  
  // Moves the layer
  
  function olMouseMove(e) {
  
  	var e = (e) ? e : event;
  
  
  
  	if (e.pageX) {
  
  		o3_x = e.pageX;
  
  		o3_y = e.pageY;
  
  	} else if (e.clientX) {
  
  		o3_x = eval('e.clientX+o3_frame.'+docRoot+'.scrollLeft');
  
  		o3_y = eval('e.clientY+o3_frame.'+docRoot+'.scrollTop');
  
  	}
  
  	
  
  	if (o3_allowmove == 1) runHook("placeLayer", FREPLACE);
  
  
  
  	// MouseOut handler
  
  	if (hoveringSwitch && !olNs4 && runHook("cursorOff", FREPLACE)) {
  
  		(olHideDelay ? hideDelay(olHideDelay) : cClick());
  
  		hoveringSwitch = !hoveringSwitch;
  
  	}
  
  }
  
  
  
  // Fake function for 3.0 users.
  
  function no_overlib() { return ver3fix; }
  
  
  
  // Capture the mouse and chain other scripts.
  
  function olMouseCapture() {
  
  	capExtent = document;
  
  	var fN, str = '', l, k, f, wMv, sS, mseHandler = olMouseMove;
  
  	var re = /function[ ]*(\w*)\(/;
  
  	
  
  	wMv = (!olIe4 && window.onmousemove);
  
  	if (document.onmousemove || wMv) {
  
  		if (wMv) capExtent = window;
  
  		f = capExtent.onmousemove.toString();
  
  		fN = f.match(re);
  
  		if (fN == null) {
  
  			str = f+'(e); ';
  
  		} else if (fN[1] == 'anonymous' || fN[1] == 'olMouseMove' || (wMv && fN[1] == 'onmousemove')) {
  
  			if (!olOp && wMv) {
  
  				l = f.indexOf('{')+1;
  
  				k = f.lastIndexOf('}');
  
  				sS = f.substring(l,k);
  
  				if ((l = sS.indexOf('(')) != -1) {
  
  					sS = sS.substring(0,l).replace(/^\s+/,'').replace(/\s+$/,'');
  
  					if (eval("typeof " + sS + " == 'undefined'")) window.onmousemove = null;
  
  					else str = sS + '(e);';
  
  				}
  
  			}
  
  			if (!str) {
  
  				olCheckMouseCapture = false;
  
  				return;
  
  			}
  
  		} else {
  
  			if (fN[1]) str = fN[1]+'(e); ';
  
  			else {
  
  				l = f.indexOf('{')+1;
  
  				k = f.lastIndexOf('}');
  
  				str = f.substring(l,k) + '\n';
  
  			}
  
  		}
  
  		str += 'olMouseMove(e); ';
  
  		mseHandler = new Function('e', str);
  
  	}
  
  
  
  	capExtent.onmousemove = mseHandler;
  
  	if (olNs4) capExtent.captureEvents(Event.MOUSEMOVE);
  
  }
  
  
  
  ////////
  
  // PARSING FUNCTIONS
  
  ////////
  
  
  
  // Does the actual command parsing.
  
  function parseTokens(pf, ar) {
  
  	// What the next argument is expected to be.
  
  	var v, i, mode=-1, par = (pf != 'ol_');	
  
  	var fnMark = (par && !ar.length ? 1 : 0);
  
  
  
  	for (i = 0; i < ar.length; i++) {
  
  		if (mode < 0) {
  
  			// Arg is maintext,unless its a number between pmStart and pmUpper
  
  			// then its a command.
  
  			if (typeof ar[i] == 'number' && ar[i] > pmStart && ar[i] < pmUpper) {
  
  				fnMark = (par ? 1 : 0);
  
  				i--;   // backup one so that the next block can parse it
  
  			} else {
  
  				switch(pf) {
  
  					case 'ol_':
  
  						ol_text = ar[i].toString();
  
  						break;
  
  					default:
  
  						o3_text=ar[i].toString();  
  
  				}
  
  			}
  
  			mode = 0;
  
  		} else {
  
  			// Note: NS4 doesn't like switch cases with vars.
  
  			if (ar[i] >= pmCount || ar[i]==DONOTHING) { continue; }
  
  			if (ar[i]==INARRAY) { fnMark = 0; eval(pf+'text=ol_texts['+ar[++i]+'].toString()'); continue; }
  
  			if (ar[i]==CAPARRAY) { eval(pf+'cap=ol_caps['+ar[++i]+'].toString()'); continue; }
  
  			if (ar[i]==STICKY) { if (pf!='ol_') eval(pf+'sticky=1'); continue; }
  
  			if (ar[i]==BACKGROUND) { eval(pf+'background="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==NOCLOSE) { if (pf!='ol_') opt_NOCLOSE(); continue; }
  
  			if (ar[i]==CAPTION) { eval(pf+"cap='"+escSglQuote(ar[++i])+"'"); continue; }
  
  			if (ar[i]==CENTER || ar[i]==LEFT || ar[i]==RIGHT) { eval(pf+'hpos='+ar[i]); if(pf!='ol_') olHautoFlag=1; continue; }
  
  			if (ar[i]==OFFSETX) { eval(pf+'offsetx='+ar[++i]); continue; }
  
  			if (ar[i]==OFFSETY) { eval(pf+'offsety='+ar[++i]); continue; }
  
  			if (ar[i]==FGCOLOR) { eval(pf+'fgcolor="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==BGCOLOR) { eval(pf+'bgcolor="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==TEXTCOLOR) { eval(pf+'textcolor="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==CAPCOLOR) { eval(pf+'capcolor="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==CLOSECOLOR) { eval(pf+'closecolor="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==WIDTH) { eval(pf+'width='+ar[++i]); continue; }
  
  			if (ar[i]==BORDER) { eval(pf+'border='+ar[++i]); continue; }
  
  			if (ar[i]==CELLPAD) { i=opt_MULTIPLEARGS(++i,ar,(pf+'cellpad')); continue; }
  
  			if (ar[i]==STATUS) { eval(pf+"status='"+escSglQuote(ar[++i])+"'"); continue; }
  
  			if (ar[i]==AUTOSTATUS) { eval(pf +'autostatus=('+pf+'autostatus == 1) ? 0 : 1'); continue; }
  
  			if (ar[i]==AUTOSTATUSCAP) { eval(pf +'autostatus=('+pf+'autostatus == 2) ? 0 : 2'); continue; }
  
  			if (ar[i]==HEIGHT) { eval(pf+'height='+pf+'aboveheight='+ar[++i]); continue; } // Same param again.
  
  			if (ar[i]==CLOSETEXT) { eval(pf+"close='"+escSglQuote(ar[++i])+"'"); continue; }
  
  			if (ar[i]==SNAPX) { eval(pf+'snapx='+ar[++i]); continue; }
  
  			if (ar[i]==SNAPY) { eval(pf+'snapy='+ar[++i]); continue; }
  
  			if (ar[i]==FIXX) { eval(pf+'fixx='+ar[++i]); continue; }
  
  			if (ar[i]==FIXY) { eval(pf+'fixy='+ar[++i]); continue; }
  
  			if (ar[i]==RELX) { eval(pf+'relx='+ar[++i]); continue; }
  
  			if (ar[i]==RELY) { eval(pf+'rely='+ar[++i]); continue; }
  
  			if (ar[i]==FGBACKGROUND) { eval(pf+'fgbackground="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==BGBACKGROUND) { eval(pf+'bgbackground="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==PADX) { eval(pf+'padxl='+ar[++i]); eval(pf+'padxr='+ar[++i]); continue; }
  
  			if (ar[i]==PADY) { eval(pf+'padyt='+ar[++i]); eval(pf+'padyb='+ar[++i]); continue; }
  
  			if (ar[i]==FULLHTML) { if (pf!='ol_') eval(pf+'fullhtml=1'); continue; }
  
  			if (ar[i]==BELOW || ar[i]==ABOVE) { eval(pf+'vpos='+ar[i]); if (pf!='ol_') olVautoFlag=1; continue; }
  
  			if (ar[i]==CAPICON) { eval(pf+'capicon="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==TEXTFONT) { eval(pf+"textfont='"+escSglQuote(ar[++i])+"'"); continue; }
  
  			if (ar[i]==CAPTIONFONT) { eval(pf+"captionfont='"+escSglQuote(ar[++i])+"'"); continue; }
  
  			if (ar[i]==CLOSEFONT) { eval(pf+"closefont='"+escSglQuote(ar[++i])+"'"); continue; }
  
  			if (ar[i]==TEXTSIZE) { eval(pf+'textsize="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==CAPTIONSIZE) { eval(pf+'captionsize="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==CLOSESIZE) { eval(pf+'closesize="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==TIMEOUT) { eval(pf+'timeout='+ar[++i]); continue; }
  
  			if (ar[i]==FUNCTION) { if (pf=='ol_') { if (typeof ar[i+1]!='number') { v=ar[++i]; ol_function=(typeof v=='function' ? v : null); }} else {fnMark = 0; v = null; if (typeof ar[i+1]!='number') v = ar[++i];  opt_FUNCTION(v); } continue; }
  
  			if (ar[i]==DELAY) { eval(pf+'delay='+ar[++i]); continue; }
  
  			if (ar[i]==HAUTO) { eval(pf+'hauto=('+pf+'hauto == 0) ? 1 : 0'); continue; }
  
  			if (ar[i]==VAUTO) { eval(pf+'vauto=('+pf+'vauto == 0) ? 1 : 0'); continue; }
  
  			if (ar[i]==CLOSECLICK) { eval(pf +'closeclick=('+pf+'closeclick == 0) ? 1 : 0'); continue; }
  
  			if (ar[i]==WRAP) { eval(pf +'wrap=('+pf+'wrap == 0) ? 1 : 0'); continue; }
  
  			if (ar[i]==FOLLOWMOUSE) { eval(pf +'followmouse=('+pf+'followmouse == 1) ? 0 : 1'); continue; }
  
  			if (ar[i]==MOUSEOFF) { eval(pf +'mouseoff=('+pf+'mouseoff==0) ? 1 : 0'); v=ar[i+1]; if (pf != 'ol_' && eval(pf+'mouseoff') && typeof v == 'number' && (v < pmStart || v > pmUpper)) olHideDelay=ar[++i]; continue; }
  
  			if (ar[i]==CLOSETITLE) { eval(pf+"closetitle='"+escSglQuote(ar[++i])+"'"); continue; }
  
  			if (ar[i]==CSSOFF||ar[i]==CSSCLASS) { eval(pf+'css='+ar[i]); continue; }
  
  			if (ar[i]==COMPATMODE) { eval(pf+'compatmode=('+pf+'compatmode==0) ? 1 : 0'); continue; }
  
  			if (ar[i]==FGCLASS) { eval(pf+'fgclass="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==BGCLASS) { eval(pf+'bgclass="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==TEXTFONTCLASS) { eval(pf+'textfontclass="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==CAPTIONFONTCLASS) { eval(pf+'captionfontclass="'+ar[++i]+'"'); continue; }
  
  			if (ar[i]==CLOSEFONTCLASS) { eval(pf+'closefontclass="'+ar[++i]+'"'); continue; }
  
  			i = parseCmdLine(pf, i, ar);
  
  		}
  
  	}
  
  
  
  	if (fnMark && o3_function) o3_text = o3_function();
  
  	
  
  	if ((pf == 'o3_') && o3_wrap) {
  
  		o3_width = 0;
  
  		
  
  		var tReg=/<.*\n*>/ig;
  
  		if (!tReg.test(o3_text)) o3_text = o3_text.replace(/[ ]+/g, '&nbsp;');
  
  		if (!tReg.test(o3_cap))o3_cap = o3_cap.replace(/[ ]+/g, '&nbsp;');
  
  	}
  
  	if ((pf == 'o3_') && o3_sticky) {
  
  		if (!o3_close && (o3_frame != ol_frame)) o3_close = ol_close;
  
  		if (o3_mouseoff && (o3_frame == ol_frame)) opt_NOCLOSE(' ');
  
  	}
  
  }
  
  
  
  
  
  ////////
  
  // LAYER FUNCTIONS
  
  ////////
  
  
  
  // Writes to a layer
  
  function layerWrite(txt) {
  
  	txt += "\n";
  
  	if (olNs4) {
  
  		var lyr = o3_frame.document.layers['overDiv'].document
  
  		lyr.write(txt)
  
  		lyr.close()
  
  	} else if (typeof over.innerHTML != 'undefined') {
  
  		if (olIe5 && isMac) over.innerHTML = '';
  
  		over.innerHTML = txt;
  
  	} else {
  
  		range = o3_frame.document.createRange();
  
  		range.setStartAfter(over);
  
  		domfrag = range.createContextualFragment(txt);
  
  		
  
  		while (over.hasChildNodes()) {
  
  			over.removeChild(over.lastChild);
  
  		}
  
  		
  
  		over.appendChild(domfrag);
  
  	}
  
  }
  
  
  
  // Make an object visible
  
  function showObject(obj) {
  
  	runHook("showObject", FBEFORE);
  
  
  
  	var theObj=(olNs4 ? obj : obj.style);
  
  	theObj.visibility = 'visible';
  
  
  
  	runHook("showObject", FAFTER);
  
  }
  
  
  
  // Hides an object
  
  function hideObject(obj) {
  
  	runHook("hideObject", FBEFORE);
  
  
  
  	var theObj=(olNs4 ? obj : obj.style);
  
  	if (olNs6 && olShowId>0) { clearTimeout(olShowId); olShowId=0; }
  
  	theObj.visibility = 'hidden';
  
  	theObj.top = theObj.left = ((olIe4&&!olOp) ? 0 : -10000) + (!olNs4 ? 'px' : 0);
  
  
  
  	if (o3_timerid > 0) clearTimeout(o3_timerid);
  
  	if (o3_delayid > 0) clearTimeout(o3_delayid);
  
  
  
  	o3_timerid = 0;
  
  	o3_delayid = 0;
  
  	self.status = "";
  
  
  
  	if (obj.onmouseout||obj.onmouseover) {
  
  		if (olNs4) obj.releaseEvents(Event.MOUSEOUT || Event.MOUSEOVER);
  
  		obj.onmouseout = obj.onmouseover = null;
  
  	}
  
  
  
  	runHook("hideObject", FAFTER);
  
  }
  
  
  
  // Move a layer
  
  function repositionTo(obj, xL, yL) {
  
  	var theObj=(olNs4 ? obj : obj.style);
  
  	theObj.left = xL + (!olNs4 ? 'px' : 0);
  
  	theObj.top = yL + (!olNs4 ? 'px' : 0);
  
  }
  
  
  
  // Check position of cursor relative to overDiv DIVision; mouseOut function
  
  function cursorOff() {
  
  	var left = parseInt(over.style.left);
  
  	var top = parseInt(over.style.top);
  
  	var right = left + (over.offsetWidth >= parseInt(o3_width) ? over.offsetWidth : parseInt(o3_width));
  
  	var bottom = top + (over.offsetHeight >= o3_aboveheight ? over.offsetHeight : o3_aboveheight);
  
  
  
  	if (o3_x < left || o3_x > right || o3_y < top || o3_y > bottom) return true;
  
  
  
  	return false;
  
  }
  
  
  
  
  
  ////////
  
  // COMMAND FUNCTIONS
  
  ////////
  
  
  
  // Calls callme or the default function.
  
  function opt_FUNCTION(callme) {
  
  	o3_text = (callme ? (typeof callme=='string' ? (/.+\(.*\)/.test(callme) ? eval(callme) : callme) : callme()) : (o3_function ? o3_function() : 'No Function'));
  
  
  
  	return 0;
  
  }
  
  
  
  // Handle hovering
  
  function opt_NOCLOSE(unused) {
  
  	if (!unused) o3_close = "";
  
  
  
  	if (olNs4) {
  
  		over.captureEvents(Event.MOUSEOUT || Event.MOUSEOVER);
  
  		over.onmouseover = function () { if (o3_timerid > 0) { clearTimeout(o3_timerid); o3_timerid = 0; } }
  
  		over.onmouseout = function (e) { if (olHideDelay) hideDelay(olHideDelay); else cClick(e); }
  
  	} else {
  
  		over.onmouseover = function () {hoveringSwitch = true; if (o3_timerid > 0) { clearTimeout(o3_timerid); o3_timerid =0; } }
  
  	}
  
  
  
  	return 0;
  
  }
  
  
  
  // Function to scan command line arguments for multiples
  
  function opt_MULTIPLEARGS(i, args, parameter) {
  
    var k=i, re, pV, str='';
  
  
  
    for(k=i; k<args.length; k++) {
  
  		if(typeof args[k] == 'number' && args[k]>pmStart) break;
  
  		str += args[k] + ',';
  
  	}
  
  	if (str) str = str.substring(0,--str.length);
  
  
  
  	k--;  // reduce by one so the for loop this is in works correctly
  
  	pV=(olNs4 && /cellpad/i.test(parameter)) ? str.split(',')[0] : str;
  
  	eval(parameter + '="' + pV + '"');
  
  
  
  	return k;
  
  }
  
  
  
  // Remove &nbsp; in texts when done.
  
  function nbspCleanup() {
  
  	if (o3_wrap) {
  
  		o3_text = o3_text.replace(/\&nbsp;/g, ' ');
  
  		o3_cap = o3_cap.replace(/\&nbsp;/g, ' ');
  
  	}
  
  }
  
  
  
  // Escape embedded single quotes in text strings
  
  function escSglQuote(str) {
  
    return str.toString().replace(/'/g,"\\'");
  
  }
  
  
  
  // Onload handler for window onload event
  
  function OLonLoad_handler(e) {
  
  	var re = /\w+\(.*\)[;\s]+/g, olre = /overlib\(|nd\(|cClick\(/, fn, l, i;
  
  
  
  	if(!olLoaded) olLoaded=1;
  
  
  
    // Remove it for Gecko based browsers
  
  	if(window.removeEventListener && e.eventPhase == 3) window.removeEventListener("load",OLonLoad_handler,false);
  
  	else if(window.detachEvent) { // and for IE and Opera 4.x but execute calls to overlib, nd, or cClick()
  
  		window.detachEvent("onload",OLonLoad_handler);
  
  		var fN = document.body.getAttribute('onload');
  
  		if (fN) {
  
  			fN=fN.toString().match(re);
  
  			if (fN && fN.length) {
  
  				for (i=0; i<fN.length; i++) {
  
  					if (/anonymous/.test(fN[i])) continue;
  
  					while((l=fN[i].search(/\)[;\s]+/)) != -1) {
  
  						fn=fN[i].substring(0,l+1);
  
  						fN[i] = fN[i].substring(l+2);
  
  						if (olre.test(fn)) eval(fn);
  
  					}
  
  				}
  
  			}
  
  		}
  
  	}
  
  }
  
  
  
  // Wraps strings in Layer Generation Functions with the correct tags
  
  //    endWrap true(if end tag) or false if start tag
  
  //    fontSizeStr - font size string such as '1' or '10px'
  
  //    whichString is being wrapped -- 'text', 'caption', or 'close'
  
  function wrapStr(endWrap,fontSizeStr,whichString) {
  
  	var fontStr, fontColor, isClose=((whichString=='close') ? 1 : 0), hasDims=/[%\-a-z]+$/.test(fontSizeStr);
  
  	fontSizeStr = (olNs4) ? (!hasDims ? fontSizeStr : '1') : fontSizeStr;
  
  	if (endWrap) return (hasDims&&!olNs4) ? (isClose ? '</span>' : '</div>') : '</font>';
  
  	else {
  
  		fontStr='o3_'+whichString+'font';
  
  		fontColor='o3_'+((whichString=='caption')? 'cap' : whichString)+'color';
  
  		return (hasDims&&!olNs4) ? (isClose ? '<span style="font-family: '+quoteMultiNameFonts(eval(fontStr))+'; color: '+eval(fontColor)+'; font-size: '+fontSizeStr+';">' : '<div style="font-family: '+quoteMultiNameFonts(eval(fontStr))+'; color: '+eval(fontColor)+'; font-size: '+fontSizeStr+';">') : '<font face="'+eval(fontStr)+'" color="'+eval(fontColor)+'" size="'+(parseInt(fontSizeStr)>7 ? '7' : fontSizeStr)+'">';
  
  	}
  
  }
  
  
  
  // Quotes Multi word font names; needed for CSS Standards adherence in font-family
  
  function quoteMultiNameFonts(theFont) {
  
  	var v, pM=theFont.split(',');
  
  	for (var i=0; i<pM.length; i++) {
  
  		v=pM[i];
  
  		v=v.replace(/^\s+/,'').replace(/\s+$/,'');
  
  		if(/\s/.test(v) && !/['"]/.test(v)) {
  
  			v="\'"+v+"\'";
  
  			pM[i]=v;
  
  		}
  
  	}
  
  	return pM.join();
  
  }
  
  
  
  // dummy function which will be overridden 
  
  function isExclusive(args) {
  
  	return false;
  
  }
  
  
  
  // Sets cellpadding style string value
  
  function setCellPadStr(parameter) {
  
  	var Str='', j=0, ary = new Array(), top, bottom, left, right;
  
  
  
  	Str+='padding: ';
  
  	ary=parameter.replace(/\s+/g,'').split(',');
  
  
  
  	switch(ary.length) {
  
  		case 2:
  
  			top=bottom=ary[j];
  
  			left=right=ary[++j];
  
  			break;
  
  		case 3:
  
  			top=ary[j];
  
  			left=right=ary[++j];
  
  			bottom=ary[++j];
  
  			break;
  
  		case 4:
  
  			top=ary[j];
  
  			right=ary[++j];
  
  			bottom=ary[++j];
  
  			left=ary[++j];
  
  			break;
  
  	}
  
  
  
  	Str+= ((ary.length==1) ? ary[0] + 'px;' : top + 'px ' + right + 'px ' + bottom + 'px ' + left + 'px;');
  
  
  
  	return Str;
  
  }
  
  
  
  // function will delay close by time milliseconds
  
  function hideDelay(time) {
  
  	if (time&&!o3_delay) {
  
  		if (o3_timerid > 0) clearTimeout(o3_timerid);
  
  
  
  		o3_timerid=setTimeout("cClick()",(o3_timeout=time));
  
  	}
  
  }
  
  
  
  // Was originally in the placeLayer() routine; separated out for future ease
  
  function horizontalPlacement(browserWidth, horizontalScrollAmount, widthFix) {
  
  	var placeX, iwidth=browserWidth, winoffset=horizontalScrollAmount;
  
  	var parsedWidth = parseInt(o3_width);
  
  
  
  	if (o3_fixx > -1 || o3_relx != null) {
  
  		// Fixed position
  
  		placeX=(o3_relx != null ? ( o3_relx < 0 ? winoffset +o3_relx+ iwidth - parsedWidth - widthFix : winoffset+o3_relx) : o3_fixx);
  
  	} else {  
  
  		// If HAUTO, decide what to use.
  
  		if (o3_hauto == 1) {
  
  			if ((o3_x - winoffset) > (iwidth / 2)) {
  
  				o3_hpos = LEFT;
  
  			} else {
  
  				o3_hpos = RIGHT;
  
  			}
  
  		}  		
  
  
  
  		// From mouse
  
  		if (o3_hpos == CENTER) { // Center
  
  			placeX = o3_x+o3_offsetx-(parsedWidth/2);
  
  
  
  			if (placeX < winoffset) placeX = winoffset;
  
  		}
  
  
  
  		if (o3_hpos == RIGHT) { // Right
  
  			placeX = o3_x+o3_offsetx;
  
  
  
  			if ((placeX+parsedWidth) > (winoffset+iwidth - widthFix)) {
  
  				placeX = iwidth+winoffset - parsedWidth - widthFix;
  
  				if (placeX < 0) placeX = 0;
  
  			}
  
  		}
  
  		if (o3_hpos == LEFT) { // Left
  
  			placeX = o3_x-o3_offsetx-parsedWidth;
  
  			if (placeX < winoffset) placeX = winoffset;
  
  		}  	
  
  
  
  		// Snapping!
  
  		if (o3_snapx > 1) {
  
  			var snapping = placeX % o3_snapx;
  
  
  
  			if (o3_hpos == LEFT) {
  
  				placeX = placeX - (o3_snapx+snapping);
  
  			} else {
  
  				// CENTER and RIGHT
  
  				placeX = placeX+(o3_snapx - snapping);
  
  			}
  
  
  
  			if (placeX < winoffset) placeX = winoffset;
  
  		}
  
  	}	
  
  
  
  	return placeX;
  
  }
  
  
  
  // was originally in the placeLayer() routine; separated out for future ease
  
  function verticalPlacement(browserHeight,verticalScrollAmount) {
  
  	var placeY, iheight=browserHeight, scrolloffset=verticalScrollAmount;
  
  	var parsedHeight=(o3_aboveheight ? parseInt(o3_aboveheight) : (olNs4 ? over.clip.height : over.offsetHeight));
  
  
  
  	if (o3_fixy > -1 || o3_rely != null) {
  
  		// Fixed position
  
  		placeY=(o3_rely != null ? (o3_rely < 0 ? scrolloffset+o3_rely+iheight - parsedHeight : scrolloffset+o3_rely) : o3_fixy);
  
  	} else {
  
  		// If VAUTO, decide what to use.
  
  		if (o3_vauto == 1) {
  
  			if ((o3_y - scrolloffset) > (iheight / 2) && o3_vpos == BELOW && (o3_y + parsedHeight + o3_offsety - (scrolloffset + iheight) > 0)) {
  
  				o3_vpos = ABOVE;
  
  			} else if (o3_vpos == ABOVE && (o3_y - (parsedHeight + o3_offsety) - scrolloffset < 0)) {
  
  				o3_vpos = BELOW;
  
  			}
  
  		}
  
  
  
  		// From mouse
  
  		if (o3_vpos == ABOVE) {
  
  			if (o3_aboveheight == 0) o3_aboveheight = parsedHeight; 
  
  
  
  			placeY = o3_y - (o3_aboveheight+o3_offsety);
  
  			if (placeY < scrolloffset) placeY = scrolloffset;
  
  		} else {
  
  			// BELOW
  
  			placeY = o3_y+o3_offsety;
  
  		} 
  
  
  
  		// Snapping!
  
  		if (o3_snapy > 1) {
  
  			var snapping = placeY % o3_snapy;  			
  
  
  
  			if (o3_aboveheight > 0 && o3_vpos == ABOVE) {
  
  				placeY = placeY - (o3_snapy+snapping);
  
  			} else {
  
  				placeY = placeY+(o3_snapy - snapping);
  
  			} 			
  
  
  
  			if (placeY < scrolloffset) placeY = scrolloffset;
  
  		}
  
  	}
  
  
  
  	return placeY;
  
  }
  
  
  
  // checks positioning flags
  
  function checkPositionFlags() {
  
  	if (olHautoFlag) olHautoFlag = o3_hauto=0;
  
  	if (olVautoFlag) olVautoFlag = o3_vauto=0;
  
  	return true;
  
  }
  
  
  
  // get Browser window width
  
  function windowWidth() {
  
  	var w;
  
  	if (o3_frame.innerWidth) w=o3_frame.innerWidth;
  
  	else if (eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientWidth=='number'")&&eval('o3_frame.'+docRoot+'.clientWidth')) 
  
  		w=eval('o3_frame.'+docRoot+'.clientWidth');
  
  	return w;			
  
  }
  
  
  
  // create the div container for popup content if it doesn't exist
  
  function createDivContainer(id,frm,zValue) {
  
  	id = (id || 'overDiv'), frm = (frm || o3_frame), zValue = (zValue || 1000);
  
  	var objRef, divContainer = layerReference(id);
  
  
  
  	if (divContainer == null) {
  
  		if (olNs4) {
  
  			divContainer = frm.document.layers[id] = new Layer(window.innerWidth, frm);
  
  			objRef = divContainer;
  
  		} else {
  
  			var body = (olIe4 ? frm.document.all.tags('BODY')[0] : frm.document.getElementsByTagName("BODY")[0]);
  
  			if (olIe4&&!document.getElementById) {
  
  				body.insertAdjacentHTML("beforeEnd",'<div id="'+id+'"></div>');
  
  				divContainer=layerReference(id);
  
  			} else {
  
  				divContainer = frm.document.createElement("DIV");
  
  				divContainer.id = id;
  
  				body.appendChild(divContainer);
  
  			}
  
  			objRef = divContainer.style;
  
  		}
  
  
  
  		objRef.position = 'absolute';
  
  		objRef.visibility = 'hidden';
  
  		objRef.zIndex = zValue;
  
  		if (olIe4&&!olOp) objRef.left = objRef.top = '0px';
  
  		else objRef.left = objRef.top =  -10000 + (!olNs4 ? 'px' : 0);
  
  	}
  
  
  
  	return divContainer;
  
  }
  
  
  
  // get reference to a layer with ID=id
  
  function layerReference(id) {
  
  	return (olNs4 ? o3_frame.document.layers[id] : (document.all ? o3_frame.document.all[id] : o3_frame.document.getElementById(id)));
  
  }
  
  ////////
  
  //  UTILITY FUNCTIONS
  
  ////////
  
  
  
  // Checks if something is a function.
  
  function isFunction(fnRef) {
  
  	var rtn = true;
  
  
  
  	if (typeof fnRef == 'object') {
  
  		for (var i = 0; i < fnRef.length; i++) {
  
  			if (typeof fnRef[i]=='function') continue;
  
  			rtn = false;
  
  			break;
  
  		}
  
  	} else if (typeof fnRef != 'function') {
  
  		rtn = false;
  
  	}
  
  	
  
  	return rtn;
  
  }
  
  
  
  // Converts an array into an argument string for use in eval.
  
  function argToString(array, strtInd, argName) {
  
  	var jS = strtInd, aS = '', ar = array;
  
  	argName=(argName ? argName : 'ar');
  
  	
  
  	if (ar.length > jS) {
  
  		for (var k = jS; k < ar.length; k++) aS += argName+'['+k+'], ';
  
  		aS = aS.substring(0, aS.length-2);
  
  	}
  
  	
  
  	return aS;
  
  }
  
  
  
  // Places a hook in the correct position in a hook point.
  
  function reOrder(hookPt, fnRef, order) {
  
  	var newPt = new Array(), match, i, j;
  
  
  
  	if (!order || typeof order == 'undefined' || typeof order == 'number') return hookPt;
  
  	
  
  	if (typeof order=='function') {
  
  		if (typeof fnRef=='object') {
  
  			newPt = newPt.concat(fnRef);
  
  		} else {
  
  			newPt[newPt.length++]=fnRef;
  
  		}
  
  		
  
  		for (i = 0; i < hookPt.length; i++) {
  
  			match = false;
  
  			if (typeof fnRef == 'function' && hookPt[i] == fnRef) {
  
  				continue;
  
  			} else {
  
  				for(j = 0; j < fnRef.length; j++) if (hookPt[i] == fnRef[j]) {
  
  					match = true;
  
  					break;
  
  				}
  
  			}
  
  			if (!match) newPt[newPt.length++] = hookPt[i];
  
  		}
  
  
  
  		newPt[newPt.length++] = order;
  
  
  
  	} else if (typeof order == 'object') {
  
  		if (typeof fnRef == 'object') {
  
  			newPt = newPt.concat(fnRef);
  
  		} else {
  
  			newPt[newPt.length++] = fnRef;
  
  		}
  
  		
  
  		for (j = 0; j < hookPt.length; j++) {
  
  			match = false;
  
  			if (typeof fnRef == 'function' && hookPt[j] == fnRef) {
  
  				continue;
  
  			} else {
  
  				for (i = 0; i < fnRef.length; i++) if (hookPt[j] == fnRef[i]) {
  
  					match = true;
  
  					break;
  
  				}
  
  			}
  
  			if (!match) newPt[newPt.length++]=hookPt[j];
  
  		}
  
  
  
  		for (i = 0; i < newPt.length; i++) hookPt[i] = newPt[i];
  
  		newPt.length = 0;
  
  		
  
  		for (j = 0; j < hookPt.length; j++) {
  
  			match = false;
  
  			for (i = 0; i < order.length; i++) {
  
  				if (hookPt[j] == order[i]) {
  
  					match = true;
  
  					break;
  
  				}
  
  			}
  
  			if (!match) newPt[newPt.length++] = hookPt[j];
  
  		}
  
  		newPt = newPt.concat(order);
  
  	}
  
  
  
  	hookPt = newPt;
  
  
  
  	return hookPt;
  
  }
  
  
  
  ////////
  
  //  PLUGIN ACTIVATION FUNCTIONS
  
  ////////
  
  
  
  // Runs plugin functions to set runtime variables.
  
  function setRunTimeVariables(){
  
  	if (typeof runTime != 'undefined' && runTime.length) {
  
  		for (var k = 0; k < runTime.length; k++) {
  
  			runTime[k]();
  
  		}
  
  	}
  
  }
  
  
  
  // Runs plugin functions to parse commands.
  
  function parseCmdLine(pf, i, args) {
  
  	if (typeof cmdLine != 'undefined' && cmdLine.length) { 
  
  		for (var k = 0; k < cmdLine.length; k++) { 
  
  			var j = cmdLine[k](pf, i, args);
  
  			if (j >- 1) {
  
  				i = j;
  
  				break;
  
  			}
  
  		}
  
  	}
  
  
  
  	return i;
  
  }
  
  
  
  // Runs plugin functions to do things after parse.
  
  function postParseChecks(pf,args){
  
  	if (typeof postParse != 'undefined' && postParse.length) {
  
  		for (var k = 0; k < postParse.length; k++) {
  
  			if (postParse[k](pf,args)) continue;
  
  			return false;  // end now since have an error
  
  		}
  
  	}
  
  	return true;
  
  }
  
  
  
  
  
  ////////
  
  //  PLUGIN REGISTRATION FUNCTIONS
  
  ////////
  
  
  
  // Registers commands and creates constants.
  
  function registerCommands(cmdStr) {
  
  	if (typeof cmdStr!='string') return;
  
  
  
  	var pM = cmdStr.split(',');
  
  	pms = pms.concat(pM);
  
  
  
  	for (var i = 0; i< pM.length; i++) {
  
  		eval(pM[i].toUpperCase()+'='+pmCount++);
  
  	}
  
  }
  
  
  
  // Registers no-parameter commands
  
  function registerNoParameterCommands(cmdStr) {
  
  	if (!cmdStr && typeof cmdStr != 'string') return;
  
  	pmt=(!pmt) ? cmdStr : pmt + ',' + cmdStr;
  
  }
  
  
  
  // Register a function to hook at a certain point.
  
  function registerHook(fnHookTo, fnRef, hookType, optPm) {
  
  	var hookPt, last = typeof optPm;
  
  	
  
  	if (fnHookTo == 'plgIn'||fnHookTo == 'postParse') return;
  
  	if (typeof hookPts[fnHookTo] == 'undefined') hookPts[fnHookTo] = new FunctionReference();
  
  
  
  	hookPt = hookPts[fnHookTo];
  
  
  
  	if (hookType != null) {
  
  		if (hookType == FREPLACE) {
  
  			hookPt.ovload = fnRef;  // replace normal overlib routine
  
  			if (fnHookTo.indexOf('ol_content_') > -1) hookPt.alt[pms[CSSOFF-1-pmStart]]=fnRef; 
  
  
  
  		} else if (hookType == FBEFORE || hookType == FAFTER) {
  
  			var hookPt=(hookType == 1 ? hookPt.before : hookPt.after);
  
  
  
  			if (typeof fnRef == 'object') {
  
  				hookPt = hookPt.concat(fnRef);
  
  			} else {
  
  				hookPt[hookPt.length++] = fnRef;
  
  			}
  
  
  
  			if (optPm) hookPt = reOrder(hookPt, fnRef, optPm);
  
  
  
  		} else if (hookType == FALTERNATE) {
  
  			if (last=='number') hookPt.alt[pms[optPm-1-pmStart]] = fnRef;
  
  		} else if (hookType == FCHAIN) {
  
  			hookPt = hookPt.chain; 
  
  			if (typeof fnRef=='object') hookPt=hookPt.concat(fnRef); // add other functions 
  
  			else hookPt[hookPt.length++]=fnRef;
  
  		}
  
  
  
  		return;
  
  	}
  
  }
  
  
  
  // Register a function that will set runtime variables.
  
  function registerRunTimeFunction(fn) {
  
  	if (isFunction(fn)) {
  
  		if (typeof fn == 'object') {
  
  			runTime = runTime.concat(fn);
  
  		} else {
  
  			runTime[runTime.length++] = fn;
  
  		}
  
  	}
  
  }
  
  
  
  // Register a function that will handle command parsing.
  
  function registerCmdLineFunction(fn){
  
  	if (isFunction(fn)) {
  
  		if (typeof fn == 'object') {
  
  			cmdLine = cmdLine.concat(fn);
  
  		} else {
  
  			cmdLine[cmdLine.length++] = fn;
  
  		}
  
  	}
  
  }
  
  
  
  // Register a function that does things after command parsing. 
  
  function registerPostParseFunction(fn){
  
  	if (isFunction(fn)) {
  
  		if (typeof fn == 'object') {
  
  			postParse = postParse.concat(fn);
  
  		} else {
  
  			postParse[postParse.length++] = fn;
  
  		}
  
  	}
  
  }
  
  
  
  ////////
  
  //  PLUGIN REGISTRATION FUNCTIONS
  
  ////////
  
  
  
  // Runs any hooks registered.
  
  function runHook(fnHookTo, hookType) {
  
  	var l = hookPts[fnHookTo], k, rtnVal = null, optPm, arS, ar = runHook.arguments;
  
  
  
  	if (hookType == FREPLACE) {
  
  		arS = argToString(ar, 2);
  
  
  
  		if (typeof l == 'undefined' || !(l = l.ovload)) rtnVal = eval(fnHookTo+'('+arS+')');
  
  		else rtnVal = eval('l('+arS+')');
  
  
  
  	} else if (hookType == FBEFORE || hookType == FAFTER) {
  
  		if (typeof l != 'undefined') {
  
  			l=(hookType == 1 ? l.before : l.after);
  
  	
  
  			if (l.length) {
  
  				arS = argToString(ar, 2);
  
  				for (var k = 0; k < l.length; k++) eval('l[k]('+arS+')');
  
  			}
  
  		}
  
  	} else if (hookType == FALTERNATE) {
  
  		optPm = ar[2];
  
  		arS = argToString(ar, 3);
  
  
  
  		if (typeof l == 'undefined' || (l = l.alt[pms[optPm-1-pmStart]]) == 'undefined') {
  
  			rtnVal = eval(fnHookTo+'('+arS+')');
  
  		} else {
  
  			rtnVal = eval('l('+arS+')');
  
  		}
  
  	} else if (hookType == FCHAIN) {
  
  		arS=argToString(ar,2);
  
  		l=l.chain;
  
  
  
  		for (k=l.length; k > 0; k--) if((rtnVal=eval('l[k-1]('+arS+')'))!=void(0)) break;
  
  	}
  
  
  
  	return rtnVal;
  
  }
  
  
  
  ////////
  
  // OBJECT CONSTRUCTORS
  
  ////////
  
  
  
  // Object for handling hooks.
  
  function FunctionReference() {
  
  	this.ovload = null;
  
  	this.before = new Array();
  
  	this.after = new Array();
  
  	this.alt = new Array();
  
  	this.chain = new Array();
  
  }
  
  
  
  // Object for simple access to the overLIB version used.
  
  // Examples: simpleversion:351 major:3 minor:5 revision:1
  
  function Info(version, prerelease) {
  
  	this.version = version;
  
  	this.prerelease = prerelease;
  
  
  
  	this.simpleversion = Math.round(this.version*100);
  
  	this.major = parseInt(this.simpleversion / 100);
  
  	this.minor = parseInt(this.simpleversion / 10) - this.major * 10;
  
  	this.revision = parseInt(this.simpleversion) - this.major * 100 - this.minor * 10;
  
  	this.meets = meets;
  
  }
  
  
  
  // checks for Core Version required
  
  function meets(reqdVersion) {
  
  	return (!reqdVersion) ? false : this.simpleversion >= Math.round(100*parseFloat(reqdVersion));
  
  }
  
  
  
  
  
  ////////
  
  // STANDARD REGISTRATIONS
  
  ////////
  
  registerHook("ol_content_simple", ol_content_simple, FALTERNATE, CSSOFF);
  
  registerHook("ol_content_caption", ol_content_caption, FALTERNATE, CSSOFF);
  
  registerHook("ol_content_background", ol_content_background, FALTERNATE, CSSOFF);
  
  registerHook("ol_content_simple", ol_content_simple, FALTERNATE, CSSCLASS);
  
  registerHook("ol_content_caption", ol_content_caption, FALTERNATE, CSSCLASS);
  
  registerHook("ol_content_background", ol_content_background, FALTERNATE, CSSCLASS);
  
  registerPostParseFunction(checkPositionFlags);
  
  registerHook("hideObject", nbspCleanup, FAFTER);
  
  registerHook("horizontalPlacement", horizontalPlacement, FCHAIN);
  
  registerHook("verticalPlacement", verticalPlacement, FCHAIN);
  
  if (olNs4||(olIe5&&isMac)||olKq) olLoaded=1;
  
  registerNoParameterCommands('sticky,autostatus,autostatuscap,fullhtml,hauto,vauto,closeclick,wrap,followmouse,mouseoff,compatmode');
  
  ///////
  
  // ESTABLISH MOUSECAPTURING
  
  ///////
  
  
  
  // Capture events, alt. diffuses the overlib function.
  
  var olCheckMouseCapture=true;
  
  if ((olNs4 || olNs6 || olIe4)) {
  
  	olMouseCapture();
  
  } else {
  
  	overlib = no_overlib;
  
  	nd = no_overlib;
  
  	ver3fix = true;
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_anchor.js
  
  Index: overlib_anchor.js
  ===================================================================
  //\/////
  
  //\  overLIB Anchor Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.10 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                      $Date$
  
  //\/////
  
  //\mini
  
  
  
  
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the Anchor Plugin.');
  
  else {
  
  registerCommands('anchor,anchorx,anchory,noanchorwarn,anchoralign');
  
  
  
  
  
  
  
  ////////
  
  // DEFAULT CONFIGURATION
  
  // Settings you want everywhere are set here. All of this can also be
  
  // changed on your html page or through an overLIB call.
  
  ////////
  
  if (typeof ol_anchor ==  'undefined') var ol_anchor = '';
  
  if (typeof ol_anchorx ==  'undefined') var ol_anchorx = 0;
  
  if (typeof ol_anchory ==  'undefined') var ol_anchory = 0;
  
  if (typeof ol_noanchorwarn ==  'undefined') var ol_noanchorwarn = 1;
  
  if (typeof ol_anchoralign ==  'undefined') var ol_anchoralign = 'UL';
  
  
  
  ////////
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  
  
  
  
  
  
  
  
  
  
  ////////
  
  // INIT
  
  ////////
  
  // Runtime variables init. Don't change for config!
  
  var o3_anchor = "";
  
  var o3_anchorx = 0;
  
  var o3_anchory = 0;
  
  var o3_noanchorwarn = 1;
  
  var o3_anchoralign = 'UL';
  
  var mrkObj, rmrkPosition;  //reference mark object, reference mark position, an array;
  
  
  
  
  
  ////////
  
  // PLUGIN FUNCTIONS
  
  ////////
  
  function setAnchorVariables() {
  
  	o3_anchor = ol_anchor;
  
  	o3_anchorx = ol_anchorx;
  
  	o3_anchory = ol_anchory;
  
  	o3_noanchorwarn = ol_noanchorwarn;
  
  	o3_anchoralign = ol_anchoralign;
  
  	mrkObj = null;  // initialize this variable
  
  }
  
  
  
  // Parses Reference Mark commands
  
  function parseAnchorExtras(pf,i,ar) {
  
  	var v, k=i;
  
  
  
  	if (k < ar.length) {
  
  		if (ar[k] ==  ANCHOR) { eval(pf + "anchor = '" + escSglQuote(ar[++k]) + "'"); return k; }
  
  		if (ar[k] ==  ANCHORX) { eval(pf + 'anchorx = ' + ar[++k]); return k; }
  
  		if (ar[k] ==  ANCHORY) { eval(pf + 'anchory = ' + ar[++k]); return k; }
  
  		if (ar[k] ==  NOANCHORWARN) { eval(pf + 'noanchorwarn = (' + pf + 'noanchorwarn==1) ? 0 : 1'); return k; }
  
  		if (ar[k] ==  ANCHORALIGN) { k = opt_MULTIPLEARGS(++k, ar, (pf + 'anchoralign'));  return k; }
  
  	}
  
  
  
  	return -1;
  
  }
  
  
  
  
  
  ///////
  
  //  FUNCTION WHICH CHECKS FOR THE EXISTENCE OF A REFERENCE MARKER
  
  ///////
  
  function checkAnchorObject() {
  
  	var w = o3_anchor;
  
  
  
  	if (w) {
  
  		if (!(mrkObj = getAnchorObjectRef(w))) {
  
  			if (o3_noanchorwarn) {
  
  				alert('WARNING!  Reference mark "' + w + '" not found.');
  
  				return false;
  
  			} else w = '';
  
  		}
  
  	}
  
  
  
  	return true;
  
  }
  
  
  
  ///////
  
  // EXTERNAL SUPPORT FUNCTIONS TO HANDLE ANCHOR PROPERTIES
  
  ///////
  
  
  
  // Horizontal placement routine with anchors
  
  function anchorHorizontal(browserWidth, horizontalScrollAmount, widthFix) {
  
  	var hasAnchor = (typeof o3_anchor != 'undefined' && o3_anchor);
  
  	if (!hasAnchor) return void(0);
  
  
  
  	// set o3_relx for follow scroll if defined
  
  	if (typeof o3_followscroll != 'undefined' && o3_followscroll && o3_sticky) o3_relx = rmrkPosition[0];
  
  
  
  	return rmrkPosition[0];
  
  }
  
  
  
  // Vertical placement routine with anchors
  
  function anchorVertical(browserHeight,verticalScrollAmount) {
  
  	var hasAnchor = (typeof o3_anchor != 'undefined' && o3_anchor);	
  
  	if (!hasAnchor) return void(0);
  
  
  
  	// set o3_rely for follow scroll if defined
  
  	if (typeof o3_followscroll != 'undefined' && o3_followscroll && o3_sticky) o3_rely = rmrkPosition[1];
  
  
  
  	return rmrkPosition[1];
  
  }
  
  
  
  // Stub function for the runHook routine
  
  function anchorPreface() {
  
  	if (!mrkObj) return;
  
  	rmrkPosition = getAnchorLocation(mrkObj);
  
  }
  
  
  
  // Get Reference Mark object 
  
  function getAnchorObjectRef(aObj) {
  
  	return getRefById(aObj, o3_frame.document) || getRefByName(aObj, o3_frame.document)
  
  }
  
  
  
  // Adapted to overlib from jwin by Jason Anderson -- http://www.jwinlib.com
  
  function getAnchorLocation(objRef){
  
  	var mkObj, of, offsets, mlyr
  
  	
  
  	mkObj = mlyr = objRef
  
  	offsets = [o3_anchorx, o3_anchory]
  
  	
  
  	if (document.layers){
  
  		if (typeof mlyr.length != 'undefined' &&  mlyr.length > 1) {
  
  				mkObj = mlyr[0]
  
  				offsets[0] += mlyr[0].x + mlyr[1].pageX
  
  				offsets[1] += mlyr[0].y + mlyr[1].pageY
  
  			} else {
  
  				if(mlyr.toString().indexOf('Image') != -1 || mlyr.toString().indexOf('Anchor') != -1){
  
  					offsets[0] += mlyr.x
  
  					offsets[1] += mlyr.y
  
  				} else {
  
  					offsets[0] += mlyr.pageX
  
  					offsets[1] += mlyr.pageY
  
  				}
  
  			}          
  
  	} else {
  
  		offsets[0] += pageLocation(mlyr, 'Left')
  
  		offsets[1] += pageLocation(mlyr, 'Top')
  
  	}
  
  	
  
  	of = getAnchorOffsets(mkObj)
  
  	
  
  	if (typeof o3_dragimg != 'undefined' &&  o3_dragimg) {
  
  		olImgLeft = offsets[0];
  
  		olImgTop = offsets[1];
  
  	}
  
  	
  
  	offsets[0] += of[0]                    
  
  	offsets[1] += of[1]
  
  	
  
  	if (typeof o3_dragimg != 'undefined' &&  o3_dragimg) {
  
  		olImgRight = offsets[0]; 
  
  		olImgBottom = offsets[1];
  
  		return;
  
  	}
  
  	
  
  	return offsets;
  
  }
  
  
  
  // Adapted to overlib from jwin by Jason Anderson -- http://www.jwinlib.com
  
  function getAnchorOffsets(mkObj){
  
  	var fx = fy = 0,  mp, puc, mkAry, sx = sy = 0, w = o3_anchoralign  
  
  	var mW = mH = pW = pH = 0
  
  	var off = [0, 0]
  
  
  
  	mkAry = w.split(',');
  
  
  
  	if (mkAry.length < 3) {
  
  		mp = mkAry[0].toUpperCase();
  
  		puc = (mkAry.length == 1) ? mp : mkAry[1].toUpperCase();
  
  	} else if (mkAry.length == 3) {
  
  		if (!isNaN(mkAry[0])) {
  
  			mp = mkAry.slice(0, 2);
  
  			puc = mkAry[2].toUpperCase();
  
  		 } else {
  
  			mp = mkAry[0].toUpperCase();
  
  			puc = mkAry.slice(1);
  
  		 }
  
  	} else {
  
  		mp = mkAry.slice(0, 2);
  
  		puc = mkAry.slice(2);
  
  	}
  
  
  
  	var shdwPresent = typeof o3_shadow != 'undefined' &&  o3_shadow
  
  
  
  	if (shdwPresent) {
  
  		sx = Math.abs(o3_shadowx);
  
  		sy = Math.abs(o3_shadowy);
  
  	}
  
  
  
  	pW = (shdwPresent ? parseInt(o3_width) : (olNs4 ? over.clip.width : over.offsetWidth))
  
  	pH = (shdwPresent ? parseInt(o3_aboveheight) : (olNs4 ? over.clip.height : over.offsetHeight))
  
  
  
  	if (olOp &&  o3_wrap) {
  
  		pW = (shdwPresent ? parseInt(o3_width) : (olNs4 ? over.clip.width : over.offsetWidth))
  
  		pH = (shdwPresent ? parseInt(o3_aboveheight) : (olNs4 ? over.clip.height : over.offsetHeight))
  
  	}
  
  
  
  	if (!olOp &&  mkObj.toString().indexOf('Image') != -1){
  
  		mW = mkObj.width
  
  		mH = mkObj.height
  
  	} else if (!olOp &&  mkObj.toString().indexOf('Anchor') != -1) {  // enforced only for NS4
  
  		mp = 'UL'
  
  	} else {
  
  		mW = (olNs4) ? mkObj.clip.width : mkObj.offsetWidth
  
  		mH = (olNs4) ? mkObj.clip.height : mkObj.offsetHeight
  
  	}
  
  
  
  	if (!isNaN(mp) || typeof mp == 'object') {
  
  		if (typeof mp == 'object') {
  
  			fx = parseFloat(mp[0]);
  
  			fy = parseFloat(mp[1]);
  
  		} else
  
  			fx = fy = parseFloat(mp);
  
  		off = [Math.round(fx*mW), Math.round(fy*mH)];
  
  	} else {
  
  		 if (mp == 'UR') off = [mW, 0]
  
  		 else if (mp == 'LL') off = [0, mH]
  
  		 else if (mp == 'LR') off = [mW, mH]
  
  	}
  
  
  
  	if (typeof o3_dragimg != 'undefined' &&  o3_dragimg) return off;
  
  	else {
  
  		if (!isNaN(puc) || typeof puc == 'object' ) {
  
  			if (typeof puc == 'object') {
  
  				fx = parseFloat(puc[0]);
  
  				fy = parseFloat(puc[1]);
  
  			} else
  
  				fx = fy = parseFloat(puc);
  
  			off[0] -= Math.round(fx*(pW - sx));
  
  			off[1] -= Math.round(fy*(pH - sy));
  
  		} else {
  
  			if (puc == 'UR') {
  
  				off[0] -= (pW - sx); 
  
  				off[1] -= sy
  
  			} else if (puc == 'LL') {
  
  				off[0] -= sx;
  
  				off[1] -= (pH - sy)
  
  			} else if (puc == 'LR') {
  
  				off[0] -= (pW-sx);
  
  				off[1] -= (pH - sy)
  
  			}
  
  		}
  
  		return off
  
  	}
  
  }
  
  
  
  // Adapted to overlib from jwin by Jason Anderson -- http://www.jwinlib.com
  
  function pageLocation(o, t){
  
  	var x = 0
  
  
  
  	while(o.offsetParent){
  
  		x += o['offset' + t]
  
  		o = o.offsetParent
  
  	}
  
  	x += o['offset' + t]
  
  
  
  	return x
  
  } 
  
  
  
  // Adapted to overlib from jwin by Jason Anderson -- http://www.jwinlib.com
  
  function getRefById(l, d){
  
  	var r = "", j
  
  
  
  	d = (d || document)
  
  	if (d.all) return d.all[l]    
  
  	else if (d.getElementById) return d.getElementById(l)
  
  	else if (d.layers &&  d.layers.length > 0) {
  
  		if (d.layers[l]) return d.layers[l]
  
  		
  
  		for (j=0; j < d.layers.length; j++) {
  
  			r = getRefById(l, d.layers[j].document)
  
  			if(r) return r               
  
  		}
  
  	}
  
  
  
  	return false
  
  }
  
  
  
  // Adapted to overlib from jwin by Jason Anderson -- http://www.jwinlib.com
  
  function getRefByName(l, d) {
  
  	var r = null, j
  
  
  
  	d = (d || document)
  
  
  
  	if (d.images[l]) return d.images[l]
  
  	else if (d.anchors[l]) return d.anchors[l];
  
  	else if (d.layers &&  d.layers.length > 0) {
  
  		for (j=0; j < d.layers.length; j++) {
  
  			r = getRefByName(l, d.layers[j].document)
  
  			if (r &&  r.length > 0) return r
  
  			else if (r) return [r, d.layers[j]]
  
  		}
  
  	}
  
  
  
  	return null
  
  }
  
  
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerRunTimeFunction(setAnchorVariables);
  
  registerCmdLineFunction(parseAnchorExtras);
  
  registerPostParseFunction(checkAnchorObject);
  
  registerHook("createPopup", anchorPreface, FAFTER);
  
  registerHook("horizontalPlacement", anchorHorizontal, FCHAIN);
  
  registerHook("verticalPlacement", anchorVertical, FCHAIN);
  
  if(olInfo.meets(4.10)) registerNoParameterCommands('noanchorwarn');
  
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_centerpopup.js
  
  Index: overlib_centerpopup.js
  ===================================================================
  //\/////
  
  //\  overLIB Center Popup Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.10 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                $Date$
  
  //
  
  //\/////
  
  //\mini
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the Center Popup Plugin.');
  
  else {
  
  registerCommands('centerpopup,centeroffset');
  
  ////////
  
  // DEFAULT CONFIGURATION
  
  // You don't have to change anything here if you don't want to. All of this can be
  
  // changed on your html page or through an overLIB call.
  
  ////////
  
  // Default value for centerpopup is to not center the popup
  
  if (typeof ol_centerpopup == 'undefined') var ol_centerpopup = 0;
  
  if (typeof ol_centeroffset == 'undefined') var ol_centeroffset = '0';
  
  ////////
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  ////////
  
  // INIT
  
  ////////
  
  // Runtime variables init. Don't change for config!
  
  var o3_centerpopup = 0;
  
  var o3_centeroffset = '0';
  
  ////////
  
  // PLUGIN FUNCTIONS
  
  ////////
  
  function setCenterPopupVariables() {
  
  	o3_centerpopup = ol_centerpopup;
  
  	o3_centeroffset = ol_centeroffset;
  
  }
  
  // Parses Shadow and Scroll commands
  
  function parseCenterPopupExtras(pf,i,ar) {
  
  	var k = i,v;
  
  
  
  	if (k < ar.length) {
  
  		if (ar[k] == CENTERPOPUP) { eval(pf + 'centerpopup = (' + pf + 'centerpopup == 0) ? 1 : 0'); return k; }
  
  		if (ar[k] == CENTEROFFSET) { k = opt_MULTIPLEARGS(++k,ar,(pf + 'centeroffset')); return k; }
  
  	}
  
  
  
  	return -1;
  
  }
  
  // Function which positions popup in Center of screen
  
  function centerPopupHorizontal(browserWidth, horizontalScrollAmount, widthFix) {
  
  	if (!o3_centerpopup) return void(0);
  
  
  
  	var vdisp = o3_centeroffset.split(',');
  
  	var placeX, iwidth = browserWidth, winoffset = horizontalScrollAmount;
  
    var pWd = parseInt(o3_width);
  
  
  
  	placeX = winoffset + Math.round((iwidth - widthFix - pWd)/2) + parseInt(vdisp[0]);
  
  	if(typeof o3_followscroll != 'undefined' && o3_followscroll && o3_sticky) o3_relx = placeX;
  
  
  
  	return placeX;
  
  }
  
  function centerPopupVertical(browserHeight,verticalScrollAmount) {
  
  	if (!o3_centerpopup) return void(0);
  
  
  
  	var placeY, iheight = browserHeight, scrolloffset = verticalScrollAmount;
  
  	var vdisp = o3_centeroffset.split(',');
  
  	var pHeight = (o3_aboveheight ? parseInt(o3_aboveheight) : (olNs4 ? over.clip.height : over.offsetHeight));
  
  
  
  	placeY = scrolloffset + Math.round((iheight - pHeight)/2) + (vdisp.length > 1 ? parseInt(vdisp[1]) : 0);
  
  	if(typeof o3_followscroll != 'undefined' && o3_followscroll && o3_sticky) o3_rely = placeY;
  
  
  
  	return placeY;
  
  }
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerRunTimeFunction(setCenterPopupVariables);
  
  registerCmdLineFunction(parseCenterPopupExtras);
  
  registerHook('horizontalPlacement',centerPopupHorizontal,FCHAIN);
  
  registerHook('verticalPlacement', centerPopupVertical, FCHAIN);
  
  if(olInfo.meets(4.10)) registerNoParameterCommands('centerpopup');
  
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_crossframe.js
  
  Index: overlib_crossframe.js
  ===================================================================
  //\/////
  
  //\  overLIB Crossframe Support Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                $Date$
  
  //\/////
  
  //\mini
  
  
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the Cross Frame Support Plugin.');
  
  else {
  
  registerCommands('frame');
  
  
  
  
  
  ////////
  
  //  PLUGIN FUNCTIONS
  
  ///////
  
  
  
  // Parses FRAME command
  
  function parseFrameExtras(pf,i,ar) {
  
  	var k = i,v;
  
  
  
  	if (k < ar.length) {
  
  		if (ar[k] == FRAME) { v = ar[++k]; if(pf == 'ol_') ol_frame = v; else opt_FRAME(v); return k; }
  
  	}
  
  
  
  	return -1;
  
  }
  
  
  
  ////////
  
  // SUPPORT FUNCTIONS
  
  ////////
  
  
  
  // Defines which frame we should point to.
  
  function opt_FRAME(frm) {
  
   	o3_frame = frm; 	
  
  	over = createDivContainer('overDiv');	
  
  	return 0;
  
  }
  
  
  
  // Get frame depth of nested frames
  
  function frmDepth(thisFrame,ofrm) {
  
  	var retVal = '';
  
  
  
  	for (var i = 0; i<thisFrame.length; i++) {
  
  		if (thisFrame[i].length > 0) { 
  
  			retVal = frmDepth(thisFrame[i],ofrm);
  
  			if (retVal ==  '') continue;
  
  		} else if (thisFrame[i] != ofrm) continue;
  
  		retVal = '[' + i + ']' + retVal;
  
  		break;
  
  	}
  
  
  
  	return retVal;
  
  }
  
  
  
  // Gets frame reference value relative to top frame
  
  function getFrmRef(srcFrm,tgetFrm) {
  
  	var rtnVal = ''
  
  
  
  	if (tgetFrm != srcFrm) {
  
  		var tFrm = frmDepth(top.frames,tgetFrm)
  
  		var sFrm = frmDepth(top.frames,srcFrm)
  
  		if (sFrm.length ==  tFrm.length) {
  
  			l = tFrm.lastIndexOf('[')
  
  			
  
  			if (l) {
  
  				while ( sFrm.substring(0,l) != tFrm.substring(0,l) )
  
  				l = tFrm.lastIndexOf('[',l-1)
  
  				tFrm = tFrm.substr(l)
  
  				sFrm = sFrm.substr(l)
  
  			}
  
  		}
  
  	
  
  		var cnt = 0, p = '',str = tFrm
  
  		while ((k = str.lastIndexOf('[')) != -1) {
  
  			cnt++ 
  
  			str = str.substring(0,k)
  
  		}
  
  
  
  		for (var i = 0; i<cnt; i++) p = p + 'parent.'
  
  		rtnVal = p + 'frames' + sFrm + '.'
  
  	}
  
   
  
  	return rtnVal
  
  }
  
  
  
  function chkForFrmRef() {
  
  	if(o3_frame != ol_frame) fnRef = getFrmRef(ol_frame,o3_frame)
  
  	return true;
  
  }
  
  
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerCmdLineFunction(parseFrameExtras);
  
  registerPostParseFunction(chkForFrmRef);
  
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_cssstyle.js
  
  Index: overlib_cssstyle.js
  ===================================================================
  //\/////
  
  //\  overLIB CSS Style Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                      $Date$
  
  //\/////
  
  //\mini
  
  
  
  
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the CSS Style Plugin.');
  
  else {
  
  registerCommands('cssstyle,padunit,heightunit,widthunit,textsizeunit,textdecoration,textstyle,textweight,captionsizeunit,captiondecoration,captionstyle,captionweight,closesizeunit,closedecoration,closestyle,closeweight');
  
  
  
  
  
  ////////
  
  // DEFAULT CONFIGURATION
  
  // Settings you want everywhere are set here. All of this can also be
  
  // changed on your html page or through an overLIB call.
  
  ////////
  
  if (typeof ol_padunit=='undefined') var ol_padunit="px";
  
  if (typeof ol_heightunit=='undefined') var ol_heightunit="px";
  
  if (typeof ol_widthunit=='undefined') var ol_widthunit="px";
  
  if (typeof ol_textsizeunit=='undefined') var ol_textsizeunit="px";
  
  if (typeof ol_textdecoration=='undefined') var ol_textdecoration="none";
  
  if (typeof ol_textstyle=='undefined') var ol_textstyle="normal";
  
  if (typeof ol_textweight=='undefined') var ol_textweight="normal";
  
  if (typeof ol_captionsizeunit=='undefined') var ol_captionsizeunit="px";
  
  if (typeof ol_captiondecoration=='undefined') var ol_captiondecoration="none";
  
  if (typeof ol_captionstyle=='undefined') var ol_captionstyle="normal";
  
  if (typeof ol_captionweight=='undefined') var ol_captionweight="bold";
  
  if (typeof ol_closesizeunit=='undefined') var ol_closesizeunit="px";
  
  if (typeof ol_closedecoration=='undefined') var ol_closedecoration="none";
  
  if (typeof ol_closestyle=='undefined') var ol_closestyle="normal";
  
  if (typeof ol_closeweight=='undefined') var ol_closeweight="normal";
  
  
  
  ////////
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  
  
  
  
  
  
  ////////
  
  // INIT
  
  ////////
  
  // Runtime variables init. Don't change for config!
  
  var o3_padunit="px";
  
  var o3_heightunit="px";
  
  var o3_widthunit="px";
  
  var o3_textsizeunit="px";
  
  var o3_textdecoration="";
  
  var o3_textstyle="";
  
  var o3_textweight="";
  
  var o3_captionsizeunit="px";
  
  var o3_captiondecoration="";
  
  var o3_captionstyle="";
  
  var o3_captionweight="";
  
  var o3_closesizeunit="px";
  
  var o3_closedecoration="";
  
  var o3_closestyle="";
  
  var o3_closeweight="";
  
  
  
  
  
  ////////
  
  // PLUGIN FUNCTIONS
  
  ////////
  
  
  
  // Function which sets runtime variables to their default values
  
  function setCSSStyleVariables() {
  
  	o3_padunit=ol_padunit;
  
  	o3_heightunit=ol_heightunit;
  
  	o3_widthunit=ol_widthunit;
  
  	o3_textsizeunit=ol_textsizeunit;
  
  	o3_textdecoration=ol_textdecoration;
  
  	o3_textstyle=ol_textstyle;
  
  	o3_textweight=ol_textweight;
  
  	o3_captionsizeunit=ol_captionsizeunit;
  
  	o3_captiondecoration=ol_captiondecoration;
  
  	o3_captionstyle=ol_captionstyle;
  
  	o3_captionweight=ol_captionweight;
  
  	o3_closesizeunit=ol_closesizeunit;
  
  	o3_closedecoration=ol_closedecoration;
  
  	o3_closestyle=ol_closestyle;
  
  	o3_closeweight=ol_closeweight;
  
  }
  
  
  
  // Parses CSS Style commands.
  
  function parseCSSStyleExtras(pf, i, ar) {
  
  	var k = i;
  
  	
  
  	if (k < ar.length) {
  
  		if (ar[k]==CSSSTYLE) { eval(pf+'css='+ar[k]); return k; }
  
  		if (ar[k]==PADUNIT) { eval(pf+'padunit="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==HEIGHTUNIT) { eval(pf+'heightunit="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==WIDTHUNIT) { eval(pf+'widthunit="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==TEXTSIZEUNIT) { eval(pf+'textsizeunit="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==TEXTDECORATION) { eval(pf+'textdecoration="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==TEXTSTYLE) { eval(pf+'textstyle="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==TEXTWEIGHT) { eval(pf+'textweight="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==CAPTIONSIZEUNIT) { eval(pf+'captionsizeunit="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==CAPTIONDECORATION) { eval(pf+'captiondecoration="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==CAPTIONSTYLE) { eval(pf+'captionstyle="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==CAPTIONWEIGHT) { eval(pf+'captionweight="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==CLOSESIZEUNIT) { eval(pf+'closesizeunit="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==CLOSEDECORATION) { eval(pf+'closedecoration="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==CLOSESTYLE) { eval(pf+'closestyle="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==CLOSEWEIGHT) { eval(pf+'closeweight="'+ar[++k]+'"'); return k; }
  
  	}
  
  	
  
  	return -1;
  
  }
  
  
  
  ////////
  
  // LAYER GENERATION FUNCTIONS
  
  ////////
  
  
  
  // Makes simple table without caption
  
  function ol_content_simple_cssstyle(text) {
  
  	txt = '<table width="'+o3_width+ '" border="0" cellpadding="'+o3_border+'" cellspacing="0" style="background-color: '+o3_bgcolor+'; height: '+o3_height+o3_heightunit+';"><tr><td><table width="100%" border="0" cellpadding="' + o3_cellpad + '" cellspacing="0" style="color: '+o3_fgcolor+'; background-color: '+o3_fgcolor+'; height: '+o3_height+o3_heightunit+';"><tr><td valign="TOP"><font style="font-family: '+o3_textfont+'; color: '+o3_textcolor+'; font-size: '+o3_textsize+o3_textsizeunit+'; text-decoration: '+o3_textdecoration+'; font-weight: '+o3_textweight+'; font-style:'+o3_textstyle+'">'+text+'</font></td></tr></table></td></tr></table>';
  
  	set_background("");
  
  	
  
  	return txt;
  
  }
  
  
  
  // Makes table with caption and optional close link
  
  function ol_content_caption_cssstyle(text, title, close) {
  
  	var nameId;
  
  	closing = "";
  
  	closeevent = "onMouseOver";
  
  	
  
  	if (o3_closeclick == 1) closeevent= (o3_closetitle ? "title='" + o3_closetitle +"'" : "") + " onClick";
  
  
  
  	if (o3_capicon!="") {
  
  		nameId=' hspace=\"5\"'+' align=\"middle\" alt=\"\"';
  
  		if (typeof o3_dragimg != 'undefined' && o3_dragimg) nameId = ' hspace=\"5\"'+' name=\"'+o3_dragimg+'\" id=\"'+o3_dragimg+'\" align=\"middle\" alt=\"Drag Enabled\" title=\"Drag Enabled\"';
  
  		o3_capicon = '<img src=\"'+o3_capicon+'\"'+nameId+' />';
  
  	}
  
  	
  
  	if (close != "") {
  
  		closing = '<td align="RIGHT"><a href="javascript:return '+fnRef+'cClick();" '+closeevent+'="return '+fnRef+'cClick();" style="color: '+o3_closecolor+'; font-family: '+o3_closefont+'; font-size: '+o3_closesize+o3_closesizeunit+'; text-decoration: '+o3_closedecoration+'; font-weight: '+o3_closeweight+'; font-style:'+o3_closestyle+';">'+close+'</a></td>';
  
  	}
  
  	
  
  	txt = '<table width="'+o3_width+ '" border="0" cellpadding="'+o3_border+'" cellspacing="0" style="background-color: '+o3_bgcolor+'; background-image: url('+o3_bgbackground+'); height: '+o3_height+o3_heightunit+';"><tr><td><table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td><font style="font-family: '+o3_captionfont+'; color: '+o3_capcolor+'; font-size: '+o3_captionsize+o3_captionsizeunit+'; font-weight: '+o3_captionweight+'; font-style: '+o3_captionstyle+'; text-decoration: '+o3_captiondecoration+';">'+o3_capicon+title+'</font></td>'+closing+'</tr></table><table width="100%" border="0" cellpadding="' + o3_cellpad + '" cellspacing="0" style="color: '+o3_fgcolor+'; background-color: '+o3_fgcolor+'; height: '+o3_height+o3_heightunit+';"><tr><td valign="TOP"><font style="font-family: '+o3_textfont+'; color: '+o3_textcolor+'; font-size: '+o3_textsize+o3_textsizeunit+'; text-decoration: '+o3_textdecoration+'; font-weight: '+o3_textweight+'; font-style:'+o3_tex
 tstyle+'">'+text+'</font></td></tr></table></td></tr></table>';
  
  	set_background("");
  
  
  
  	return txt;
  
  }
  
  
  
  // Sets the background picture, padding and lots more. :)
  
  function ol_content_background_cssstyle(text, picture, hasfullhtml) {
  
  	if (hasfullhtml) {
  
  		txt = text;
  
  	} else {
  
  		var pU, hU, wU;
  
  		pU = (o3_padunit == '%' ? '%' : '');
  
  		hU = (o3_heightunit == '%' ? '%' : '');
  
  		wU = (o3_widthunit == '%' ? '%' : '');
  
  		txt = '<table width="'+o3_width+wu+'" border="0" cellpadding="0" cellspacing="0" height="'+o3_height+hu+'"><tr><td colspan="3" height="'+o3_padyt+pu+'"></td></tr><tr><td width="'+o3_padxl+pu+'"></td><td valign="TOP" width="'+(o3_width-o3_padxl-o3_padxr)+pu+'"><font style="font-family: '+o3_textfont+'; color: '+o3_textcolor+'; font-size: '+o3_textsize+o3_textsizeunit+';">'+text+'</font></td><td width="'+o3_padxr+pu+'"></td></tr><tr><td colspan="3" height="'+o3_padyb+pu+'"></td></tr></table>';
  
  	}
  
  
  
  	set_background(picture);
  
  
  
  	return txt;
  
  }
  
  
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerRunTimeFunction(setCSSStyleVariables);
  
  registerCmdLineFunction(parseCSSStyleExtras);
  
  registerHook("ol_content_simple", ol_content_simple_cssstyle, FALTERNATE, CSSSTYLE);
  
  registerHook("ol_content_caption", ol_content_caption_cssstyle, FALTERNATE, CSSSTYLE);
  
  registerHook("ol_content_background", ol_content_background_cssstyle, FALTERNATE, CSSSTYLE);
  
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_debug.js
  
  Index: overlib_debug.js
  ===================================================================
  //\/////
  
  //\  overLIB Debug Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                $Date$
  
  //
  
  //\/////
  
  //\mini
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the Debug Plugin.');
  
  else {
  
  var olZindex;
  
  registerCommands('allowdebug');
  
  ////////
  
  // PLUGIN FUNCTIONS
  
  ////////
  
  // Parses Debug Parameters
  
  function parseDebugExtras(pf, i, ar) {
  
  	var k =  i, v;
  
  
  
  	if (k < ar.length) {
  
  		if (ar[k] == ALLOWDEBUG) { v = ar[k + 1]; if(typeof v == 'string') {v = ar[++k]; if (pf != 'ol_') setCanShowParm(v);} return k; }
  
  	}
  
  
  
  	return -1;
  
  }
  
  // Debug main routine
  
  function showProperties() {
  
  	var args = showProperties.arguments, sho, shoObj, vis, lvl = 0, istrt = 0, theDiv = 'showProps', txt = '';
  
  
  
  	if (args.length == 0) return;
  
  	if (args.length % 2 && typeof args[0] == 'string') {
  
  		istrt = 1;
  
  		theDiv = args[0];
  
  	}
  
  
  
  	sho = createDivContainer(theDiv);
  
  
  
  	if (olNs4) {
  
  		shoObj = sho;
  
  		txt += '<table cellpadding="1" cellspacing="0" border="0" bgcolor="#000000"><tr><td>';
  
  	} else {
  
  		with(sho.style) {
  
  			backgroundColor = '#ffffcc';
  
  			padding = '5px';
  
  			border = '1px #000000 solid';
  
  		}
  
  		shoObj = sho.style;
  
  	}
  
  
  
  	lvl = getLayerLevel(theDiv);
  
  
  
  	if(typeof sho.position == 'undefined') {
  
  		sho.position = new Pagelocation(10 + lvl*20, 10, 1);
  
  		if(typeof olZindex == 'undefined') olZindex = getDivZindex();
  
  		shoObj.zIndex = olZindex + 1 + lvl;
  
  	}
  
  
  
  	txt += '<table cellpadding="5" border="0" cellspacing="0"' + (olNs4 ? ' bgcolor="#ffffcc"' : '') + '>';
  
  	txt += '<tr><td><strong><A HREF="javascript:moveToBack(\'' + theDiv + '\');" title="Move to back">' + theDiv + '</A></strong></td><td align="RIGHT"><strong><a href="javascript:closeLayer(\'' + theDiv + '\');" TITLE="Close Layer' + (!olNs4 ? '" style="background-color: #CCCCCC; border:2px #333369 outset; padding: 2px;' : '') + '">X</a></strong></td></tr>';
  
  	txt += '<tr><td style="text-decoration: underline;"><strong>Item</strong></td><td style="text-decoration: underline;"><strong>Value</strong></td></tr>';
  
  	for (var i = istrt; i<args.length-1; i++) 
  
  		txt += '<tr><td align="right"><strong>' + args[i] + ':&nbsp;</strong></td><td>' + args[++i] + '</td></tr>';
  
  	txt += '</table>' + (olNs4 ? '</td></tr></table>' : '');
  
  
  
  	if (olNs4) {
  
  		sho.document.open();
  
  		sho.document.write(txt);
  
  		sho.document.close();
  
  	} else {
  
  		if(olIe5&&isMac) sho.innerHTML = '';
  
  		sho.innerHTML = txt;
  
  	}
  
  
  
  	showAllVisibleLayers();
  
  }
  
  function getLayerLevel(lyr) {
  
  	var i = 0;
  
  
  
  	if (typeof document.popups == 'undefined') {
  
  		document.popups = new Array(lyr);
  
  	} else {
  
  		var l = document.popups;
  
  		for (var i = 0; i<l.length; i++) if (lyr == l[i]) break;
  
  		if(i == l.length) l[l.length++] = lyr;
  
  	}
  
  
  
  	return i;
  
  }
  
  function getDivZindex(id) {
  
  	var obj;
  
  
  
  	if(id == '' || id == null) id = 'overDiv';
  
  
  
  	obj = layerReference(id);
  
  	obj = (olNs4 ? obj : obj.style);
  
  
  
  	return obj.zIndex;
  
  }
  
  function setCanShowParm(debugID) {
  
  	var lyr, pLyr;
  
  
  
  	if(typeof debugID != 'string') return;
  
  
  
  	pLyr = debugID.split(',');
  
  	for(var i = 0; i<pLyr.length; i++) {
  
  		lyr = layerReference(pLyr[i]);
  
  		if(lyr != null && typeof lyr.position != 'undefined') lyr.position.canShow = 1;
  
  	}
  
  }
  
  function Pagelocation(x, y, canShow) {
  
  	this.x = x;
  
  	this.y = y;
  
    this.canShow = (canShow == null) ? 0 : canShow;
  
  }
  
  function showAllVisibleLayers(){
  
  	var lyr, lyrObj, l = document.popups;
  
  
  
  	for (var i = 0; i<l.length; i++) {
  
  		lyr = layerReference(l[i]);
  
  		lyrObj = (olNs4 ? lyr : lyr.style);
  
      if(lyr.position.canShow) {
  
    		positionLayer(lyrObj, lyr.position.x, lyr.position.y);
  
    		lyrObj.visibility = 'visible';
  
      }
  
  	}
  
  }
  
  function positionLayer(Obj, x, y) { // Obj is obj.style for IE/NS6+ but obj for NS4
  
  	Obj.left = x + (olIe4 ? eval(docRoot + '.scrollLeft') : window.pageXOffset) + (olNs4 ? 0 : 'px');
  
  	Obj.top = y + (olIe4 ? eval(docRoot + '.scrollTop') : window.pageYOffset) + (olNs4 ? 0 : 'px');
  
  }
  
  function closeLayer(lyrID) {
  
  	var lyr = layerReference(lyrID);
  
  
  
    lyr.position.canShow = 0;
  
  	lyr = (olNs4 ? lyr : lyr.style);
  
  	lyr.visibility = 'hidden';
  
  }
  
  function moveToBack(layer) {
  
  	var l = document.popups, lyr, obj, i, x = 10, y = 10, dx = 20, z = olZindex + 1;
  
  
  
  	if(l.length == 1) return;
  
  
  
  	lyr = layerReference(layer);
  
  	lyr.position.x = x;
  
  	lyr.position.y = y;
  
  	obj = (olNs4 ? lyr : lyr.style);
  
  	obj.zIndex = z;
  
  
  
  	for (i = 0; i<l.length; i++) {
  
  		if (layer == l[i]) continue;
  
  		lyr = layerReference(l[i]);
  
      if(lyr.position.canShow == 0) continue;
  
  		obj = (olNs4 ? lyr : lyr.style);
  
  		obj.zIndex += 1;
  
  		lyr.position.x += dx;
  
  		lyr.position.y = y;
  
  	}
  
  
  
  	showAllVisibleLayers();
  
  }
  
  function rawTxt(txt) {
  
  	if (typeof txt != 'string') return;
  
  	return txt.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");
  
  }
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerCmdLineFunction(parseDebugExtras);
  
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_exclusive.js
  
  Index: overlib_exclusive.js
  ===================================================================
  //\/////
  
  //\  overLIB Exclusive Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                      $Date$
  
  //\/////
  
  //\mini
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the Debug Plugin.');
  
  else {
  
  registerCommands('exclusive,exclusivestatus,exclusiveoverride');
  
  var olOverrideIsSet;  // variable which tells if override is set
  
  
  
  
  
  ////////
  
  // DEFAULT CONFIGURATION
  
  // Settings you want everywhere are set here. All of this can also be
  
  // changed on your html page or through an overLIB call.
  
  ////////
  
  if (typeof ol_exclusive == 'undefined') var ol_exclusive = 0;
  
  if (typeof ol_exclusivestatus == 'undefined') var ol_exclusivestatus = 'Please close open popup first.';
  
  
  
  ////////
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  
  
  
  
  ////////
  
  // INIT
  
  ////////
  
  // Runtime variables init. Don't change for config!
  
  var o3_exclusive = 0;
  
  var o3_exclusivestatus = '';
  
  
  
  ////////
  
  // PLUGIN FUNCTIONS
  
  ////////
  
  
  
  // Set runtime variables
  
  function setExclusiveVariables() {
  
  	o3_exclusive = ol_exclusive;
  
  	o3_exclusivestatus = ol_exclusivestatus;
  
  }
  
  
  
  // Parses Exclusive Parameters
  
  function parseExclusiveExtras(pf,i,ar) {
  
  	var k = i,v;
  
  
  
  	olOverrideIsSet = false;  // a global variable
  
  
  
  	if (k < ar.length) {
  
  		if (ar[k] == EXCLUSIVEOVERRIDE) { if(pf !=  'ol_') olOverrideIsSet = true; return k; }
  
  		if (ar[k] == EXCLUSIVE) { eval(pf +  'exclusive = (' +  pf + 'exclusive == 0) ? 1 : 0'); return k; }
  
  		if (ar[k] == EXCLUSIVESTATUS) { eval(pf + "exclusivestatus = '" + escSglQuote(ar[++k]) + "'"); return k; }
  
  	}
  
  
  
  	return -1;
  
  }
  
  
  
  ///////
  
  //  HELPER FUNCTIONS
  
  ///////
  
  // set status message and indicate whether popup is exclusive
  
  function isExclusive(args) {
  
  	var rtnVal = false;
  
  
  
  	if(args != null) rtnVal = hasCommand(args, EXCLUSIVEOVERRIDE);
  
  
  
  	if(rtnVal) return false;
  
  	else {
  
  		self.status = (o3_exclusive) ? o3_exclusivestatus : '';
  
  		return o3_exclusive;
  
  	}
  
  
  
  }
  
  
  
  // checks overlib argument list to see if it has a COMMAND argument
  
  function hasCommand(args, COMMAND) {
  
  	var rtnFlag = false;
  
  
  
  	for (var i=0; i<args.length; i++) {
  
  		if (typeof args[i] == 'number' &&  args[i] == COMMAND) {
  
  			rtnFlag = true;
  
  			break;
  
  		}
  
  	}
  
  
  
  	return rtnFlag;
  
  }
  
  
  
  // makes sure exclusive setting is off
  
  function clearExclusive() {
  
  	o3_exclusive = 0;
  
  }
  
  
  
  function setExclusive() {
  
  	o3_exclusive = (o3_showingsticky &&  o3_exclusive);
  
  }
  
  
  
  function chkForExclusive() {
  
  	if (olOverrideIsSet) o3_exclusive = 0;  // turn it off in case it's been set.
  
  
  
  	return true;
  
  }
  
  
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerRunTimeFunction(setExclusiveVariables);
  
  registerCmdLineFunction(parseExclusiveExtras);
  
  registerPostParseFunction(chkForExclusive);
  
  registerHook("createPopup",setExclusive,FBEFORE);
  
  registerHook("hideObject",clearExclusive,FAFTER);
  
  if (olInfo.meets(4.10)) registerNoParameterCommands('exclusive');
  
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_followscroll.js
  
  Index: overlib_followscroll.js
  ===================================================================
  //\/////
  
  //\  overLIB Follow Scroll Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.10 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                      $Date$
  
  //\/////
  
  //\mini
  
  
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the Follow Scroll Plugin.');
  
  else {
  
  registerCommands('followscroll,followscrollrefresh');
  
  
  
  
  
  ////////
  
  // DEFAULT CONFIGURATION
  
  // You don't have to change anything here if you don't want to. All of this can be
  
  // changed on your html page or through an overLIB call.
  
  ////////
  
  // Default value for scroll is not to scroll (0)
  
  if (typeof ol_followscroll=='undefined') var ol_followscroll=0;
  
  if (typeof ol_followscrollrefresh=='undefined') var ol_followscrollrefresh=100;
  
  
  
  ////////
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  ////////
  
  // INIT
  
  ////////
  
  // Runtime variables init. Don't change for config!
  
  var o3_followscroll=0;
  
  var o3_followscrollrefresh=100;
  
  
  
  
  
  ////////
  
  // PLUGIN FUNCTIONS
  
  ////////
  
  function setScrollVariables() {
  
  	o3_followscroll=ol_followscroll;
  
  	o3_followscrollrefresh=ol_followscrollrefresh;
  
  }
  
  
  
  // Parses Shadow and Scroll commands
  
  function parseScrollExtras(pf,i,ar) {
  
  	var k=i,v;
  
  	if (k < ar.length) {
  
  		if (ar[k]==FOLLOWSCROLL) { eval(pf +'followscroll=('+pf+'followscroll==0) ? 1 : 0'); return k; }
  
  		if (ar[k]==FOLLOWSCROLLREFRESH) { eval(pf+'followscrollrefresh='+ar[++k]); return k; }
  
  	}
  
  	return -1;
  
  }
  
  
  
  
  
  
  
  // Function to support scroll feature (overloads default)
  
  function scroll_placeLayer() {
  
  	var placeX, placeY, widthFix = 0;
  
  	
  
  	// HORIZONTAL PLACEMENT
  
  	if (o3_frame.innerWidth) { 
  
  		widthFix=Math.ceil(1.2*(o3_frame.outerWidth - o3_frame.innerWidth));
  
      widthFix = (widthFix > 50) ? 20 : widthFix;
  
  		iwidth=o3_frame.innerWidth;
  
  	} else if (eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientWidth=='number'")&&eval('o3_frame.'+docRoot+'.clientWidth')) 
  
  		iwidth=eval('o3_frame.'+docRoot+'.clientWidth');			
  
  
  
  	// Horizontal scroll offset
  
  	winoffset=(olIe4) ? eval('o3_frame.'+docRoot+'.scrollLeft') : o3_frame.pageXOffset;
  
  
  
  	placeX = runHook('horizontalPlacement',FCHAIN,iwidth,winoffset,widthFix);
  
  	
  
  	// VERTICAL PLACEMENT
  
  	if (o3_frame.innerHeight) iheight=o3_frame.innerHeight;
  
  	else if (eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientHeight=='number'")&&eval('o3_frame.'+docRoot+'.clientHeight')) 
  
  		iheight=eval('o3_frame.'+docRoot+'.clientHeight');			
  
  
  
  	// Vertical scroll offset
  
  	scrolloffset=(olIe4) ? eval('o3_frame.'+docRoot+'.scrollTop') : o3_frame.pageYOffset;
  
  
  
  	placeY = runHook('verticalPlacement',FCHAIN,iheight,scrolloffset);
  
  
  
  	// Actually move the object.
  
  	repositionTo(over,placeX,placeY);
  
  	
  
  	if (o3_followscroll && o3_sticky && (o3_relx || o3_rely) && (typeof o3_draggable == 'undefined' || !o3_draggable)) {
  
  		if (typeof over.scroller=='undefined' || over.scroller.canScroll) over.scroller = new Scroller(placeX-winoffset,placeY-scrolloffset,o3_followscrollrefresh);
  
  	}
  
  }
  
  
  
  
  
  
  
  ///////
  
  // SUPPORT ROUTINES FOR SCROLL FEATURE
  
  ///////
  
  
  
  // Scroller constructor
  
  function Scroller(X,Y,refresh) {
  
  	this.canScroll=0;
  
  	this.refresh=refresh;
  
  	this.x=X;
  
  	this.y=Y;
  
  	this.timer=setTimeout("repositionOver()",this.refresh);
  
  }
  
  
  
  // Removes the timer to stop replacing the layer.
  
  function cancelScroll() {
  
  	if (!o3_followscroll || typeof over.scroller == 'undefined') return;
  
  	over.scroller.canScroll = 1;
  
  	
  
  	if (over.scroller.timer) {
  
  		clearTimeout(over.scroller.timer);
  
  		over.scroller.timer=null;
  
  	}
  
  }
  
  
  
  // Find out how much we've scrolled.
  
  	function getPageScrollY() {
  
  	if (o3_frame.pageYOffset) return o3_frame.pageYOffset;
  
  	if (eval(docRoot)) return eval('o3_frame.' + docRoot + '.scrollTop');
  
  	return -1;
  
  }
  
  function getPageScrollX() {
  
  	if (o3_frame.pageXOffset) return o3_frame.pageXOffset;
  
  	if (eval(docRoot)) return eval('o3_frame.'+docRoot+'.scrollLeft');
  
  	return -1;
  
  }
  
  
  
  // Find out where our layer is
  
  function getLayerTop(layer) {
  
  	if (layer.pageY) return layer.pageY;
  
  	if (layer.style.top) return parseInt(layer.style.top);
  
  	return -1;
  
  }
  
  function getLayerLeft(layer) {
  
  	if (layer.pageX) return layer.pageX;
  
  	if (layer.style.left) return parseInt(layer.style.left);
  
  	return -1;
  
  }
  
  
  
  // Repositions the layer if needed
  
  function repositionOver() {
  
  	var X, Y, pgLeft, pgTop;
  
  	pgTop = getPageScrollY();
  
  	pgLeft = getPageScrollX();
  
  	X = getLayerLeft(over)-pgLeft;
  
  	Y = getLayerTop(over)-pgTop;
  
  	
  
  	if (X != over.scroller.x || Y != over.scroller.y) repositionTo(over, pgLeft+over.scroller.x, pgTop+over.scroller.y);
  
  	over.scroller.timer = setTimeout("repositionOver()", over.scroller.refresh);
  
  }
  
  
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerRunTimeFunction(setScrollVariables);
  
  registerCmdLineFunction(parseScrollExtras);
  
  registerHook("hideObject",cancelScroll,FAFTER);
  
  registerHook("placeLayer",scroll_placeLayer,FREPLACE);
  
  if (olInfo.meets(4.10)) registerNoParameterCommands('followscroll');
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_hideform.js
  
  Index: overlib_hideform.js
  ===================================================================
  //\/////
  
  //\  overLIB Hide Form Plugin
  
  //\
  
  //\  Uses an iframe shim to mask system controls for IE v5.5 or higher as suggested in
  
  //\  http://dotnetjunkies.com/weblog/jking/posts/488.aspx
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                $Date$
  
  //\/////
  
  //\mini
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the HideForm Plugin.');
  
  else {
  
  
  
  // Function which generates the popup with an IFRAME shim
  
  function generatePopUp(content) {
  
  	if(!olIe4||olOp||!olIe55||(typeof o3_shadow != 'undefined' && o3_shadow)||(typeof o3_bubble != 'undefined' && o3_bubble)) return;
  
  
  
  	var wd,ht,txt, zIdx =  0;
  
  
  
  	wd =  parseInt(o3_width);
  
  	ht =  over.offsetHeight;
  
  	txt =  backDropSource(wd,ht,zIdx++);
  
  	txt += '<div style="position: absolute; top: 0; left: 0; width: '+ wd+'px; z-index: ' + zIdx + ';">' + content + '</div>';
  
  	layerWrite(txt);
  
  }
  
  
  
  // Code for the IFRAME which is used in other places
  
  function backDropSource(width, height, Z) {
  
  	return '<iframe frameborder="0" scrolling="no" src="javascript:false;" width="' + width + '" height="' + height + '" style="z-index: ' + Z + '; filter: Beta(Style=0,Opacity=0);"></iframe>';
  
  }
  
  
  
  // Hides SELECT boxes that will be under the popup
  
  // Checking Gecko version number to try to include other browsers based on the Gecko engine
  
  function hideSelectBox() {
  
  	if(olNs4 || olOp || olIe55) return;
  
  	var px, py, pw, ph, sx, sw, sy, sh, selEl, v;
  
  
  
  	if(olIe4) v = 0;
  
  	else {
  
  		v = navigator.userAgent.match(/Gecko\/(\d{8})/i);
  
  		if(!v) return;   // return if no string match
  
  		v = parseInt(v[1]);
  
  	}
  
  
  
  	if (v < 20030624) {  // versions less than June 24, 2003 were earlier Netscape browsers
  
  		px = parseInt(over.style.left);
  
  		py = parseInt(over.style.top);
  
  		pw = o3_width;
  
  		ph = (o3_aboveheight ? parseInt(o3_aboveheight) : over.offsetHeight);
  
  		selEl = (olIe4) ? o3_frame.document.all.tags("SELECT") : o3_frame.document.getElementsByTagName("SELECT");
  
  		for (var i=0; i<selEl.length; i++) {
  
  			if(!olIe4 && selEl[i].size < 2) continue;  // Not IE and SELECT size is 1 or not specified
  
  			sx = pageLocation(selEl[i],'Left');
  
  			sy = pageLocation(selEl[i],'Top');
  
  			sw = selEl[i].offsetWidth;
  
  			sh = selEl[i].offsetHeight;
  
  			if((px+pw) < sx || px > (sx+sw) || (py+ph) < sy || py > (sy+sh)) continue;
  
  			selEl[i].isHidden = 1;
  
  			selEl[i].style.visibility = 'hidden';
  
  		}
  
  	}
  
  }
  
  
  
  // Shows previously hidden SELECT Boxes
  
  function showSelectBox() {
  
  	if(olNs4 || olOp || olIe55) return;
  
  	var selEl, v;
  
  
  
  	if(olIe4) v = 0;
  
  	else {
  
  		v = navigator.userAgent.match(/Gecko\/(\d{8})/i);
  
  		if(!v) return; 
  
  		v = parseInt(v[1]);
  
  	}
  
  
  
  	if(v < 20030624) {
  
  		selEl = (olIe4) ? o3_frame.document.all.tags("SELECT") : o3_frame.document.getElementsByTagName("SELECT");
  
  		for (var i=0; i<selEl.length; i++) {
  
  			if(typeof selEl[i].isHidden !=  'undefined' && selEl[i].isHidden) {
  
  				selEl[i].isHidden = 0;
  
  				selEl[i].style.visibility = 'visible';
  
  			}
  
  		}
  
  	}
  
  }
  
  
  
  // function gets the total offset properties of an element
  
  // this same function occurs in overlib_mark.js.
  
  function pageLocation(o,t){
  
  	var x = 0
  
  
  
  	while(o.offsetParent){
  
  		x += o['offset'+t]
  
  		o = o.offsetParent
  
  	}
  
  
  
  	x += o['offset'+t]
  
  
  
  	return x
  
  }
  
  
  
  // reset mouse move routine for NS7 but not NS7.1,Opera, or IE5.5+
  
  // It also bypasses Netscape 6 since the modifications mess up the display of popups
  
  // and don't work anyways.
  
  // Modify mouse move routine while loading so that hideSelectBox()
  
  // can be called from the correct location
  
  if (!(olNs4 || olOp || olIe55 || navigator.userAgent.indexOf('Netscape6') != -1)) {
  
  	var MMStr = olMouseMove.toString();
  
  	var strRe = /(if\s*\(o3_allowmove\s*==\s*1.*\)\s*)/;
  
  	var f = MMStr.match(strRe);
  
  
  
  	if (f) {
  
  		var ls = MMStr.search(strRe);
  
  		ls += f[1].length;
  
  		var le = MMStr.substring(ls).search(/[;|}]\n/);
  
  		MMStr = MMStr.substring(0,ls) + ' { runHook("placeLayer",FREPLACE); if(olHideForm) hideSelectBox(); ' + MMStr.substring(ls + (le != -1 ? le+3 : 0));
  
  		document.writeln('<script type="text/javascript">\n<!--\n' + MMStr + '\n//-->\n</' + 'script>');
  
  	}
  
  
  
  	f = capExtent.onmousemove.toString().match(/function[ ]+(\w*)\(/);
  
  	if (f&&f[1] != 'anonymous') capExtent.onmousemove = olMouseMove;
  
  }
  
  
  
  
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerHook("createPopup",generatePopUp,FAFTER);
  
  registerHook("hideObject",showSelectBox,FAFTER);
  
  olHideForm=1;
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_setonoff.js
  
  Index: overlib_setonoff.js
  ===================================================================
  //\/////
  
  //\  overLIB Set On/Off Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.10 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                $Date$
  
  //
  
  //\/////
  
  //\mini
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the Set On/Off Plugin.');
  
  else {
  
  registerCommands('seton, setoff');
  
  var olSetType;
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  // PLUGIN FUNCTIONS
  
  ////////
  
  // Set runtime variables
  
  function setOnOffVariables() {
  
  	olSetType = 0;
  
  }
  
  // Parses Set On/Off Parameters
  
  function parseOnOffExtras(pf, i, ar) {
  
  	var k = i, v;
  
  
  
  	if (k < ar.length) {
  
  		if (ar[k] == SETON||ar[k] == SETOFF) { olSetType = 1; k = opt_MULTICOMMANDS(++k, ar); return k; }
  
  	}
  
  
  
  	return -1;
  
  }
  
  ///////
  
  //  HELPER FUNCTIONS
  
  ///////
  
  // searches arg list for COMMAND; 
  
  function hasCommand(istrt, args, COMMAND) {
  
  	for (var i = istrt; i < args.length; i++) {
  
  		if (typeof args[i] == 'number' &&  args[i] == COMMAND) return i;
  
  	}
  
  
  
  	return -1;
  
  }
  
  // scans for toggle like commands to be forced ON/OFF
  
  function scanCommandSet(pf, args) {
  
  	var k = -1, j, je;
  
  
  
  	if (olSetType) {
  
  		// search for SETON command
  
  		while ((k = hasCommand(++k, args, SETON)) < args.length && k > -1) {
  
  			je = opt_MULTICOMMANDS(k + 1, args);
  
  			for (j = k + 1; j <  (k + je); j++) setNoParamCommand(1, pf, args[j]);
  
  			k += (je - 1);
  
  		}
  
  		// search for SETOFF command
  
  		k = -1;
  
  		while ((k = hasCommand(++k, args, SETOFF)) < args.length && k > -1) {
  
  			je = opt_MULTICOMMANDS(k + 1, args);
  
  			for (j = k + 1; j <  (k + je); j++) setNoParamCommand(0, pf, args[j]);
  
  			k += (je - 1);
  
  		}		
  
  	}
  
  
  
  	return true;
  
  }
  
  var olRe;
  
  // set command according to whichType (0 or 1)
  
  function setNoParamCommand(whichType, pf, COMMAND) {
  
  	var v = pms[COMMAND - 1 - pmStart];
  
  
  
  	if(pmt && !olRe) olRe = eval('/' + pmt.split(',').join('|') + '/');
  
  	if (pf != 'ol_' &&  /capturefirst/.test(v)) return;  // no o3_capturefirst variable
  
  	if (pf != 'ol_' &&  /wrap/.test(v) &&  eval(pf + 'wrap') &&  (whichType == 0)) {
  
  		nbspCleanup();   // undo wrap effects since checked after all parsing
  
  		o3_width = ol_width;
  
  	}
  
  
  
  	if (olRe.test(v))	eval(pf + v + '=' + ((whichType && COMMAND == AUTOSTATUSCAP) ? whichType++ : whichType));
  
  }
  
  function opt_MULTICOMMANDS(i, ar) {
  
  	var k = i;
  
  
  
  	while (k < ar.length &&  typeof ar[k] == 'number' &&  ar[k] > pmStart) {k++; if (ar[k - 1] == 'SETON'||ar[k - 1] == 'SETOFF') break;}
  
  	k -= (k < ar.length ? 2 : 1);
  
  
  
  	return k;
  
  }
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerRunTimeFunction(setOnOffVariables);
  
  registerCmdLineFunction(parseOnOffExtras);
  
  registerPostParseFunction(scanCommandSet);
  
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_shadow.js
  
  Index: overlib_shadow.js
  ===================================================================
  //\/////
  
  //\  overLIB Shadow Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //   $Revision$                $Date$
  
  //\/////
  
  //\mini
  
  
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.10)) alert('overLIB 4.10 or later is required for the Shadow Plugin.');
  
  else {
  
  registerCommands('shadow,shadowcolor,shadowimage,shadowopacity,shadowx,shadowy');
  
  
  
  
  
  ////////
  
  // DEFAULT CONFIGURATION
  
  // You don't have to change anything here if you don't want to. All of this can be
  
  // changed on your html page or through an overLIB call.
  
  ////////
  
  if (typeof ol_shadowadjust=='undefined') var ol_shadowadjust=2;  // for Ns4.x only
  
  if (typeof ol_shadow=='undefined') var ol_shadow=0;
  
  if (typeof ol_shadowcolor=='undefined') var ol_shadowcolor='#CCCCCC';
  
  if (typeof ol_shadowimage=='undefined') var  ol_shadowimage='';
  
  if (typeof ol_shadowopacity=='undefined') var  ol_shadowopacity=0;
  
  if (typeof ol_shadowx=='undefined') var ol_shadowx=5;
  
  if (typeof ol_shadowy=='undefined') var ol_shadowy=5;
  
  
  
  ////////
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  
  
  
  
  
  
  
  
  ////////
  
  // INIT
  
  ////////
  
  // Runtime variables init. Don't change for config!
  
  var o3_shadow=0;
  
  var o3_shadowcolor="#cccccc";
  
  var o3_shadowimage='';
  
  var o3_shadowopacity=0;
  
  var o3_shadowx=5;
  
  var o3_shadowy=5;
  
  var bkSet=0;  // Needed for this effect in NS4
  
  
  
  
  
  
  
  // Function which sets runtime variables to their default values
  
  function setShadowVariables() {
  
  	o3_shadow=ol_shadow;
  
  	o3_shadowcolor=ol_shadowcolor;
  
  	o3_shadowimage=ol_shadowimage;
  
  	o3_shadowopacity=ol_shadowopacity;
  
  	o3_shadowx=ol_shadowx;
  
  	o3_shadowy=ol_shadowy;
  
  }
  
  
  
  
  
  // Parses shadow commands
  
  function parseShadowExtras(pf,i,ar) {
  
  	var k = i, v;
  
  	
  
  	if (k < ar.length) {
  
  		if (ar[k]==SHADOW) { eval(pf +'shadow=('+pf+'shadow==0) ? 1 : 0'); return k; }
  
  		if (ar[k]==SHADOWCOLOR) { eval(pf+'shadowcolor="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==SHADOWOPACITY) {v=ar[++k]; eval(pf+'shadowopacity='+(olOp ? 0 : v)); return k; }
  
  		if (ar[k]==SHADOWIMAGE) { eval(pf+'shadowimage="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==SHADOWX) { eval(pf+'shadowx='+ar[++k]); return k; }
  
  		if (ar[k]==SHADOWY) { eval(pf+'shadowy='+ar[++k]); return k; }
  
  	}
  
  	
  
  	return -1;
  
  }
  
  
  
  
  
  // Function for MOUSEOUT/MOUSEOFF feature with shadow
  
  function shadow_cursorOff() {
  
  	var left= parseInt(over.style.left);
  
  	var top=parseInt(over.style.top);
  
  	var right=left+(o3_shadow ? o3_width : over.offsetWidth);
  
  	var bottom=top+(o3_shadow ? o3_aboveheight : over.offsetHeight);
  
  	
  
  	if (o3_x < left || o3_x > right || o3_y < top || o3_y > bottom) return true;
  
  	return false;
  
  }
  
  
  
  // Pre-hide processing to clean-up.
  
  function checkShadowPreHide() {
  
  	if (o3_shadow && o3_shadowopacity) cleanUpShadowEffects();
  
  	if (o3_shadow && (olIe4 && isMac) ) over.style.pixelWidth=over.style.pixelHeight = 0;
  
  }
  
  
  
  
  
  // Funciton that creates the actual shadow
  
  function generateShadow(content) {
  
  	var wd, ht, X = 0, Y = 0, zIdx = 0, txt, dpObj, puObj, bS= '', aPos, posStr=new Array();
  
  
  
  	if (!o3_shadow || (o3_shadowx == 0 && o3_shadowy == 0)) return;
  
  
  
  	X = Math.abs(o3_shadowx);
  
  	Y = Math.abs(o3_shadowy);
  
  	wd = parseInt(o3_width);
  
  	ht = (olNs4) ? over.clip.height : over.offsetHeight;
  
  
  
  	if (o3_shadowx == 0) {
  
  		if (o3_shadowy < 0) {
  
  		  posStr[0]=' left:0; top: 0';
  
  		  posStr[1]=' left:0; top: '+Y+'px';
  
  		} else if (o3_shadowy > 0) {
  
  		  posStr[0]=' left:0; top: '+Y+'px';
  
  		  posStr[1]=' left:0; top:0';
  
  		}
  
  	} else if (o3_shadowy == 0) {
  
  		if (o3_shadowx < 0) {
  
  		  posStr[0]=' left:0; top: 0';
  
  		  posStr[1]=' left: '+X+'px';
  
  		} else if (o3_shadowx > 0) {
  
  		  posStr[0]=' left: '+ X+'px; top: 0';
  
  		  posStr[1]=' left:0; top:0';
  
  		}
  
  	} else if (o3_shadowx > 0) {
  
  		if (o3_shadowy > 0) {
  
  		  posStr[0]=' left:'+ X+'px; top:'+Y+'px';
  
  		  posStr[1]=' left:0; top:0';
  
  		} else if (o3_shadowy < 0) {
  
  		  posStr[0]=' left:'+X+'px; top:0';
  
  		  posStr[1]=' left:0; top: '+Y+'px';
  
  		}
  
  	} else if (o3_shadowx < 0) {
  
  		if (o3_shadowy > 0) {
  
  		  posStr[0]=' left:0; top:'+Y+'px';
  
  		  posStr[1]=' left:'+X+'px; top:0';
  
  		} else if (o3_shadowy < 0) {
  
  		  posStr[0]=' left:0; top:0';
  
  		  posStr[1]=' left:'+X+'px; top:'+Y+'px';
  
  		}
  
  	}
  
  	
  
  	txt = (olNs4) ? '<div id="backdrop"></div>' : ((olIe55&&olHideForm) ? backDropSource(wd+X,ht+Y,zIdx++) : '') + '<div id="backdrop" style="position: absolute;'+posStr[0]+'; width: '+wd+'px; height: '+ht+'px; z-index: ' + (zIdx++) + '; ';
  
  
  
  	if (o3_shadowimage) {
  
  		bS='background-image: url('+o3_shadowimage+');';
  
  		if (olNs4) bkSet=1;
  
  	} else { 
  
  		bS='background-color: '+o3_shadowcolor +';';
  
  		if (olNs4) bkSet=2;
  
  	}
  
  
  
  	if (olNs4) {
  
  		txt += '<div id="PUContent">'+content+'</div>';
  
  	} else {
  
  		txt += bS+'"></div><div id="PUContent" style="position: absolute;'+posStr[1]+'; width: '+ wd+'px; z-index: '+(zIdx++)+';">'+content+'</div>';
  
  	}
  
  	
  
  	layerWrite(txt);
  
  
  
  	if (olNs4 && bkSet) {
  
  		dpObj = over.document.layers['backdrop'];
  
  		if (typeof dpObj == 'undefined') return;  // if shadow layer not found, then content layer won't be either
  
  		
  
  		puObj = over.document.layers['PUContent'];
  
  		wd = puObj.clip.width;
  
  		ht = puObj.clip.height;
  
  		aPos = posStr[0].split(';');
  
  		
  
  		dpObj.clip.width = wd;
  
  		dpObj.clip.height = ht;
  
  		dpObj.left = parseInt(aPos[0].split(':')[1]);
  
  		dpObj.top = parseInt(aPos[1].split(':')[1]);
  
      
  
      dpObj.bgColor = (bkSet == 1) ? null : o3_shadowcolor;
  
  		dpObj.background.src = (bkSet==2) ? null : o3_shadowimage;
  
  		dpObj.zIndex = 0;
  
  
  
  		aPos = posStr[1].split(';');
  
  		puObj.left = parseInt(aPos[0].split(':')[1]);
  
  		puObj.top = parseInt(aPos[1].split(':')[1]);
  
  		puObj.zIndex = 1;
  
  		
  
  	} else {
  
  		puObj = (olIe4 ? o3_frame.document.all['PUContent'] : o3_frame.document.getElementById('PUContent'));
  
  		dpObj = (olIe4 ? o3_frame.document.all['backdrop'] : o3_frame.document.getElementById('backdrop'));
  
  		ht = puObj.offsetHeight;
  
  		dpObj.style.height = ht + 'px';
  
  		
  
  		if (o3_shadowopacity) {
  
  			var op = o3_shadowopacity;
  
  			op = (op <= 100 ? op : 100);
  
  			
  
  			setBrowserOpacity(op,dpObj);
  
  		}
  
  	} 
  
  
  
  	// Set popup's new width and height values here so they are available in placeLayer()
  
  	o3_width = wd+X;
  
  	o3_aboveheight = ht+Y;
  
  }
  
  
  
  
  
  ////////
  
  // SUPPORT FUNCTIONS
  
  ////////
  
  
  
  // Cleans up opacity settings if any.
  
  function cleanUpShadowEffects() {
  
  	if (olNs4 || olOp) return;
  
  	var dpObj=(olIe4 ? o3_frame.document.all['backdrop'] : o3_frame.document.getElementById('backdrop'));
  
  	cleanUpBrowserOpacity(dpObj);
  
  }
  
  
  
  // multi browser opacity support
  
  function setBrowserOpacity(op,lyr){
  
  	if (olNs4||!op) return;  // if Ns4.x or opacity not given return;
  
  	lyr=(lyr) ? lyr : over;
  
  	if (olIe4&&typeof lyr.filters != 'undefined') {
  
  		lyr.style.filter='Alpha(Opacity='+op+')';
  
  		lyr.filters.alpha.enabled=true;
  
  	} else {
  
  		var sOp=(typeof(lyr.style.MozOpacity)!='undefined') ? 'MozOpacity' : (typeof(lyr.style.KhtmlOpacity)!='undefined' ? 'KhtmlOpacity' : (typeof(lyr.style.opacity)!='undefined' ? 'opacity' : '')); 
  
  		if (sOp) eval('lyr.style.'+sOp+'=op/100');
  
  	}
  
  }
  
  
  
  // multi-browser Opacity cleanup
  
  function cleanUpBrowserOpacity(lyr) {
  
  	if (olNs4) return;
  
  	lyr=(lyr) ? lyr : over;
  
  	if (olIe4&&(typeof lyr.filters != 'undefined'&&lyr.filters.alpha.enabled)) {
  
  		lyr.style.filter='Alpha(Opacity=100)';
  
  		lyr.filters.alpha.enabled=false;
  
  	} else {
  
  		var sOp=(typeof(lyr.style.MozOpacity)!='undefined') ? 'MozOpacity' : (typeof(lyr.style.KhtmlOpacity)!='undefined' ? 'KhtmlOpacity' : (typeof(lyr.style.opacity)!='undefined' ? 'opacity' : '')); 
  
  		if (sOp) eval('lyr.style.'+sOp+'=1.0');
  
  	}
  
  }
  
  
  
  // This routine is needed only for Ns4.x to allow use of popups with dropshadows and CSSCLASS at the same time on a page
  
  function shadowAdjust() {
  
  	if (!olNs4) return;
  
  	var fac = ol_shadowadjust;
  
  	if (olNs4) {
  
  		document.write('<style type="text/css">\n<!--\n');
  
  		document.write('#backdrop, #PUContent {position: absolute; left: '+fac*o3_shadowx+'px; top: '+fac*o3_shadowy+'px; }\n');
  
  		document.write('-->\n<' + '\/style>');
  
  	}
  
  }
  
  
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  var before = (typeof rmrkPreface!='undefined' ? rmrkPreface : null);
  
  
  
  registerRunTimeFunction(setShadowVariables);
  
  registerCmdLineFunction(parseShadowExtras);
  
  registerHook("cursorOff",shadow_cursorOff,FREPLACE);
  
  registerHook("hideObject",checkShadowPreHide,FBEFORE);
  
  registerHook("createPopup",generateShadow,FAFTER,before);
  
  if (olInfo.meets(4.10)) registerNoParameterCommands('shadow');
  
  
  
  if (olNs4) shadowAdjust();  // write style rules for proper support of Ns4.x
  
  }
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_anchor_mini.js
  
  Index: overlib_anchor_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB Anchor Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.10 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the Anchor Plugin.');else{registerCommands('anchor,anchorx,anchory,noanchorwarn,anchoralign');
  
  if(typeof ol_anchor=='undefined')var ol_anchor='';if(typeof ol_anchorx=='undefined')var ol_anchorx=0;if(typeof ol_anchory=='undefined')var ol_anchory=0;if(typeof ol_noanchorwarn=='undefined')var ol_noanchorwarn=1;if(typeof ol_anchoralign=='undefined')var ol_anchoralign='UL';
  
  var o3_anchor="",o3_anchorx=0,o3_anchory=0,o3_noanchorwarn=1,o3_anchoralign='UL',mrkObj,rmrkPosition;
  
  function setAnchorVariables(){o3_anchor=ol_anchor;o3_anchorx=ol_anchorx;o3_anchory=ol_anchory;o3_noanchorwarn=ol_noanchorwarn;o3_anchoralign=ol_anchoralign;mrkObj=null;}
  
  function parseAnchorExtras(pf,i,ar){var v,k=i;
  
  if(k<ar.length){if(ar[k]==ANCHOR){eval(pf+"anchor='"+escSglQuote(ar[++k])+"'");return k;}
  
  if(ar[k]==ANCHORX){eval(pf+'anchorx='+ar[++k]);return k;}
  
  if(ar[k]==ANCHORY){eval(pf+'anchory='+ar[++k]);return k;}
  
  if(ar[k]==NOANCHORWARN){eval(pf+'noanchorwarn=('+pf+'noanchorwarn==1)?0:1');return k;}
  
  if(ar[k]==ANCHORALIGN){k=opt_MULTIPLEARGS(++k,ar,(pf+'anchoralign')); return k;}}
  
  return-1;}
  
  function checkAnchorObject(){var w=o3_anchor;
  
  if(w){if(!(mrkObj=getAnchorObjectRef(w))){if(o3_noanchorwarn){alert('WARNING!  Reference mark "'+w+'" not found.');return false;}else w='';}}
  
  return true;}
  
  function anchorHorizontal(browserWidth,horizontalScrollAmount,widthFix){var hasAnchor=(typeof o3_anchor!='undefined'&&o3_anchor);if(!hasAnchor)return void(0);
  
  if(typeof o3_followscroll!='undefined'&&o3_followscroll&&o3_sticky)o3_relx=rmrkPosition[0];
  
  return rmrkPosition[0];}
  
  function anchorVertical(browserHeight,verticalScrollAmount){var hasAnchor=(typeof o3_anchor!='undefined'&&o3_anchor);if(!hasAnchor)return void(0);
  
  if(typeof o3_followscroll!='undefined'&&o3_followscroll&&o3_sticky)o3_rely=rmrkPosition[1];
  
  return rmrkPosition[1];}
  
  function anchorPreface(){if(!mrkObj)return;rmrkPosition=getAnchorLocation(mrkObj);}
  
  function getAnchorObjectRef(aObj){return getRefById(aObj,o3_frame.document)||getRefByName(aObj,o3_frame.document)}
  
  function getAnchorLocation(objRef){var mkObj,of,offsets,mlyr
  
  mkObj=mlyr=objRef
  
  offsets=[o3_anchorx,o3_anchory]
  
  if(document.layers){if(typeof mlyr.length!='undefined'&& mlyr.length>1){mkObj=mlyr[0]
  
  offsets[0]+=mlyr[0].x+mlyr[1].pageX
  
  offsets[1]+=mlyr[0].y+mlyr[1].pageY
  
  }else{if(mlyr.toString().indexOf('Image')!=-1||mlyr.toString().indexOf('Anchor')!=-1){offsets[0]+=mlyr.x
  
  offsets[1]+=mlyr.y
  
  }else{offsets[0]+=mlyr.pageX
  
  offsets[1]+=mlyr.pageY}}
  
  }else{offsets[0]+=pageLocation(mlyr,'Left')
  
  offsets[1]+=pageLocation(mlyr,'Top')}
  
  of=getAnchorOffsets(mkObj)
  
  if(typeof o3_dragimg!='undefined'&& o3_dragimg){olImgLeft=offsets[0];olImgTop=offsets[1];}
  
  offsets[0]+=of[0]
  
  offsets[1]+=of[1]
  
  if(typeof o3_dragimg!='undefined'&& o3_dragimg){olImgRight=offsets[0];olImgBottom=offsets[1];return;}
  
  return offsets;}
  
  function getAnchorOffsets(mkObj){var fx=fy=0, mp,puc,mkAry,sx=sy=0,w=o3_anchoralign
  
  var mW=mH=pW=pH=0
  
  var off=[0,0]
  
  mkAry=w.split(',');
  
  if(mkAry.length<3){mp=mkAry[0].toUpperCase();puc=(mkAry.length==1)?mp:mkAry[1].toUpperCase();}else if(mkAry.length==3){if(!isNaN(mkAry[0])){mp=mkAry.slice(0,2);puc=mkAry[2].toUpperCase();}else{mp=mkAry[0].toUpperCase();puc=mkAry.slice(1);}
  
  }else{mp=mkAry.slice(0,2);puc=mkAry.slice(2);}
  
  var shdwPresent=typeof o3_shadow!='undefined'&& o3_shadow
  
  if(shdwPresent){sx=Math.abs(o3_shadowx);sy=Math.abs(o3_shadowy);}
  
  pW=(shdwPresent?parseInt(o3_width):(olNs4?over.clip.width:over.offsetWidth))
  
  pH=(shdwPresent?parseInt(o3_aboveheight):(olNs4?over.clip.height:over.offsetHeight))
  
  if(olOp&& o3_wrap){pW=(shdwPresent?parseInt(o3_width):(olNs4?over.clip.width:over.offsetWidth))
  
  pH=(shdwPresent?parseInt(o3_aboveheight):(olNs4?over.clip.height:over.offsetHeight))}
  
  if(!olOp&& mkObj.toString().indexOf('Image')!=-1){mW=mkObj.width
  
  mH=mkObj.height
  
  }else if(!olOp&& mkObj.toString().indexOf('Anchor')!=-1){mp='UL'
  
  }else{mW=(olNs4)?mkObj.clip.width:mkObj.offsetWidth
  
  mH=(olNs4)?mkObj.clip.height:mkObj.offsetHeight}
  
  if(!isNaN(mp)||typeof mp=='object'){if(typeof mp=='object'){fx=parseFloat(mp[0]);fy=parseFloat(mp[1]);}else
  
  fx=fy=parseFloat(mp);off=[Math.round(fx*mW),Math.round(fy*mH)];}else{if(mp=='UR')off=[mW,0]
  
  else if(mp=='LL')off=[0,mH]
  
  else if(mp=='LR')off=[mW,mH]}
  
  if(typeof o3_dragimg!='undefined'&& o3_dragimg)return off;else{if(!isNaN(puc)||typeof puc=='object' ){if(typeof puc=='object'){fx=parseFloat(puc[0]);fy=parseFloat(puc[1]);}else
  
  fx=fy=parseFloat(puc);off[0]-=Math.round(fx*(pW-sx));off[1]-=Math.round(fy*(pH-sy));}else{if(puc=='UR'){off[0]-=(pW-sx);off[1]-=sy
  
  }else if(puc=='LL'){off[0]-=sx;off[1]-=(pH-sy)
  
  }else if(puc=='LR'){off[0]-=(pW-sx);off[1]-=(pH-sy)}}
  
  return off}}
  
  function pageLocation(o,t){var x=0
  
  while(o.offsetParent){x+=o['offset'+t]
  
  o=o.offsetParent}
  
  x+=o['offset'+t]
  
  return x}
  
  function getRefById(l,d){var r="",j
  
  d=(d||document)
  
  if(d.all)return d.all[l]
  
  else if(d.getElementById)return d.getElementById(l)
  
  else if(d.layers&& d.layers.length>0){if(d.layers[l])return d.layers[l]
  
  for(j=0;j<d.layers.length;j++){r=getRefById(l,d.layers[j].document)
  
  if(r)return r}}
  
  return false}
  
  function getRefByName(l,d){var r=null,j
  
  d=(d||document)
  
  if(d.images[l])return d.images[l]
  
  else if(d.anchors[l])return d.anchors[l];else if(d.layers&& d.layers.length>0){for(j=0;j<d.layers.length;j++){r=getRefByName(l,d.layers[j].document)
  
  if(r&& r.length>0)return r
  
  else if(r)return [r,d.layers[j]]}}
  
  return null}
  
  registerRunTimeFunction(setAnchorVariables);registerCmdLineFunction(parseAnchorExtras);registerPostParseFunction(checkAnchorObject);registerHook("createPopup",anchorPreface,FAFTER);registerHook("horizontalPlacement",anchorHorizontal,FCHAIN);registerHook("verticalPlacement",anchorVertical,FCHAIN);if(olInfo.meets(4.10))registerNoParameterCommands('noanchorwarn');
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_centerpopup_mini.js
  
  Index: overlib_centerpopup_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB Center Popup Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.10 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the Center Popup Plugin.');else{registerCommands('centerpopup,centeroffset');
  
  if(typeof ol_centerpopup=='undefined')var ol_centerpopup=0;if(typeof ol_centeroffset=='undefined')var ol_centeroffset='0';
  
  var o3_centerpopup=0,o3_centeroffset='0';
  
  function setCenterPopupVariables(){o3_centerpopup=ol_centerpopup;o3_centeroffset=ol_centeroffset;}
  
  function parseCenterPopupExtras(pf,i,ar){var k=i,v;
  
  if(k<ar.length){if(ar[k]==CENTERPOPUP){eval(pf+'centerpopup=('+pf+'centerpopup==0)?1:0');return k;}
  
  if(ar[k]==CENTEROFFSET){k=opt_MULTIPLEARGS(++k,ar,(pf+'centeroffset'));return k;}}
  
  return-1;}
  
  function centerPopupHorizontal(browserWidth,horizontalScrollAmount,widthFix){if(!o3_centerpopup)return void(0);
  
  var vdisp=o3_centeroffset.split(','),placeX,iwidth=browserWidth,winoffset=horizontalScrollAmount,pWd=parseInt(o3_width);
  
  placeX=winoffset+Math.round((iwidth-widthFix-pWd)/2)+parseInt(vdisp[0]);if(typeof o3_followscroll!='undefined'&&o3_followscroll&&o3_sticky)o3_relx=placeX;
  
  return placeX;}
  
  function centerPopupVertical(browserHeight,verticalScrollAmount){if(!o3_centerpopup)return void(0);
  
  var placeY,iheight=browserHeight,scrolloffset=verticalScrollAmount,vdisp=o3_centeroffset.split(','),pHeight=(o3_aboveheight?parseInt(o3_aboveheight):(olNs4?over.clip.height:over.offsetHeight));
  
  placeY=scrolloffset+Math.round((iheight-pHeight)/2)+(vdisp.length>1?parseInt(vdisp[1]):0);if(typeof o3_followscroll!='undefined'&&o3_followscroll&&o3_sticky)o3_rely=placeY;
  
  return placeY;}
  
  registerRunTimeFunction(setCenterPopupVariables);registerCmdLineFunction(parseCenterPopupExtras);registerHook('horizontalPlacement',centerPopupHorizontal,FCHAIN);registerHook('verticalPlacement',centerPopupVertical,FCHAIN);if(olInfo.meets(4.10))registerNoParameterCommands('centerpopup');
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_crossframe_mini.js
  
  Index: overlib_crossframe_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB Crossframe Support Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the Cross Frame Support Plugin.');else{registerCommands('frame');
  
  function parseFrameExtras(pf,i,ar){var k=i,v;
  
  if(k<ar.length){if(ar[k]==FRAME){v=ar[++k];if(pf=='ol_')ol_frame=v;else opt_FRAME(v);return k;}}
  
  return-1;}
  
  function opt_FRAME(frm){o3_frame=frm;over=createDivContainer('overDiv');return 0;}
  
  function frmDepth(thisFrame,ofrm){var retVal='';
  
  for(var i=0;i<thisFrame.length;i++){if(thisFrame[i].length>0){retVal=frmDepth(thisFrame[i],ofrm);if(retVal=='')continue;}else if(thisFrame[i]!=ofrm)continue;retVal='['+i+']'+retVal;break;}
  
  return retVal;}
  
  function getFrmRef(srcFrm,tgetFrm){var rtnVal=''
  
  if(tgetFrm!=srcFrm){var tFrm=frmDepth(top.frames,tgetFrm)
  
  var sFrm=frmDepth(top.frames,srcFrm)
  
  if(sFrm.length==tFrm.length){l=tFrm.lastIndexOf('[')
  
  if(l){while( sFrm.substring(0,l)!=tFrm.substring(0,l) )
  
  l=tFrm.lastIndexOf('[',l-1)
  
  tFrm=tFrm.substr(l)
  
  sFrm=sFrm.substr(l)}}
  
  var cnt=0,p='',str=tFrm
  
  while((k=str.lastIndexOf('['))!=-1){cnt++
  
  str=str.substring(0,k)}
  
  for(var i=0;i<cnt;i++)p=p+'parent.'
  
  rtnVal=p+'frames'+sFrm+'.'}
  
  return rtnVal}
  
  function chkForFrmRef(){if(o3_frame!=ol_frame)fnRef=getFrmRef(ol_frame,o3_frame)
  
  return true;}
  
  registerCmdLineFunction(parseFrameExtras);registerPostParseFunction(chkForFrmRef);
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_csstyle_mini.js
  
  Index: overlib_csstyle_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB CSS Style Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the CSS Style Plugin.');else{registerCommands('cssstyle,padunit,heightunit,widthunit,textsizeunit,textdecoration,textstyle,textweight,captionsizeunit,captiondecoration,captionstyle,captionweight,closesizeunit,closedecoration,closestyle,closeweight');
  
  if(typeof ol_padunit=='undefined')var ol_padunit="px";if(typeof ol_heightunit=='undefined')var ol_heightunit="px";if(typeof ol_widthunit=='undefined')var ol_widthunit="px";if(typeof ol_textsizeunit=='undefined')var ol_textsizeunit="px";if(typeof ol_textdecoration=='undefined')var ol_textdecoration="none";if(typeof ol_textstyle=='undefined')var ol_textstyle="normal";if(typeof ol_textweight=='undefined')var ol_textweight="normal";if(typeof ol_captionsizeunit=='undefined')var ol_captionsizeunit="px";if(typeof ol_captiondecoration=='undefined')var ol_captiondecoration="none";if(typeof ol_captionstyle=='undefined')var ol_captionstyle="normal";if(typeof ol_captionweight=='undefined')var ol_captionweight="bold";if(typeof ol_closesizeunit=='undefined')var ol_closesizeunit="px";if(typeof ol_closedecoration=='undefined')var ol_closedecoration="none";if(typeof ol_closestyle=='undefined')var ol_closestyle="normal";if(typeof ol_closeweight=='undefined')var ol_closeweight="normal";
  
  var o3_padunit="px",o3_heightunit="px",o3_widthunit="px",o3_textsizeunit="px",o3_textdecoration="",o3_textstyle="",o3_textweight="",o3_captionsizeunit="px",o3_captiondecoration="",o3_captionstyle="",o3_captionweight="",o3_closesizeunit="px",o3_closedecoration="",o3_closestyle="",o3_closeweight="";
  
  function setCSSStyleVariables(){o3_padunit=ol_padunit;o3_heightunit=ol_heightunit;o3_widthunit=ol_widthunit;o3_textsizeunit=ol_textsizeunit;o3_textdecoration=ol_textdecoration;o3_textstyle=ol_textstyle;o3_textweight=ol_textweight;o3_captionsizeunit=ol_captionsizeunit;o3_captiondecoration=ol_captiondecoration;o3_captionstyle=ol_captionstyle;o3_captionweight=ol_captionweight;o3_closesizeunit=ol_closesizeunit;o3_closedecoration=ol_closedecoration;o3_closestyle=ol_closestyle;o3_closeweight=ol_closeweight;}
  
  function parseCSSStyleExtras(pf,i,ar){var k=i;
  
  if(k<ar.length){if(ar[k]==CSSSTYLE){eval(pf+'css='+ar[k]);return k;}
  
  if(ar[k]==PADUNIT){eval(pf+'padunit="'+ar[++k]+'"');return k;}
  
  if(ar[k]==HEIGHTUNIT){eval(pf+'heightunit="'+ar[++k]+'"');return k;}
  
  if(ar[k]==WIDTHUNIT){eval(pf+'widthunit="'+ar[++k]+'"');return k;}
  
  if(ar[k]==TEXTSIZEUNIT){eval(pf+'textsizeunit="'+ar[++k]+'"');return k;}
  
  if(ar[k]==TEXTDECORATION){eval(pf+'textdecoration="'+ar[++k]+'"');return k;}
  
  if(ar[k]==TEXTSTYLE){eval(pf+'textstyle="'+ar[++k]+'"');return k;}
  
  if(ar[k]==TEXTWEIGHT){eval(pf+'textweight="'+ar[++k]+'"');return k;}
  
  if(ar[k]==CAPTIONSIZEUNIT){eval(pf+'captionsizeunit="'+ar[++k]+'"');return k;}
  
  if(ar[k]==CAPTIONDECORATION){eval(pf+'captiondecoration="'+ar[++k]+'"');return k;}
  
  if(ar[k]==CAPTIONSTYLE){eval(pf+'captionstyle="'+ar[++k]+'"');return k;}
  
  if(ar[k]==CAPTIONWEIGHT){eval(pf+'captionweight="'+ar[++k]+'"');return k;}
  
  if(ar[k]==CLOSESIZEUNIT){eval(pf+'closesizeunit="'+ar[++k]+'"');return k;}
  
  if(ar[k]==CLOSEDECORATION){eval(pf+'closedecoration="'+ar[++k]+'"');return k;}
  
  if(ar[k]==CLOSESTYLE){eval(pf+'closestyle="'+ar[++k]+'"');return k;}
  
  if(ar[k]==CLOSEWEIGHT){eval(pf+'closeweight="'+ar[++k]+'"');return k;}}
  
  return-1;}
  
  function ol_content_simple_cssstyle(text){txt='<table width="'+o3_width+'" border="0" cellpadding="'+o3_border+'" cellspacing="0" style="background-color: '+o3_bgcolor+';height: '+o3_height+o3_heightunit+';"><tr><td><table width="100%" border="0" cellpadding="'+o3_cellpad+'" cellspacing="0" style="color: '+o3_fgcolor+';background-color: '+o3_fgcolor+';height: '+o3_height+o3_heightunit+';"><tr><td valign="TOP"><font style="font-family: '+o3_textfont+';color: '+o3_textcolor+';font-size: '+o3_textsize+o3_textsizeunit+';text-decoration: '+o3_textdecoration+';font-weight: '+o3_textweight+';font-style:'+o3_textstyle+'">'+text+'</font></td></tr></table></td></tr></table>';set_background("");
  
  return txt;}
  
  function ol_content_caption_cssstyle(text,title,close){var nameId;closing="";closeevent="onMouseOver";
  
  if(o3_closeclick==1)closeevent=(o3_closetitle?"title='"+o3_closetitle+"'":"")+" onClick";
  
  if(o3_capicon!=""){nameId=' hspace=\"5\"'+' align=\"middle\" alt=\"\"';if(typeof o3_dragimg!='undefined'&&o3_dragimg)nameId=' hspace=\"5\"'+' name=\"'+o3_dragimg+'\" id=\"'+o3_dragimg+'\" align=\"middle\" alt=\"Drag Enabled\" title=\"Drag Enabled\"';o3_capicon='<img src=\"'+o3_capicon+'\"'+nameId+' />';}
  
  if(close!=""){closing='<td align="RIGHT"><a href="javascript:return '+fnRef+'cClick();" '+closeevent+'="return '+fnRef+'cClick();" style="color: '+o3_closecolor+';font-family: '+o3_closefont+';font-size: '+o3_closesize+o3_closesizeunit+';text-decoration: '+o3_closedecoration+';font-weight: '+o3_closeweight+';font-style:'+o3_closestyle+';">'+close+'</a></td>';}
  
  txt='<table width="'+o3_width+'" border="0" cellpadding="'+o3_border+'" cellspacing="0" style="background-color: '+o3_bgcolor+';background-image: url('+o3_bgbackground+');height: '+o3_height+o3_heightunit+';"><tr><td><table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td><font style="font-family: '+o3_captionfont+';color: '+o3_capcolor+';font-size: '+o3_captionsize+o3_captionsizeunit+';font-weight: '+o3_captionweight+';font-style: '+o3_captionstyle+';text-decoration: '+o3_captiondecoration+';">'+o3_capicon+title+'</font></td>'+closing+'</tr></table><table width="100%" border="0" cellpadding="'+o3_cellpad+'" cellspacing="0" style="color: '+o3_fgcolor+';background-color: '+o3_fgcolor+';height: '+o3_height+o3_heightunit+';"><tr><td valign="TOP"><font style="font-family: '+o3_textfont+';color: '+o3_textcolor+';font-size: '+o3_textsize+o3_textsizeunit+';text-decoration: '+o3_textdecoration+';font-weight: '+o3_textweight+';font-style:'+o3_textstyle+'">'+text+'</fo
 nt></td></tr></table></td></tr></table>';set_background("");
  
  return txt;}
  
  function ol_content_background_cssstyle(text,picture,hasfullhtml){if(hasfullhtml){txt=text;}else{var pU,hU,wU;pU=(o3_padunit=='%'?'%':'');hU=(o3_heightunit=='%'?'%':'');wU=(o3_widthunit=='%'?'%':'');txt='<table width="'+o3_width+wu+'" border="0" cellpadding="0" cellspacing="0" height="'+o3_height+hu+'"><tr><td colspan="3" height="'+o3_padyt+pu+'"></td></tr><tr><td width="'+o3_padxl+pu+'"></td><td valign="TOP" width="'+(o3_width-o3_padxl-o3_padxr)+pu+'"><font style="font-family: '+o3_textfont+';color: '+o3_textcolor+';font-size: '+o3_textsize+o3_textsizeunit+';">'+text+'</font></td><td width="'+o3_padxr+pu+'"></td></tr><tr><td colspan="3" height="'+o3_padyb+pu+'"></td></tr></table>';}
  
  set_background(picture);
  
  return txt;}
  
  registerRunTimeFunction(setCSSStyleVariables);registerCmdLineFunction(parseCSSStyleExtras);registerHook("ol_content_simple",ol_content_simple_cssstyle,FALTERNATE,CSSSTYLE);registerHook("ol_content_caption",ol_content_caption_cssstyle,FALTERNATE,CSSSTYLE);registerHook("ol_content_background",ol_content_background_cssstyle,FALTERNATE,CSSSTYLE);
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_debug_mini.js
  
  Index: overlib_debug_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB Debug Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the Debug Plugin.');else{var olZindex;registerCommands('allowdebug');
  
  function parseDebugExtras(pf,i,ar){var k=i,v;
  
  if(k<ar.length){if(ar[k]==ALLOWDEBUG){v=ar[k+1];if(typeof v=='string'){v=ar[++k];if(pf!='ol_')setCanShowParm(v);} return k;}}
  
  return-1;}
  
  function showProperties(){var args=showProperties.arguments,sho,shoObj,vis,lvl=0,istrt=0,theDiv='showProps',txt='';
  
  if(args.length==0)return;if(args.length % 2&&typeof args[0]=='string'){istrt=1;theDiv=args[0];}
  
  sho=createDivContainer(theDiv);
  
  if(olNs4){shoObj=sho;txt+='<table cellpadding="1" cellspacing="0" border="0" bgcolor="#000000"><tr><td>';}else{with(sho.style){backgroundColor='#ffffcc';padding='5px';border='1px #000000 solid';}
  
  shoObj=sho.style;}
  
  lvl=getLayerLevel(theDiv);
  
  if(typeof sho.position=='undefined'){sho.position=new Pagelocation(10+lvl*20,10,1);if(typeof olZindex=='undefined')olZindex=getDivZindex();shoObj.zIndex=olZindex+1+lvl;}
  
  txt+='<table cellpadding="5" border="0" cellspacing="0"'+(olNs4?' bgcolor="#ffffcc"':'')+'>';txt+='<tr><td><strong><A HREF="javascript:moveToBack(\''+theDiv+'\');" title="Move to back">'+theDiv+'</A></strong></td><td align="RIGHT"><strong><a href="javascript:closeLayer(\''+theDiv+'\');" TITLE="Close Layer'+(!olNs4?'" style="background-color: #CCCCCC;border:2px #333369 outset;padding: 2px;':'')+'">X</a></strong></td></tr>';txt+='<tr><td style="text-decoration: underline;"><strong>Item</strong></td><td style="text-decoration: underline;"><strong>Value</strong></td></tr>';for(var i=istrt;i<args.length-1;i++)
  
  txt+='<tr><td align="right"><strong>'+args[i]+':&nbsp;</strong></td><td>'+args[++i]+'</td></tr>';txt+='</table>'+(olNs4?'</td></tr></table>':'');
  
  if(olNs4){sho.document.open();sho.document.write(txt);sho.document.close();}else{if(olIe5&&isMac)sho.innerHTML='';sho.innerHTML=txt;}
  
  showAllVisibleLayers();}
  
  function getLayerLevel(lyr){var i=0;
  
  if(typeof document.popups=='undefined'){document.popups=new Array(lyr);}else{var l=document.popups;for(var i=0;i<l.length;i++)if(lyr==l[i])break;if(i==l.length)l[l.length++]=lyr;}
  
  return i;}
  
  function getDivZindex(id){var obj;
  
  if(id==''||id==null)id='overDiv';
  
  obj=layerReference(id);obj=(olNs4?obj:obj.style);
  
  return obj.zIndex;}
  
  function setCanShowParm(debugID){var lyr,pLyr;
  
  if(typeof debugID!='string')return;
  
  pLyr=debugID.split(',');for(var i=0;i<pLyr.length;i++){lyr=layerReference(pLyr[i]);if(lyr!=null&&typeof lyr.position!='undefined')lyr.position.canShow=1;}}
  
  function Pagelocation(x,y,canShow){this.x=x;this.y=y;this.canShow=(canShow==null)?0:canShow;}
  
  function showAllVisibleLayers(){var lyr,lyrObj,l=document.popups;
  
  for(var i=0;i<l.length;i++){lyr=layerReference(l[i]);lyrObj=(olNs4?lyr:lyr.style);if(lyr.position.canShow){positionLayer(lyrObj,lyr.position.x,lyr.position.y);lyrObj.visibility='visible';}}}
  
  function positionLayer(Obj,x,y){Obj.left=x+(olIe4?eval(docRoot+'.scrollLeft'):window.pageXOffset)+(olNs4?0:'px');Obj.top=y+(olIe4?eval(docRoot+'.scrollTop'):window.pageYOffset)+(olNs4?0:'px');}
  
  function closeLayer(lyrID){var lyr=layerReference(lyrID);
  
  lyr.position.canShow=0;lyr=(olNs4?lyr:lyr.style);lyr.visibility='hidden';}
  
  function moveToBack(layer){var l=document.popups,lyr,obj,i,x=10,y=10,dx=20,z=olZindex+1;
  
  if(l.length==1)return;
  
  lyr=layerReference(layer);lyr.position.x=x;lyr.position.y=y;obj=(olNs4?lyr:lyr.style);obj.zIndex=z;
  
  for(i=0;i<l.length;i++){if(layer==l[i])continue;lyr=layerReference(l[i]);if(lyr.position.canShow==0)continue;obj=(olNs4?lyr:lyr.style);obj.zIndex+=1;lyr.position.x+=dx;lyr.position.y=y;}
  
  showAllVisibleLayers();}
  
  function rawTxt(txt){if(typeof txt!='string')return;return txt.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");}
  
  registerCmdLineFunction(parseDebugExtras);
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_exclusive_mini.js
  
  Index: overlib_exclusive_mini.js
  ===================================================================
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_followscroll_mini.js
  
  Index: overlib_followscroll_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB Follow Scroll Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.10 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the Follow Scroll Plugin.');else{registerCommands('followscroll,followscrollrefresh');
  
  if(typeof ol_followscroll=='undefined')var ol_followscroll=0;if(typeof ol_followscrollrefresh=='undefined')var ol_followscrollrefresh=100;
  
  var o3_followscroll=0,o3_followscrollrefresh=100;
  
  function setScrollVariables(){o3_followscroll=ol_followscroll;o3_followscrollrefresh=ol_followscrollrefresh;}
  
  function parseScrollExtras(pf,i,ar){var k=i,v;if(k<ar.length){if(ar[k]==FOLLOWSCROLL){eval(pf+'followscroll=('+pf+'followscroll==0)?1:0');return k;}
  
  if(ar[k]==FOLLOWSCROLLREFRESH){eval(pf+'followscrollrefresh='+ar[++k]);return k;}}
  
  return-1;}
  
  function scroll_placeLayer(){var placeX,placeY,widthFix=0;
  
  if(o3_frame.innerWidth){widthFix=Math.ceil(1.2*(o3_frame.outerWidth-o3_frame.innerWidth));widthFix=(widthFix>50)?20:widthFix;iwidth=o3_frame.innerWidth;}else if(eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientWidth=='number'")&&eval('o3_frame.'+docRoot+'.clientWidth'))
  
  iwidth=eval('o3_frame.'+docRoot+'.clientWidth');
  
  winoffset=(olIe4)?eval('o3_frame.'+docRoot+'.scrollLeft'):o3_frame.pageXOffset;
  
  placeX=runHook('horizontalPlacement',FCHAIN,iwidth,winoffset,widthFix);
  
  if(o3_frame.innerHeight)iheight=o3_frame.innerHeight;else if(eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientHeight=='number'")&&eval('o3_frame.'+docRoot+'.clientHeight'))
  
  iheight=eval('o3_frame.'+docRoot+'.clientHeight');
  
  scrolloffset=(olIe4)?eval('o3_frame.'+docRoot+'.scrollTop'):o3_frame.pageYOffset;
  
  placeY=runHook('verticalPlacement',FCHAIN,iheight,scrolloffset);
  
  repositionTo(over,placeX,placeY);
  
  if(o3_followscroll&&o3_sticky&&(o3_relx||o3_rely)&&(typeof o3_draggable=='undefined'||!o3_draggable)){if(typeof over.scroller=='undefined'||over.scroller.canScroll)over.scroller=new Scroller(placeX-winoffset,placeY-scrolloffset,o3_followscrollrefresh);}}
  
  function Scroller(X,Y,refresh){this.canScroll=0;this.refresh=refresh;this.x=X;this.y=Y;this.timer=setTimeout("repositionOver()",this.refresh);}
  
  function cancelScroll(){if(!o3_followscroll||typeof over.scroller=='undefined')return;over.scroller.canScroll=1;
  
  if(over.scroller.timer){clearTimeout(over.scroller.timer);over.scroller.timer=null;}}
  
  function getPageScrollY(){if(o3_frame.pageYOffset)return o3_frame.pageYOffset;if(eval(docRoot))return eval('o3_frame.'+docRoot+'.scrollTop');return-1;}
  
  function getPageScrollX(){if(o3_frame.pageXOffset)return o3_frame.pageXOffset;if(eval(docRoot))return eval('o3_frame.'+docRoot+'.scrollLeft');return-1;}
  
  function getLayerTop(layer){if(layer.pageY)return layer.pageY;if(layer.style.top)return parseInt(layer.style.top);return-1;}
  
  function getLayerLeft(layer){if(layer.pageX)return layer.pageX;if(layer.style.left)return parseInt(layer.style.left);return-1;}
  
  function repositionOver(){var X,Y,pgLeft,pgTop;pgTop=getPageScrollY();pgLeft=getPageScrollX();X=getLayerLeft(over)-pgLeft;Y=getLayerTop(over)-pgTop;
  
  if(X!=over.scroller.x||Y!=over.scroller.y)repositionTo(over,pgLeft+over.scroller.x,pgTop+over.scroller.y);over.scroller.timer=setTimeout("repositionOver()",over.scroller.refresh);}
  
  registerRunTimeFunction(setScrollVariables);registerCmdLineFunction(parseScrollExtras);registerHook("hideObject",cancelScroll,FAFTER);registerHook("placeLayer",scroll_placeLayer,FREPLACE);if(olInfo.meets(4.10))registerNoParameterCommands('followscroll');}
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_hideform_mini.js
  
  Index: overlib_hideform_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB Hide Form Plugin
  
  //\
  
  //\  Uses an iframe shim to mask system controls for IE v5.5 or higher as suggested in
  
  //\  http://dotnetjunkies.com/weblog/jking/posts/488.aspx
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the HideForm Plugin.');else{
  
  function generatePopUp(content){if(!olIe4||olOp||!olIe55||(typeof o3_shadow!='undefined'&&o3_shadow)||(typeof o3_bubble!='undefined'&&o3_bubble))return;
  
  var wd,ht,txt,zIdx=0;
  
  wd=parseInt(o3_width);ht=over.offsetHeight;txt=backDropSource(wd,ht,zIdx++);txt+='<div style="position: absolute;top: 0;left: 0;width: '+wd+'px;z-index: '+zIdx+';">'+content+'</div>';layerWrite(txt);}
  
  function backDropSource(width,height,Z){return '<iframe frameborder="0" scrolling="no" src="javascript:false;" width="'+width+'" height="'+height+'" style="z-index: '+Z+';filter: Beta(Style=0,Opacity=0);"></iframe>';}
  
  function hideSelectBox(){if(olNs4||olOp||olIe55)return;var px,py,pw,ph,sx,sw,sy,sh,selEl,v;
  
  if(olIe4)v=0;else{v=navigator.userAgent.match(/Gecko\/(\d{8})/i);if(!v)return;v=parseInt(v[1]);}
  
  if(v<20030624){px=parseInt(over.style.left);py=parseInt(over.style.top);pw=o3_width;ph=(o3_aboveheight?parseInt(o3_aboveheight):over.offsetHeight);selEl=(olIe4)?o3_frame.document.all.tags("SELECT"):o3_frame.document.getElementsByTagName("SELECT");for(var i=0;i<selEl.length;i++){if(!olIe4&&selEl[i].size<2)continue;sx=pageLocation(selEl[i],'Left');sy=pageLocation(selEl[i],'Top');sw=selEl[i].offsetWidth;sh=selEl[i].offsetHeight;if((px+pw)<sx||px>(sx+sw)||(py+ph)<sy||py>(sy+sh))continue;selEl[i].isHidden=1;selEl[i].style.visibility='hidden';}}}
  
  function showSelectBox(){if(olNs4||olOp||olIe55)return;var selEl,v;
  
  if(olIe4)v=0;else{v=navigator.userAgent.match(/Gecko\/(\d{8})/i);if(!v)return;v=parseInt(v[1]);}
  
  if(v<20030624){selEl=(olIe4)?o3_frame.document.all.tags("SELECT"):o3_frame.document.getElementsByTagName("SELECT");for(var i=0;i<selEl.length;i++){if(typeof selEl[i].isHidden!='undefined'&&selEl[i].isHidden){selEl[i].isHidden=0;selEl[i].style.visibility='visible';}}}}
  
  function pageLocation(o,t){var x=0
  
  while(o.offsetParent){x+=o['offset'+t]
  
  o=o.offsetParent}
  
  x+=o['offset'+t]
  
  return x}
  
  if(!(olNs4||olOp||olIe55||navigator.userAgent.indexOf('Netscape6')!=-1)){var MMStr=olMouseMove.toString();var strRe=/(if\s*\(o3_allowmove\s*==\s*1.*\)\s*)/;var f=MMStr.match(strRe);
  
  if(f){var ls=MMStr.search(strRe);ls+=f[1].length;var le=MMStr.substring(ls).search(/[;|}]\n/);MMStr=MMStr.substring(0,ls)+' {runHook("placeLayer",FREPLACE);if(olHideForm)hideSelectBox();'+MMStr.substring(ls+(le!=-1?le+3:0));document.writeln('<script type="text/javascript">\n<!--\n'+MMStr+'\n//-->\n</'+'script>');}
  
  f=capExtent.onmousemove.toString().match(/function[ ]+(\w*)\(/);if(f&&f[1]!='anonymous')capExtent.onmousemove=olMouseMove;}
  
  registerHook("createPopup",generatePopUp,FAFTER);registerHook("hideObject",showSelectBox,FAFTER);olHideForm=1;}
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_mini.js
  
  Index: overlib_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB 4.21 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2004. All rights reserved.
  
  //\
  
  //\  Contributors are listed on the homepage.
  
  //\  This file might be old, always check for the latest version at:
  
  //\  http://www.bosrup.com/web/overlib/
  
  //\
  
  //\  Please read the license agreement (available through the link above)
  
  //\  before using overLIB. Direct any licensing questions to erik at bosrup.com.
  
  //\
  
  //\  Do not sell this as your own work or remove this copyright notice. 
  
  //\  For full details on copying or changing this script please read the
  
  //\  license agreement at the link above. Please give credit on sites that
  
  //\  use overLIB and submit changes of the script so other people can use
  
  //\  them as well.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  var olLoaded=0,pmStart=10000000,pmUpper=10001000,pmCount=pmStart+1,pmt='',pms=new Array(),olInfo=new Info('4.21',1),FREPLACE=0,FBEFORE=1,FAFTER=2,FALTERNATE=3,FCHAIN=4,olHideForm=0,olHautoFlag=0,olVautoFlag=0,hookPts=new Array(),postParse=new Array(),cmdLine=new Array(),runTime=new Array();
  
  registerCommands('donothing,inarray,caparray,sticky,background,noclose,caption,left,right,center,offsetx,offsety,fgcolor,bgcolor,textcolor,capcolor,closecolor,width,border,cellpad,status,autostatus,autostatuscap,height,closetext,snapx,snapy,fixx,fixy,relx,rely,fgbackground,bgbackground,padx,pady,fullhtml,above,below,capicon,textfont,captionfont,closefont,textsize,captionsize,closesize,timeout,function,delay,hauto,vauto,closeclick,wrap,followmouse,mouseoff,closetitle,cssoff,compatmode,cssclass,fgclass,bgclass,textfontclass,captionfontclass,closefontclass');
  
  if(typeof ol_fgcolor=='undefined')var ol_fgcolor="#CCCCFF";if(typeof ol_bgcolor=='undefined')var ol_bgcolor="#333399";if(typeof ol_textcolor=='undefined')var ol_textcolor="#000000";if(typeof ol_capcolor=='undefined')var ol_capcolor="#FFFFFF";if(typeof ol_closecolor=='undefined')var ol_closecolor="#9999FF";if(typeof ol_textfont=='undefined')var ol_textfont="Verdana,Arial,Helvetica";if(typeof ol_captionfont=='undefined')var ol_captionfont="Verdana,Arial,Helvetica";if(typeof ol_closefont=='undefined')var ol_closefont="Verdana,Arial,Helvetica";if(typeof ol_textsize=='undefined')var ol_textsize="1";if(typeof ol_captionsize=='undefined')var ol_captionsize="1";if(typeof ol_closesize=='undefined')var ol_closesize="1";if(typeof ol_width=='undefined')var ol_width="200";if(typeof ol_border=='undefined')var ol_border="1";if(typeof ol_cellpad=='undefined')var ol_cellpad=2;if(typeof ol_offsetx=='undefined')var ol_offsetx=10;if(typeof ol_offsety=='undefined')var ol_offsety=10;if(typeof ol
 _text=='undefined')var ol_text="Default Text";if(typeof ol_cap=='undefined')var ol_cap="";if(typeof ol_sticky=='undefined')var ol_sticky=0;if(typeof ol_background=='undefined')var ol_background="";if(typeof ol_close=='undefined')var ol_close="Close";if(typeof ol_hpos=='undefined')var ol_hpos=RIGHT;if(typeof ol_status=='undefined')var ol_status="";if(typeof ol_autostatus=='undefined')var ol_autostatus=0;if(typeof ol_height=='undefined')var ol_height=-1;if(typeof ol_snapx=='undefined')var ol_snapx=0;if(typeof ol_snapy=='undefined')var ol_snapy=0;if(typeof ol_fixx=='undefined')var ol_fixx=-1;if(typeof ol_fixy=='undefined')var ol_fixy=-1;if(typeof ol_relx=='undefined')var ol_relx=null;if(typeof ol_rely=='undefined')var ol_rely=null;if(typeof ol_fgbackground=='undefined')var ol_fgbackground="";if(typeof ol_bgbackground=='undefined')var ol_bgbackground="";if(typeof ol_padxl=='undefined')var ol_padxl=1;if(typeof ol_padxr=='undefined')var ol_padxr=1;if(typeof ol_padyt=='undefined')v
 ar ol_padyt=1;if(typeof ol_padyb=='undefined')var ol_padyb=1;if(typeof ol_fullhtml=='undefined')var ol_fullhtml=0;if(typeof ol_vpos=='undefined')var ol_vpos=BELOW;if(typeof ol_aboveheight=='undefined')var ol_aboveheight=0;if(typeof ol_capicon=='undefined')var ol_capicon="";if(typeof ol_frame=='undefined')var ol_frame=self;if(typeof ol_timeout=='undefined')var ol_timeout=0;if(typeof ol_function=='undefined')var ol_function=null;if(typeof ol_delay=='undefined')var ol_delay=0;if(typeof ol_hauto=='undefined')var ol_hauto=0;if(typeof ol_vauto=='undefined')var ol_vauto=0;if(typeof ol_closeclick=='undefined')var ol_closeclick=0;if(typeof ol_wrap=='undefined')var ol_wrap=0;if(typeof ol_followmouse=='undefined')var ol_followmouse=1;if(typeof ol_mouseoff=='undefined')var ol_mouseoff=0;if(typeof ol_closetitle=='undefined')var ol_closetitle='Close';if(typeof ol_compatmode=='undefined')var ol_compatmode=0;if(typeof ol_css=='undefined')var ol_css=CSSOFF;if(typeof ol_fgclass=='undefined')v
 ar ol_fgclass="";if(typeof ol_bgclass=='undefined')var ol_bgclass="";if(typeof ol_textfontclass=='undefined')var ol_textfontclass="";if(typeof ol_captionfontclass=='undefined')var ol_captionfontclass="";if(typeof ol_closefontclass=='undefined')var ol_closefontclass="";
  
  if(typeof ol_texts=='undefined')var ol_texts=new Array("Text 0","Text 1");if(typeof ol_caps=='undefined')var ol_caps=new Array("Caption 0","Caption 1");
  
  var o3_text="",o3_cap="",o3_sticky=0,o3_background="",o3_close="Close",o3_hpos=RIGHT,o3_offsetx=2,o3_offsety=2,o3_fgcolor="",o3_bgcolor="",o3_textcolor="",o3_capcolor="",o3_closecolor="",o3_width=100,o3_border=1,o3_cellpad=2,o3_status="",o3_autostatus=0,o3_height=-1,o3_snapx=0,o3_snapy=0,o3_fixx=-1,o3_fixy=-1,o3_relx=null,o3_rely=null,o3_fgbackground="",o3_bgbackground="",o3_padxl=0,o3_padxr=0,o3_padyt=0,o3_padyb=0,o3_fullhtml=0,o3_vpos=BELOW,o3_aboveheight=0,o3_capicon="",o3_textfont="Verdana,Arial,Helvetica",o3_captionfont="Verdana,Arial,Helvetica",o3_closefont="Verdana,Arial,Helvetica",o3_textsize="1",o3_captionsize="1",o3_closesize="1",o3_frame=self,o3_timeout=0,o3_timerid=0,o3_allowmove=0,o3_function=null,o3_delay=0,o3_delayid=0,o3_hauto=0,o3_vauto=0,o3_closeclick=0,o3_wrap=0,o3_followmouse=1,o3_mouseoff=0,o3_closetitle='',o3_compatmode=0,o3_css=CSSOFF,o3_fgclass="",o3_bgclass="",o3_textfontclass="",o3_captionfontclass="",o3_closefontclass="";
  
  var o3_x=0,o3_y=0,o3_showingsticky=0,o3_removecounter=0;
  
  var over=null,fnRef,hoveringSwitch=false,olHideDelay;
  
  var isMac=(navigator.userAgent.indexOf("Mac")!=-1),olOp=(navigator.userAgent.toLowerCase().indexOf('opera')>-1&&document.createTextNode),olNs4=(navigator.appName=='Netscape'&&parseInt(navigator.appVersion)==4),olNs6=(document.getElementById)?true:false,olKq=(olNs6&&/konqueror/i.test(navigator.userAgent)),olIe4=(document.all)?true:false,olIe5=false,olIe55=false,docRoot='document.body';
  
  if(olNs4){var oW=window.innerWidth;var oH=window.innerHeight;window.onresize=function(){if(oW!=window.innerWidth||oH!=window.innerHeight)location.reload();}}
  
  if(olIe4){var agent=navigator.userAgent;if(/MSIE/.test(agent)){var versNum=parseFloat(agent.match(/MSIE[ ](\d\.\d+)\.*/i)[1]);if(versNum>=5){olIe5=true;olIe55=(versNum>=5.5&&!olOp)?true:false;if(olNs6)olNs6=false;}}
  
  if(olNs6)olIe4=false;}
  
  if(document.compatMode&&document.compatMode=='CSS1Compat'){docRoot=((olIe4&&!olOp)?'document.documentElement':docRoot);}
  
  if(window.addEventListener)window.addEventListener("load",OLonLoad_handler,false);else if(window.attachEvent)window.attachEvent("onload",OLonLoad_handler);
  
  var capExtent;
  
  function overlib(){if(!olLoaded||isExclusive(overlib.arguments))return true;if(olCheckMouseCapture)olMouseCapture();if(over){over=(typeof over.id!='string')?o3_frame.document.all['overDiv']:over;cClick();}
  
  olHideDelay=0;o3_text=ol_text;o3_cap=ol_cap;o3_sticky=ol_sticky;o3_background=ol_background;o3_close=ol_close;o3_hpos=ol_hpos;o3_offsetx=ol_offsetx;o3_offsety=ol_offsety;o3_fgcolor=ol_fgcolor;o3_bgcolor=ol_bgcolor;o3_textcolor=ol_textcolor;o3_capcolor=ol_capcolor;o3_closecolor=ol_closecolor;o3_width=ol_width;o3_border=ol_border;o3_cellpad=ol_cellpad;o3_status=ol_status;o3_autostatus=ol_autostatus;o3_height=ol_height;o3_snapx=ol_snapx;o3_snapy=ol_snapy;o3_fixx=ol_fixx;o3_fixy=ol_fixy;o3_relx=ol_relx;o3_rely=ol_rely;o3_fgbackground=ol_fgbackground;o3_bgbackground=ol_bgbackground;o3_padxl=ol_padxl;o3_padxr=ol_padxr;o3_padyt=ol_padyt;o3_padyb=ol_padyb;o3_fullhtml=ol_fullhtml;o3_vpos=ol_vpos;o3_aboveheight=ol_aboveheight;o3_capicon=ol_capicon;o3_textfont=ol_textfont;o3_captionfont=ol_captionfont;o3_closefont=ol_closefont;o3_textsize=ol_textsize;o3_captionsize=ol_captionsize;o3_closesize=ol_closesize;o3_timeout=ol_timeout;o3_function=ol_function;o3_delay=ol_delay;o3_hauto=ol_haut
 o;o3_vauto=ol_vauto;o3_closeclick=ol_closeclick;o3_wrap=ol_wrap;o3_followmouse=ol_followmouse;o3_mouseoff=ol_mouseoff;o3_closetitle=ol_closetitle;o3_css=ol_css;o3_compatmode=ol_compatmode;o3_fgclass=ol_fgclass;o3_bgclass=ol_bgclass;o3_textfontclass=ol_textfontclass;o3_captionfontclass=ol_captionfontclass;o3_closefontclass=ol_closefontclass;
  
  setRunTimeVariables();
  
  fnRef='';
  
  o3_frame=ol_frame;
  
  if(!(over=createDivContainer()))return false;
  
  parseTokens('o3_',overlib.arguments);if(!postParseChecks())return false;
  
  if(o3_delay==0){return runHook("olMain",FREPLACE);}else{o3_delayid=setTimeout("runHook('olMain',FREPLACE)",o3_delay);return false;}}
  
  function nd(time){if(olLoaded&&!isExclusive()){hideDelay(time);
  
  if(o3_removecounter>=1){o3_showingsticky=0 };
  
  if(o3_showingsticky==0){o3_allowmove=0;if(over!=null&&o3_timerid==0)runHook("hideObject",FREPLACE,over);}else{o3_removecounter++;}}
  
  return true;}
  
  function cClick(){if(olLoaded){runHook("hideObject",FREPLACE,over);o3_showingsticky=0;}
  
  return false;}
  
  function overlib_pagedefaults(){parseTokens('ol_',overlib_pagedefaults.arguments);}
  
  function olMain(){var layerhtml,styleType;runHook("olMain",FBEFORE);
  
  if(o3_background!=""||o3_fullhtml){
  
  layerhtml=runHook('ol_content_background',FALTERNATE,o3_css,o3_text,o3_background,o3_fullhtml);}else{
  
  styleType=(pms[o3_css-1-pmStart]=="cssoff"||pms[o3_css-1-pmStart]=="cssclass");
  
  if(o3_fgbackground!="")o3_fgbackground="background=\""+o3_fgbackground+"\"";if(o3_bgbackground!="")o3_bgbackground=(styleType?"background=\""+o3_bgbackground+"\"":o3_bgbackground);
  
  if(o3_fgcolor!="")o3_fgcolor=(styleType?"bgcolor=\""+o3_fgcolor+"\"":o3_fgcolor);if(o3_bgcolor!="")o3_bgcolor=(styleType?"bgcolor=\""+o3_bgcolor+"\"":o3_bgcolor);
  
  if(o3_height>0)o3_height=(styleType?"height=\""+o3_height+"\"":o3_height);else o3_height="";
  
  if(o3_cap==""){
  
  layerhtml=runHook('ol_content_simple',FALTERNATE,o3_css,o3_text);}else{
  
  if(o3_sticky){
  
  layerhtml=runHook('ol_content_caption',FALTERNATE,o3_css,o3_text,o3_cap,o3_close);}else{
  
  layerhtml=runHook('ol_content_caption',FALTERNATE,o3_css,o3_text,o3_cap,"");}}}
  
  if(o3_sticky){if(o3_timerid>0){clearTimeout(o3_timerid);o3_timerid=0;}
  
  o3_showingsticky=1;o3_removecounter=0;}
  
  if(!runHook("createPopup",FREPLACE,layerhtml))return false;
  
  if(o3_autostatus>0){o3_status=o3_text;if(o3_autostatus>1)o3_status=o3_cap;}
  
  o3_allowmove=0;
  
  if(o3_timeout>0){if(o3_timerid>0)clearTimeout(o3_timerid);o3_timerid=setTimeout("cClick()",o3_timeout);}
  
  runHook("disp",FREPLACE,o3_status);runHook("olMain",FAFTER);
  
  return(olOp&&event&&event.type=='mouseover'&&!o3_status)?'':(o3_status!='');}
  
  function ol_content_simple(text){var cpIsMultiple=/,/.test(o3_cellpad);var txt='<table width="'+o3_width+'" border="0" cellpadding="'+o3_border+'" cellspacing="0" '+(o3_bgclass?'class="'+o3_bgclass+'"':o3_bgcolor+' '+o3_height)+'><tr><td><table width="100%" border="0" '+((olNs4||!cpIsMultiple)?'cellpadding="'+o3_cellpad+'" ':'')+'cellspacing="0" '+(o3_fgclass?'class="'+o3_fgclass+'"':o3_fgcolor+' '+o3_fgbackground+' '+o3_height)+'><tr><td valign="TOP"'+(o3_textfontclass?' class="'+o3_textfontclass+'">':((!olNs4&&cpIsMultiple)?' style="'+setCellPadStr(o3_cellpad)+'">':'>'))+(o3_textfontclass?'':wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'</td></tr></table></td></tr></table>';
  
  set_background("");return txt;}
  
  function ol_content_caption(text,title,close){var nameId,txt,cpIsMultiple=/,/.test(o3_cellpad);var closing,closeevent;
  
  closing="";closeevent="onmouseover";if(o3_closeclick==1)closeevent=(o3_closetitle?"title='"+o3_closetitle+"'":"")+" onclick";if(o3_capicon!=""){nameId=' hspace=\"5\"'+' align=\"middle\" alt=\"\"';if(typeof o3_dragimg!='undefined'&&o3_dragimg)nameId=' hspace=\"5\"'+' name=\"'+o3_dragimg+'\" id=\"'+o3_dragimg+'\" align=\"middle\" alt=\"Drag Enabled\" title=\"Drag Enabled\"';o3_capicon='<img src=\"'+o3_capicon+'\"'+nameId+' />';}
  
  if(close!="")
  
  closing='<td '+(!o3_compatmode&&o3_closefontclass?'class="'+o3_closefontclass:'align="RIGHT')+'"><a href="javascript:return '+fnRef+'cClick();"'+((o3_compatmode&&o3_closefontclass)?' class="'+o3_closefontclass+'" ':' ')+closeevent+'="return '+fnRef+'cClick();">'+(o3_closefontclass?'':wrapStr(0,o3_closesize,'close'))+close+(o3_closefontclass?'':wrapStr(1,o3_closesize,'close'))+'</a></td>';txt='<table width="'+o3_width+'" border="0" cellpadding="'+o3_border+'" cellspacing="0" '+(o3_bgclass?'class="'+o3_bgclass+'"':o3_bgcolor+' '+o3_bgbackground+' '+o3_height)+'><tr><td><table width="100%" border="0" cellpadding="2" cellspacing="0"><tr><td'+(o3_captionfontclass?' class="'+o3_captionfontclass+'">':'>')+(o3_captionfontclass?'':'<b>'+wrapStr(0,o3_captionsize,'caption'))+o3_capicon+title+(o3_captionfontclass?'':wrapStr(1,o3_captionsize)+'</b>')+'</td>'+closing+'</tr></table><table width="100%" border="0" '+((olNs4||!cpIsMultiple)?'cellpadding="'+o3_cellpad+'" ':'')+'cellspacing="0
 " '+(o3_fgclass?'class="'+o3_fgclass+'"':o3_fgcolor+' '+o3_fgbackground+' '+o3_height)+'><tr><td valign="TOP"'+(o3_textfontclass?' class="'+o3_textfontclass+'">' :((!olNs4&&cpIsMultiple)?' style="'+setCellPadStr(o3_cellpad)+'">':'>'))+(o3_textfontclass?'':wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'</td></tr></table></td></tr></table>';
  
  set_background("");return txt;}
  
  function ol_content_background(text,picture,hasfullhtml){if(hasfullhtml){txt=text;}else{txt='<table width="'+o3_width+'" border="0" cellpadding="0" cellspacing="0" height="'+o3_height+'"><tr><td colspan="3" height="'+o3_padyt+'"></td></tr><tr><td width="'+o3_padxl+'"></td><td valign="TOP" width="'+(o3_width-o3_padxl-o3_padxr)+(o3_textfontclass?'" class="'+o3_textfontclass:'')+'">'+(o3_textfontclass?'':wrapStr(0,o3_textsize,'text'))+text+(o3_textfontclass?'':wrapStr(1,o3_textsize))+'</td><td width="'+o3_padxr+'"></td></tr><tr><td colspan="3" height="'+o3_padyb+'"></td></tr></table>';}
  
  set_background(picture);return txt;}
  
  function set_background(pic){if(pic==""){if(olNs4){over.background.src=null;}else if(over.style){over.style.backgroundImage="none";}
  
  }else{if(olNs4){over.background.src=pic;}else if(over.style){over.style.width=o3_width+'px';over.style.backgroundImage="url("+pic+")";}}}
  
  var olShowId=-1;
  
  function disp(statustext){runHook("disp",FBEFORE);
  
  if(o3_allowmove==0){runHook("placeLayer",FREPLACE);(olNs6&&olShowId<0)?olShowId=setTimeout("runHook('showObject',FREPLACE,over)",1):runHook("showObject",FREPLACE,over);o3_allowmove=(o3_sticky||o3_followmouse==0)?0:1;}
  
  runHook("disp",FAFTER);
  
  if(statustext!="")self.status=statustext;}
  
  function createPopup(lyrContent){runHook("createPopup",FBEFORE);
  
  if(o3_wrap){var wd,ww,theObj=(olNs4?over:over.style);theObj.top=theObj.left=((olIe4&&!olOp)?0:-10000)+(!olNs4?'px':0);layerWrite(lyrContent);wd=(olNs4?over.clip.width:over.offsetWidth);if(wd>(ww=windowWidth())){lyrContent=lyrContent.replace(/\&nbsp;/g,' ');o3_width=ww;o3_wrap=0;}}
  
  layerWrite(lyrContent);
  
  if(o3_wrap)o3_width=(olNs4?over.clip.width:over.offsetWidth);
  
  runHook("createPopup",FAFTER,lyrContent);
  
  return true;}
  
  function placeLayer(){var placeX,placeY,widthFix=0;
  
  if(o3_frame.innerWidth)widthFix=18;iwidth=windowWidth();
  
  winoffset=(olIe4)?eval('o3_frame.'+docRoot+'.scrollLeft'):o3_frame.pageXOffset;
  
  placeX=runHook('horizontalPlacement',FCHAIN,iwidth,winoffset,widthFix);
  
  if(o3_frame.innerHeight){iheight=o3_frame.innerHeight;}else if(eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientHeight=='number'")&&eval('o3_frame.'+docRoot+'.clientHeight')){iheight=eval('o3_frame.'+docRoot+'.clientHeight');}
  
  scrolloffset=(olIe4)?eval('o3_frame.'+docRoot+'.scrollTop'):o3_frame.pageYOffset;placeY=runHook('verticalPlacement',FCHAIN,iheight,scrolloffset);
  
  repositionTo(over,placeX,placeY);}
  
  function olMouseMove(e){var e=(e)?e:event;
  
  if(e.pageX){o3_x=e.pageX;o3_y=e.pageY;}else if(e.clientX){o3_x=eval('e.clientX+o3_frame.'+docRoot+'.scrollLeft');o3_y=eval('e.clientY+o3_frame.'+docRoot+'.scrollTop');}
  
  if(o3_allowmove==1)runHook("placeLayer",FREPLACE);
  
  if(hoveringSwitch&&!olNs4&&runHook("cursorOff",FREPLACE)){(olHideDelay?hideDelay(olHideDelay):cClick());hoveringSwitch=!hoveringSwitch;}}
  
  function no_overlib(){return ver3fix;}
  
  function olMouseCapture(){capExtent=document;var fN,str='',l,k,f,wMv,sS,mseHandler=olMouseMove;var re=/function[ ]*(\w*)\(/;
  
  wMv=(!olIe4&&window.onmousemove);if(document.onmousemove||wMv){if(wMv)capExtent=window;f=capExtent.onmousemove.toString();fN=f.match(re);if(fN==null){str=f+'(e);';}else if(fN[1]=='anonymous'||fN[1]=='olMouseMove'||(wMv&&fN[1]=='onmousemove')){if(!olOp&&wMv){l=f.indexOf('{')+1;k=f.lastIndexOf('}');sS=f.substring(l,k);if((l=sS.indexOf('('))!=-1){sS=sS.substring(0,l).replace(/^\s+/,'').replace(/\s+$/,'');if(eval("typeof "+sS+"=='undefined'"))window.onmousemove=null;else str=sS+'(e);';}}
  
  if(!str){olCheckMouseCapture=false;return;}
  
  }else{if(fN[1])str=fN[1]+'(e);';else{l=f.indexOf('{')+1;k=f.lastIndexOf('}');str=f.substring(l,k)+'\n';}}
  
  str+='olMouseMove(e);';mseHandler=new Function('e',str);}
  
  capExtent.onmousemove=mseHandler;if(olNs4)capExtent.captureEvents(Event.MOUSEMOVE);}
  
  function parseTokens(pf,ar){
  
  var v,i,mode=-1,par=(pf!='ol_'),fnMark=(par&&!ar.length?1:0);
  
  for(i=0;i<ar.length;i++){if(mode<0){
  
  if(typeof ar[i]=='number'&&ar[i]>pmStart&&ar[i]<pmUpper){fnMark=(par?1:0);i--;}else{switch(pf){case 'ol_':
  
  ol_text=ar[i].toString();break;default:
  
  o3_text=ar[i].toString();}}
  
  mode=0;}else{
  
  if(ar[i]>=pmCount||ar[i]==DONOTHING){continue;}
  
  if(ar[i]==INARRAY){fnMark=0;eval(pf+'text=ol_texts['+ar[++i]+'].toString()');continue;}
  
  if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[++i]+'].toString()');continue;}
  
  if(ar[i]==STICKY){if(pf!='ol_')eval(pf+'sticky=1');continue;}
  
  if(ar[i]==BACKGROUND){eval(pf+'background="'+ar[++i]+'"');continue;}
  
  if(ar[i]==NOCLOSE){if(pf!='ol_')opt_NOCLOSE();continue;}
  
  if(ar[i]==CAPTION){eval(pf+"cap='"+escSglQuote(ar[++i])+"'");continue;}
  
  if(ar[i]==CENTER||ar[i]==LEFT||ar[i]==RIGHT){eval(pf+'hpos='+ar[i]);if(pf!='ol_')olHautoFlag=1;continue;}
  
  if(ar[i]==OFFSETX){eval(pf+'offsetx='+ar[++i]);continue;}
  
  if(ar[i]==OFFSETY){eval(pf+'offsety='+ar[++i]);continue;}
  
  if(ar[i]==FGCOLOR){eval(pf+'fgcolor="'+ar[++i]+'"');continue;}
  
  if(ar[i]==BGCOLOR){eval(pf+'bgcolor="'+ar[++i]+'"');continue;}
  
  if(ar[i]==TEXTCOLOR){eval(pf+'textcolor="'+ar[++i]+'"');continue;}
  
  if(ar[i]==CAPCOLOR){eval(pf+'capcolor="'+ar[++i]+'"');continue;}
  
  if(ar[i]==CLOSECOLOR){eval(pf+'closecolor="'+ar[++i]+'"');continue;}
  
  if(ar[i]==WIDTH){eval(pf+'width='+ar[++i]);continue;}
  
  if(ar[i]==BORDER){eval(pf+'border='+ar[++i]);continue;}
  
  if(ar[i]==CELLPAD){i=opt_MULTIPLEARGS(++i,ar,(pf+'cellpad'));continue;}
  
  if(ar[i]==STATUS){eval(pf+"status='"+escSglQuote(ar[++i])+"'");continue;}
  
  if(ar[i]==AUTOSTATUS){eval(pf+'autostatus=('+pf+'autostatus==1)?0:1');continue;}
  
  if(ar[i]==AUTOSTATUSCAP){eval(pf+'autostatus=('+pf+'autostatus==2)?0:2');continue;}
  
  if(ar[i]==HEIGHT){eval(pf+'height='+pf+'aboveheight='+ar[++i]);continue;}
  
  if(ar[i]==CLOSETEXT){eval(pf+"close='"+escSglQuote(ar[++i])+"'");continue;}
  
  if(ar[i]==SNAPX){eval(pf+'snapx='+ar[++i]);continue;}
  
  if(ar[i]==SNAPY){eval(pf+'snapy='+ar[++i]);continue;}
  
  if(ar[i]==FIXX){eval(pf+'fixx='+ar[++i]);continue;}
  
  if(ar[i]==FIXY){eval(pf+'fixy='+ar[++i]);continue;}
  
  if(ar[i]==RELX){eval(pf+'relx='+ar[++i]);continue;}
  
  if(ar[i]==RELY){eval(pf+'rely='+ar[++i]);continue;}
  
  if(ar[i]==FGBACKGROUND){eval(pf+'fgbackground="'+ar[++i]+'"');continue;}
  
  if(ar[i]==BGBACKGROUND){eval(pf+'bgbackground="'+ar[++i]+'"');continue;}
  
  if(ar[i]==PADX){eval(pf+'padxl='+ar[++i]);eval(pf+'padxr='+ar[++i]);continue;}
  
  if(ar[i]==PADY){eval(pf+'padyt='+ar[++i]);eval(pf+'padyb='+ar[++i]);continue;}
  
  if(ar[i]==FULLHTML){if(pf!='ol_')eval(pf+'fullhtml=1');continue;}
  
  if(ar[i]==BELOW||ar[i]==ABOVE){eval(pf+'vpos='+ar[i]);if(pf!='ol_')olVautoFlag=1;continue;}
  
  if(ar[i]==CAPICON){eval(pf+'capicon="'+ar[++i]+'"');continue;}
  
  if(ar[i]==TEXTFONT){eval(pf+"textfont='"+escSglQuote(ar[++i])+"'");continue;}
  
  if(ar[i]==CAPTIONFONT){eval(pf+"captionfont='"+escSglQuote(ar[++i])+"'");continue;}
  
  if(ar[i]==CLOSEFONT){eval(pf+"closefont='"+escSglQuote(ar[++i])+"'");continue;}
  
  if(ar[i]==TEXTSIZE){eval(pf+'textsize="'+ar[++i]+'"');continue;}
  
  if(ar[i]==CAPTIONSIZE){eval(pf+'captionsize="'+ar[++i]+'"');continue;}
  
  if(ar[i]==CLOSESIZE){eval(pf+'closesize="'+ar[++i]+'"');continue;}
  
  if(ar[i]==TIMEOUT){eval(pf+'timeout='+ar[++i]);continue;}
  
  if(ar[i]==FUNCTION){if(pf=='ol_'){if(typeof ar[i+1]!='number'){v=ar[++i];ol_function=(typeof v=='function'?v:null);}}else{fnMark=0;v=null;if(typeof ar[i+1]!='number')v=ar[++i]; opt_FUNCTION(v);} continue;}
  
  if(ar[i]==DELAY){eval(pf+'delay='+ar[++i]);continue;}
  
  if(ar[i]==HAUTO){eval(pf+'hauto=('+pf+'hauto==0)?1:0');continue;}
  
  if(ar[i]==VAUTO){eval(pf+'vauto=('+pf+'vauto==0)?1:0');continue;}
  
  if(ar[i]==CLOSECLICK){eval(pf+'closeclick=('+pf+'closeclick==0)?1:0');continue;}
  
  if(ar[i]==WRAP){eval(pf+'wrap=('+pf+'wrap==0)?1:0');continue;}
  
  if(ar[i]==FOLLOWMOUSE){eval(pf+'followmouse=('+pf+'followmouse==1)?0:1');continue;}
  
  if(ar[i]==MOUSEOFF){eval(pf+'mouseoff=('+pf+'mouseoff==0)?1:0');v=ar[i+1];if(pf!='ol_'&&eval(pf+'mouseoff')&&typeof v=='number'&&(v<pmStart||v>pmUpper))olHideDelay=ar[++i];continue;}
  
  if(ar[i]==CLOSETITLE){eval(pf+"closetitle='"+escSglQuote(ar[++i])+"'");continue;}
  
  if(ar[i]==CSSOFF||ar[i]==CSSCLASS){eval(pf+'css='+ar[i]);continue;}
  
  if(ar[i]==COMPATMODE){eval(pf+'compatmode=('+pf+'compatmode==0)?1:0');continue;}
  
  if(ar[i]==FGCLASS){eval(pf+'fgclass="'+ar[++i]+'"');continue;}
  
  if(ar[i]==BGCLASS){eval(pf+'bgclass="'+ar[++i]+'"');continue;}
  
  if(ar[i]==TEXTFONTCLASS){eval(pf+'textfontclass="'+ar[++i]+'"');continue;}
  
  if(ar[i]==CAPTIONFONTCLASS){eval(pf+'captionfontclass="'+ar[++i]+'"');continue;}
  
  if(ar[i]==CLOSEFONTCLASS){eval(pf+'closefontclass="'+ar[++i]+'"');continue;}
  
  i=parseCmdLine(pf,i,ar);}}
  
  if(fnMark&&o3_function)o3_text=o3_function();
  
  if((pf=='o3_')&&o3_wrap){o3_width=0;
  
  var tReg=/<.*\n*>/ig;if(!tReg.test(o3_text))o3_text=o3_text.replace(/[ ]+/g,'&nbsp;');if(!tReg.test(o3_cap))o3_cap=o3_cap.replace(/[ ]+/g,'&nbsp;');}
  
  if((pf=='o3_')&&o3_sticky){if(!o3_close&&(o3_frame!=ol_frame))o3_close=ol_close;if(o3_mouseoff&&(o3_frame==ol_frame))opt_NOCLOSE(' ');}}
  
  function layerWrite(txt){txt+="\n";if(olNs4){var lyr=o3_frame.document.layers['overDiv'].document
  
  lyr.write(txt)
  
  lyr.close()
  
  }else if(typeof over.innerHTML!='undefined'){if(olIe5&&isMac)over.innerHTML='';over.innerHTML=txt;}else{range=o3_frame.document.createRange();range.setStartAfter(over);domfrag=range.createContextualFragment(txt);
  
  while(over.hasChildNodes()){over.removeChild(over.lastChild);}
  
  over.appendChild(domfrag);}}
  
  function showObject(obj){runHook("showObject",FBEFORE);
  
  var theObj=(olNs4?obj:obj.style);theObj.visibility='visible';
  
  runHook("showObject",FAFTER);}
  
  function hideObject(obj){runHook("hideObject",FBEFORE);
  
  var theObj=(olNs4?obj:obj.style);if(olNs6&&olShowId>0){clearTimeout(olShowId);olShowId=0;}
  
  theObj.visibility='hidden';theObj.top=theObj.left=((olIe4&&!olOp)?0:-10000)+(!olNs4?'px':0);
  
  if(o3_timerid>0)clearTimeout(o3_timerid);if(o3_delayid>0)clearTimeout(o3_delayid);
  
  o3_timerid=0;o3_delayid=0;self.status="";
  
  if(obj.onmouseout||obj.onmouseover){if(olNs4)obj.releaseEvents(Event.MOUSEOUT||Event.MOUSEOVER);obj.onmouseout=obj.onmouseover=null;}
  
  runHook("hideObject",FAFTER);}
  
  function repositionTo(obj,xL,yL){var theObj=(olNs4?obj:obj.style);theObj.left=xL+(!olNs4?'px':0);theObj.top=yL+(!olNs4?'px':0);}
  
  function cursorOff(){var left=parseInt(over.style.left);var top=parseInt(over.style.top);var right=left+(over.offsetWidth>=parseInt(o3_width)?over.offsetWidth:parseInt(o3_width));var bottom=top+(over.offsetHeight>=o3_aboveheight?over.offsetHeight:o3_aboveheight);
  
  if(o3_x<left||o3_x>right||o3_y<top||o3_y>bottom)return true;
  
  return false;}
  
  function opt_FUNCTION(callme){o3_text=(callme?(typeof callme=='string'?(/.+\(.*\)/.test(callme)?eval(callme):callme):callme()):(o3_function?o3_function():'No Function'));
  
  return 0;}
  
  function opt_NOCLOSE(unused){if(!unused)o3_close="";
  
  if(olNs4){over.captureEvents(Event.MOUSEOUT||Event.MOUSEOVER);over.onmouseover=function(){if(o3_timerid>0){clearTimeout(o3_timerid);o3_timerid=0;} }
  
  over.onmouseout=function(e){if(olHideDelay)hideDelay(olHideDelay);else cClick(e);}
  
  }else{over.onmouseover=function(){hoveringSwitch=true;if(o3_timerid>0){clearTimeout(o3_timerid);o3_timerid=0;} }}
  
  return 0;}
  
  function opt_MULTIPLEARGS(i,args,parameter){var k=i,re,pV,str='';
  
  for(k=i;k<args.length;k++){if(typeof args[k]=='number'&&args[k]>pmStart)break;str+=args[k]+',';}
  
  if(str)str=str.substring(0,--str.length);
  
  k--;pV=(olNs4&&/cellpad/i.test(parameter))?str.split(',')[0]:str;eval(parameter+'="'+pV+'"');
  
  return k;}
  
  function nbspCleanup(){if(o3_wrap){o3_text=o3_text.replace(/\&nbsp;/g,' ');o3_cap=o3_cap.replace(/\&nbsp;/g,' ');}}
  
  function escSglQuote(str){return str.toString().replace(/'/g,"\\'");}
  
  function OLonLoad_handler(e){var re=/\w+\(.*\)[;\s]+/g,olre=/overlib\(|nd\(|cClick\(/,fn,l,i;
  
  if(!olLoaded)olLoaded=1;
  
  if(window.removeEventListener&&e.eventPhase==3)window.removeEventListener("load",OLonLoad_handler,false);else if(window.detachEvent){window.detachEvent("onload",OLonLoad_handler);var fN=document.body.getAttribute('onload');if(fN){fN=fN.toString().match(re);if(fN&&fN.length){for(i=0;i<fN.length;i++){if(/anonymous/.test(fN[i]))continue;while((l=fN[i].search(/\)[;\s]+/))!=-1){fn=fN[i].substring(0,l+1);fN[i]=fN[i].substring(l+2);if(olre.test(fn))eval(fn);}}}}}}
  
  function wrapStr(endWrap,fontSizeStr,whichString){var fontStr,fontColor,isClose=((whichString=='close')?1:0),hasDims=/[%\-a-z]+$/.test(fontSizeStr);fontSizeStr=(olNs4)?(!hasDims?fontSizeStr:'1'):fontSizeStr;if(endWrap)return(hasDims&&!olNs4)?(isClose?'</span>':'</div>'):'</font>';else{fontStr='o3_'+whichString+'font';fontColor='o3_'+((whichString=='caption')? 'cap':whichString)+'color';return(hasDims&&!olNs4)?(isClose?'<span style="font-family: '+quoteMultiNameFonts(eval(fontStr))+';color: '+eval(fontColor)+';font-size: '+fontSizeStr+';">':'<div style="font-family: '+quoteMultiNameFonts(eval(fontStr))+';color: '+eval(fontColor)+';font-size: '+fontSizeStr+';">'):'<font face="'+eval(fontStr)+'" color="'+eval(fontColor)+'" size="'+(parseInt(fontSizeStr)>7?'7':fontSizeStr)+'">';}}
  
  function quoteMultiNameFonts(theFont){var v,pM=theFont.split(',');for(var i=0;i<pM.length;i++){v=pM[i];v=v.replace(/^\s+/,'').replace(/\s+$/,'');if(/\s/.test(v)&&!/['"]/.test(v)){v="\'"+v+"\'";pM[i]=v;}}
  
  return pM.join();}
  
  function isExclusive(args){return false;}
  
  function setCellPadStr(parameter){var Str='',j=0,ary=new Array(),top,bottom,left,right;
  
  Str+='padding: ';ary=parameter.replace(/\s+/g,'').split(',');
  
  switch(ary.length){case 2:
  
  top=bottom=ary[j];left=right=ary[++j];break;case 3:
  
  top=ary[j];left=right=ary[++j];bottom=ary[++j];break;case 4:
  
  top=ary[j];right=ary[++j];bottom=ary[++j];left=ary[++j];break;}
  
  Str+=((ary.length==1)?ary[0]+'px;':top+'px '+right+'px '+bottom+'px '+left+'px;');
  
  return Str;}
  
  function hideDelay(time){if(time&&!o3_delay){if(o3_timerid>0)clearTimeout(o3_timerid);
  
  o3_timerid=setTimeout("cClick()",(o3_timeout=time));}}
  
  function horizontalPlacement(browserWidth,horizontalScrollAmount,widthFix){var placeX,iwidth=browserWidth,winoffset=horizontalScrollAmount;var parsedWidth=parseInt(o3_width);
  
  if(o3_fixx>-1||o3_relx!=null){
  
  placeX=(o3_relx!=null?( o3_relx<0?winoffset+o3_relx+iwidth-parsedWidth-widthFix:winoffset+o3_relx):o3_fixx);}else{
  
  if(o3_hauto==1){if((o3_x-winoffset)>(iwidth/2)){o3_hpos=LEFT;}else{o3_hpos=RIGHT;}}
  
  if(o3_hpos==CENTER){placeX=o3_x+o3_offsetx-(parsedWidth/2);
  
  if(placeX<winoffset)placeX=winoffset;}
  
  if(o3_hpos==RIGHT){placeX=o3_x+o3_offsetx;
  
  if((placeX+parsedWidth)>(winoffset+iwidth-widthFix)){placeX=iwidth+winoffset-parsedWidth-widthFix;if(placeX<0)placeX=0;}}
  
  if(o3_hpos==LEFT){placeX=o3_x-o3_offsetx-parsedWidth;if(placeX<winoffset)placeX=winoffset;}
  
  if(o3_snapx>1){var snapping=placeX % o3_snapx;
  
  if(o3_hpos==LEFT){placeX=placeX-(o3_snapx+snapping);}else{
  
  placeX=placeX+(o3_snapx-snapping);}
  
  if(placeX<winoffset)placeX=winoffset;}}
  
  return placeX;}
  
  function verticalPlacement(browserHeight,verticalScrollAmount){var placeY,iheight=browserHeight,scrolloffset=verticalScrollAmount;var parsedHeight=(o3_aboveheight?parseInt(o3_aboveheight):(olNs4?over.clip.height:over.offsetHeight));
  
  if(o3_fixy>-1||o3_rely!=null){
  
  placeY=(o3_rely!=null?(o3_rely<0?scrolloffset+o3_rely+iheight-parsedHeight:scrolloffset+o3_rely):o3_fixy);}else{
  
  if(o3_vauto==1){if((o3_y-scrolloffset)>(iheight/2)&&o3_vpos==BELOW&&(o3_y+parsedHeight+o3_offsety-(scrolloffset+iheight)>0)){o3_vpos=ABOVE;}else if(o3_vpos==ABOVE&&(o3_y-(parsedHeight+o3_offsety)-scrolloffset<0)){o3_vpos=BELOW;}}
  
  if(o3_vpos==ABOVE){if(o3_aboveheight==0)o3_aboveheight=parsedHeight;
  
  placeY=o3_y-(o3_aboveheight+o3_offsety);if(placeY<scrolloffset)placeY=scrolloffset;}else{
  
  placeY=o3_y+o3_offsety;}
  
  if(o3_snapy>1){var snapping=placeY % o3_snapy;
  
  if(o3_aboveheight>0&&o3_vpos==ABOVE){placeY=placeY-(o3_snapy+snapping);}else{placeY=placeY+(o3_snapy-snapping);}
  
  if(placeY<scrolloffset)placeY=scrolloffset;}}
  
  return placeY;}
  
  function checkPositionFlags(){if(olHautoFlag)olHautoFlag=o3_hauto=0;if(olVautoFlag)olVautoFlag=o3_vauto=0;return true;}
  
  function windowWidth(){var w;if(o3_frame.innerWidth)w=o3_frame.innerWidth;else if(eval('o3_frame.'+docRoot)&&eval("typeof o3_frame."+docRoot+".clientWidth=='number'")&&eval('o3_frame.'+docRoot+'.clientWidth'))
  
  w=eval('o3_frame.'+docRoot+'.clientWidth');return w;}
  
  function createDivContainer(id,frm,zValue){id=(id||'overDiv'),frm=(frm||o3_frame),zValue=(zValue||1000);var objRef,divContainer=layerReference(id);
  
  if(divContainer==null){if(olNs4){divContainer=frm.document.layers[id]=new Layer(window.innerWidth,frm);objRef=divContainer;}else{var body=(olIe4?frm.document.all.tags('BODY')[0]:frm.document.getElementsByTagName("BODY")[0]);if(olIe4&&!document.getElementById){body.insertAdjacentHTML("beforeEnd",'<div id="'+id+'"></div>');divContainer=layerReference(id);}else{divContainer=frm.document.createElement("DIV");divContainer.id=id;body.appendChild(divContainer);}
  
  objRef=divContainer.style;}
  
  objRef.position='absolute';objRef.visibility='hidden';objRef.zIndex=zValue;if(olIe4&&!olOp)objRef.left=objRef.top='0px';else objRef.left=objRef.top=-10000+(!olNs4?'px':0);}
  
  return divContainer;}
  
  function layerReference(id){return(olNs4?o3_frame.document.layers[id]:(document.all?o3_frame.document.all[id]:o3_frame.document.getElementById(id)));}
  
  function isFunction(fnRef){var rtn=true;
  
  if(typeof fnRef=='object'){for(var i=0;i<fnRef.length;i++){if(typeof fnRef[i]=='function')continue;rtn=false;break;}
  
  }else if(typeof fnRef!='function'){rtn=false;}
  
  return rtn;}
  
  function argToString(array,strtInd,argName){var jS=strtInd,aS='',ar=array;argName=(argName?argName:'ar');
  
  if(ar.length>jS){for(var k=jS;k<ar.length;k++)aS+=argName+'['+k+'], ';aS=aS.substring(0,aS.length-2);}
  
  return aS;}
  
  function reOrder(hookPt,fnRef,order){var newPt=new Array(),match,i,j;
  
  if(!order||typeof order=='undefined'||typeof order=='number')return hookPt;
  
  if(typeof order=='function'){if(typeof fnRef=='object'){newPt=newPt.concat(fnRef);}else{newPt[newPt.length++]=fnRef;}
  
  for(i=0;i<hookPt.length;i++){match=false;if(typeof fnRef=='function'&&hookPt[i]==fnRef){continue;}else{for(j=0;j<fnRef.length;j++)if(hookPt[i]==fnRef[j]){match=true;break;}}
  
  if(!match)newPt[newPt.length++]=hookPt[i];}
  
  newPt[newPt.length++]=order;
  
  }else if(typeof order=='object'){if(typeof fnRef=='object'){newPt=newPt.concat(fnRef);}else{newPt[newPt.length++]=fnRef;}
  
  for(j=0;j<hookPt.length;j++){match=false;if(typeof fnRef=='function'&&hookPt[j]==fnRef){continue;}else{for(i=0;i<fnRef.length;i++)if(hookPt[j]==fnRef[i]){match=true;break;}}
  
  if(!match)newPt[newPt.length++]=hookPt[j];}
  
  for(i=0;i<newPt.length;i++)hookPt[i]=newPt[i];newPt.length=0;
  
  for(j=0;j<hookPt.length;j++){match=false;for(i=0;i<order.length;i++){if(hookPt[j]==order[i]){match=true;break;}}
  
  if(!match)newPt[newPt.length++]=hookPt[j];}
  
  newPt=newPt.concat(order);}
  
  hookPt=newPt;
  
  return hookPt;}
  
  function setRunTimeVariables(){if(typeof runTime!='undefined'&&runTime.length){for(var k=0;k<runTime.length;k++){runTime[k]();}}}
  
  function parseCmdLine(pf,i,args){if(typeof cmdLine!='undefined'&&cmdLine.length){for(var k=0;k<cmdLine.length;k++){var j=cmdLine[k](pf,i,args);if(j >-1){i=j;break;}}}
  
  return i;}
  
  function postParseChecks(pf,args){if(typeof postParse!='undefined'&&postParse.length){for(var k=0;k<postParse.length;k++){if(postParse[k](pf,args))continue;return false;}}
  
  return true;}
  
  function registerCommands(cmdStr){if(typeof cmdStr!='string')return;
  
  var pM=cmdStr.split(',');pms=pms.concat(pM);
  
  for(var i=0;i< pM.length;i++){eval(pM[i].toUpperCase()+'='+pmCount++);}}
  
  function registerNoParameterCommands(cmdStr){if(!cmdStr&&typeof cmdStr!='string')return;pmt=(!pmt)?cmdStr:pmt+','+cmdStr;}
  
  function registerHook(fnHookTo,fnRef,hookType,optPm){var hookPt,last=typeof optPm;
  
  if(fnHookTo=='plgIn'||fnHookTo=='postParse')return;if(typeof hookPts[fnHookTo]=='undefined')hookPts[fnHookTo]=new FunctionReference();
  
  hookPt=hookPts[fnHookTo];
  
  if(hookType!=null){if(hookType==FREPLACE){hookPt.ovload=fnRef;if(fnHookTo.indexOf('ol_content_')>-1)hookPt.alt[pms[CSSOFF-1-pmStart]]=fnRef;
  
  }else if(hookType==FBEFORE||hookType==FAFTER){var hookPt=(hookType==1?hookPt.before:hookPt.after);
  
  if(typeof fnRef=='object'){hookPt=hookPt.concat(fnRef);}else{hookPt[hookPt.length++]=fnRef;}
  
  if(optPm)hookPt=reOrder(hookPt,fnRef,optPm);
  
  }else if(hookType==FALTERNATE){if(last=='number')hookPt.alt[pms[optPm-1-pmStart]]=fnRef;}else if(hookType==FCHAIN){hookPt=hookPt.chain;if(typeof fnRef=='object')hookPt=hookPt.concat(fnRef);else hookPt[hookPt.length++]=fnRef;}
  
  return;}}
  
  function registerRunTimeFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){runTime=runTime.concat(fn);}else{runTime[runTime.length++]=fn;}}}
  
  function registerCmdLineFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){cmdLine=cmdLine.concat(fn);}else{cmdLine[cmdLine.length++]=fn;}}}
  
  function registerPostParseFunction(fn){if(isFunction(fn)){if(typeof fn=='object'){postParse=postParse.concat(fn);}else{postParse[postParse.length++]=fn;}}}
  
  function runHook(fnHookTo,hookType){var l=hookPts[fnHookTo],k,rtnVal=null,optPm,arS,ar=runHook.arguments;
  
  if(hookType==FREPLACE){arS=argToString(ar,2);
  
  if(typeof l=='undefined'||!(l=l.ovload))rtnVal=eval(fnHookTo+'('+arS+')');else rtnVal=eval('l('+arS+')');
  
  }else if(hookType==FBEFORE||hookType==FAFTER){if(typeof l!='undefined'){l=(hookType==1?l.before:l.after);
  
  if(l.length){arS=argToString(ar,2);for(var k=0;k<l.length;k++)eval('l[k]('+arS+')');}}
  
  }else if(hookType==FALTERNATE){optPm=ar[2];arS=argToString(ar,3);
  
  if(typeof l=='undefined'||(l=l.alt[pms[optPm-1-pmStart]])=='undefined'){rtnVal=eval(fnHookTo+'('+arS+')');}else{rtnVal=eval('l('+arS+')');}
  
  }else if(hookType==FCHAIN){arS=argToString(ar,2);l=l.chain;
  
  for(k=l.length;k>0;k--)if((rtnVal=eval('l[k-1]('+arS+')'))!=void(0))break;}
  
  return rtnVal;}
  
  function FunctionReference(){this.ovload=null;this.before=new Array();this.after=new Array();this.alt=new Array();this.chain=new Array();}
  
  function Info(version,prerelease){this.version=version;this.prerelease=prerelease;
  
  this.simpleversion=Math.round(this.version*100);this.major=parseInt(this.simpleversion/100);this.minor=parseInt(this.simpleversion/10)-this.major * 10;this.revision=parseInt(this.simpleversion)-this.major * 100-this.minor * 10;this.meets=meets;}
  
  function meets(reqdVersion){return(!reqdVersion)?false:this.simpleversion>=Math.round(100*parseFloat(reqdVersion));}
  
  registerHook("ol_content_simple",ol_content_simple,FALTERNATE,CSSOFF);registerHook("ol_content_caption",ol_content_caption,FALTERNATE,CSSOFF);registerHook("ol_content_background",ol_content_background,FALTERNATE,CSSOFF);registerHook("ol_content_simple",ol_content_simple,FALTERNATE,CSSCLASS);registerHook("ol_content_caption",ol_content_caption,FALTERNATE,CSSCLASS);registerHook("ol_content_background",ol_content_background,FALTERNATE,CSSCLASS);registerPostParseFunction(checkPositionFlags);registerHook("hideObject",nbspCleanup,FAFTER);registerHook("horizontalPlacement",horizontalPlacement,FCHAIN);registerHook("verticalPlacement",verticalPlacement,FCHAIN);if(olNs4||(olIe5&&isMac)||olKq)olLoaded=1;registerNoParameterCommands('sticky,autostatus,autostatuscap,fullhtml,hauto,vauto,closeclick,wrap,followmouse,mouseoff,compatmode');
  
  var olCheckMouseCapture=true;if((olNs4||olNs6||olIe4)){olMouseCapture();}else{overlib=no_overlib;nd=no_overlib;ver3fix=true;}
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_setonoff_mini.js
  
  Index: overlib_setonoff_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB Set On/Off Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.10 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the Set On/Off Plugin.');else{registerCommands('seton,setoff');var olSetType;
  
  function setOnOffVariables(){olSetType=0;}
  
  function parseOnOffExtras(pf,i,ar){var k=i,v;
  
  if(k<ar.length){if(ar[k]==SETON||ar[k]==SETOFF){olSetType=1;k=opt_MULTICOMMANDS(++k,ar);return k;}}
  
  return-1;}
  
  function hasCommand(istrt,args,COMMAND){for(var i=istrt;i<args.length;i++){if(typeof args[i]=='number'&& args[i]==COMMAND)return i;}
  
  return-1;}
  
  function scanCommandSet(pf,args){var k=-1,j,je;
  
  if(olSetType){
  
  while((k=hasCommand(++k,args,SETON))<args.length&&k>-1){je=opt_MULTICOMMANDS(k+1,args);for(j=k+1;j<(k+je);j++)setNoParamCommand(1,pf,args[j]);k+=(je-1);}
  
  k=-1;while((k=hasCommand(++k,args,SETOFF))<args.length&&k>-1){je=opt_MULTICOMMANDS(k+1,args);for(j=k+1;j<(k+je);j++)setNoParamCommand(0,pf,args[j]);k+=(je-1);}}
  
  return true;}
  
  var olRe;
  
  function setNoParamCommand(whichType,pf,COMMAND){var v=pms[COMMAND-1-pmStart];
  
  if(pmt&&!olRe)olRe=eval('/'+pmt.split(',').join('|')+'/');if(pf!='ol_'&& /capturefirst/.test(v))return;if(pf!='ol_'&& /wrap/.test(v)&& eval(pf+'wrap')&&(whichType==0)){nbspCleanup();o3_width=ol_width;}
  
  if(olRe.test(v))eval(pf+v+'='+((whichType&&COMMAND==AUTOSTATUSCAP)?whichType++:whichType));}
  
  function opt_MULTICOMMANDS(i,ar){var k=i;
  
  while(k<ar.length&& typeof ar[k]=='number'&& ar[k]>pmStart){k++;if(ar[k-1]=='SETON'||ar[k-1]=='SETOFF')break;}
  
  k-=(k<ar.length?2:1);
  
  return k;}
  
  registerRunTimeFunction(setOnOffVariables);registerCmdLineFunction(parseOnOffExtras);registerPostParseFunction(scanCommandSet);
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/Mini/overlib_shadow_mini.js
  
  Index: overlib_shadow_mini.js
  ===================================================================
  //\/////
  
  //\  overLIB Shadow Plugin
  
  //\  This file requires overLIB 4.10 or later.
  
  //\
  
  //\  overLIB 4.05 - You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  //\  THIS IS A VERY MODIFIED VERSION. DO NOT EDIT OR PUBLISH. GET THE ORIGINAL!
  
  if(typeof olInfo=='undefined'||typeof olInfo.meets=='undefined'||!olInfo.meets(4.10))alert('overLIB 4.10 or later is required for the Shadow Plugin.');else{registerCommands('shadow,shadowcolor,shadowimage,shadowopacity,shadowx,shadowy');
  
  if(typeof ol_shadowadjust=='undefined')var ol_shadowadjust=2;if(typeof ol_shadow=='undefined')var ol_shadow=0;if(typeof ol_shadowcolor=='undefined')var ol_shadowcolor='#CCCCCC';if(typeof ol_shadowimage=='undefined')var  ol_shadowimage='';if(typeof ol_shadowopacity=='undefined')var  ol_shadowopacity=0;if(typeof ol_shadowx=='undefined')var ol_shadowx=5;if(typeof ol_shadowy=='undefined')var ol_shadowy=5;
  
  var o3_shadow=0,o3_shadowcolor="#cccccc",o3_shadowimage='',o3_shadowopacity=0,o3_shadowx=5,o3_shadowy=5,bkSet=0;
  
  function setShadowVariables(){o3_shadow=ol_shadow;o3_shadowcolor=ol_shadowcolor;o3_shadowimage=ol_shadowimage;o3_shadowopacity=ol_shadowopacity;o3_shadowx=ol_shadowx;o3_shadowy=ol_shadowy;}
  
  function parseShadowExtras(pf,i,ar){var k=i,v;
  
  if(k<ar.length){if(ar[k]==SHADOW){eval(pf+'shadow=('+pf+'shadow==0)?1:0');return k;}
  
  if(ar[k]==SHADOWCOLOR){eval(pf+'shadowcolor="'+ar[++k]+'"');return k;}
  
  if(ar[k]==SHADOWOPACITY){v=ar[++k];eval(pf+'shadowopacity='+(olOp?0:v));return k;}
  
  if(ar[k]==SHADOWIMAGE){eval(pf+'shadowimage="'+ar[++k]+'"');return k;}
  
  if(ar[k]==SHADOWX){eval(pf+'shadowx='+ar[++k]);return k;}
  
  if(ar[k]==SHADOWY){eval(pf+'shadowy='+ar[++k]);return k;}}
  
  return-1;}
  
  function shadow_cursorOff(){var left=parseInt(over.style.left);var top=parseInt(over.style.top);var right=left+(o3_shadow?o3_width:over.offsetWidth);var bottom=top+(o3_shadow?o3_aboveheight:over.offsetHeight);
  
  if(o3_x<left||o3_x>right||o3_y<top||o3_y>bottom)return true;return false;}
  
  function checkShadowPreHide(){if(o3_shadow&&o3_shadowopacity)cleanUpShadowEffects();if(o3_shadow&&(olIe4&&isMac) )over.style.pixelWidth=over.style.pixelHeight=0;}
  
  function generateShadow(content){var wd,ht,X=0,Y=0,zIdx=0,txt,dpObj,puObj,bS='',aPos,posStr=new Array();
  
  if(!o3_shadow||(o3_shadowx==0&&o3_shadowy==0))return;
  
  X=Math.abs(o3_shadowx);Y=Math.abs(o3_shadowy);wd=parseInt(o3_width);ht=(olNs4)?over.clip.height:over.offsetHeight;
  
  if(o3_shadowx==0){if(o3_shadowy<0){posStr[0]=' left:0;top: 0';posStr[1]=' left:0;top: '+Y+'px';}else if(o3_shadowy>0){posStr[0]=' left:0;top: '+Y+'px';posStr[1]=' left:0;top:0';}
  
  }else if(o3_shadowy==0){if(o3_shadowx<0){posStr[0]=' left:0;top: 0';posStr[1]=' left: '+X+'px';}else if(o3_shadowx>0){posStr[0]=' left: '+X+'px;top: 0';posStr[1]=' left:0;top:0';}
  
  }else if(o3_shadowx>0){if(o3_shadowy>0){posStr[0]=' left:'+X+'px;top:'+Y+'px';posStr[1]=' left:0;top:0';}else if(o3_shadowy<0){posStr[0]=' left:'+X+'px;top:0';posStr[1]=' left:0;top: '+Y+'px';}
  
  }else if(o3_shadowx<0){if(o3_shadowy>0){posStr[0]=' left:0;top:'+Y+'px';posStr[1]=' left:'+X+'px;top:0';}else if(o3_shadowy<0){posStr[0]=' left:0;top:0';posStr[1]=' left:'+X+'px;top:'+Y+'px';}}
  
  txt=(olNs4)?'<div id="backdrop"></div>':((olIe55&&olHideForm)?backDropSource(wd+X,ht+Y,zIdx++):'')+'<div id="backdrop" style="position: absolute;'+posStr[0]+';width: '+wd+'px;height: '+ht+'px;z-index: '+(zIdx++)+';';
  
  if(o3_shadowimage){bS='background-image: url('+o3_shadowimage+');';if(olNs4)bkSet=1;}else{bS='background-color: '+o3_shadowcolor+';';if(olNs4)bkSet=2;}
  
  if(olNs4){txt+='<div id="PUContent">'+content+'</div>';}else{txt+=bS+'"></div><div id="PUContent" style="position: absolute;'+posStr[1]+';width: '+wd+'px;z-index: '+(zIdx++)+';">'+content+'</div>';}
  
  layerWrite(txt);
  
  if(olNs4&&bkSet){dpObj=over.document.layers['backdrop'];if(typeof dpObj=='undefined')return;
  
  puObj=over.document.layers['PUContent'];wd=puObj.clip.width;ht=puObj.clip.height;aPos=posStr[0].split(';');
  
  dpObj.clip.width=wd;dpObj.clip.height=ht;dpObj.left=parseInt(aPos[0].split(':')[1]);dpObj.top=parseInt(aPos[1].split(':')[1]);
  
  dpObj.bgColor=(bkSet==1)?null:o3_shadowcolor;dpObj.background.src=(bkSet==2)?null:o3_shadowimage;dpObj.zIndex=0;
  
  aPos=posStr[1].split(';');puObj.left=parseInt(aPos[0].split(':')[1]);puObj.top=parseInt(aPos[1].split(':')[1]);puObj.zIndex=1;
  
  }else{puObj=(olIe4?o3_frame.document.all['PUContent']:o3_frame.document.getElementById('PUContent'));dpObj=(olIe4?o3_frame.document.all['backdrop']:o3_frame.document.getElementById('backdrop'));ht=puObj.offsetHeight;dpObj.style.height=ht+'px';
  
  if(o3_shadowopacity){var op=o3_shadowopacity;op=(op<=100?op:100);
  
  setBrowserOpacity(op,dpObj);}}
  
  o3_width=wd+X;o3_aboveheight=ht+Y;}
  
  function cleanUpShadowEffects(){if(olNs4||olOp)return;var dpObj=(olIe4?o3_frame.document.all['backdrop']:o3_frame.document.getElementById('backdrop'));cleanUpBrowserOpacity(dpObj);}
  
  function setBrowserOpacity(op,lyr){if(olNs4||!op)return;lyr=(lyr)?lyr:over;if(olIe4&&typeof lyr.filters!='undefined'){lyr.style.filter='Alpha(Opacity='+op+')';lyr.filters.alpha.enabled=true;}else{var sOp=(typeof(lyr.style.MozOpacity)!='undefined')?'MozOpacity':(typeof(lyr.style.KhtmlOpacity)!='undefined'?'KhtmlOpacity':(typeof(lyr.style.opacity)!='undefined'?'opacity':''));if(sOp)eval('lyr.style.'+sOp+'=op/100');}}
  
  function cleanUpBrowserOpacity(lyr){if(olNs4)return;lyr=(lyr)?lyr:over;if(olIe4&&(typeof lyr.filters!='undefined'&&lyr.filters.alpha.enabled)){lyr.style.filter='Alpha(Opacity=100)';lyr.filters.alpha.enabled=false;}else{var sOp=(typeof(lyr.style.MozOpacity)!='undefined')?'MozOpacity':(typeof(lyr.style.KhtmlOpacity)!='undefined'?'KhtmlOpacity':(typeof(lyr.style.opacity)!='undefined'?'opacity':''));if(sOp)eval('lyr.style.'+sOp+'=1.0');}}
  
  function shadowAdjust(){if(!olNs4)return;var fac=ol_shadowadjust;if(olNs4){document.write('<style type="text/css">\n<!--\n');document.write('#backdrop,#PUContent {position: absolute;left: '+fac*o3_shadowx+'px;top: '+fac*o3_shadowy+'px;}\n');document.write('-->\n<'+'\/style>');}}
  
  var before=(typeof rmrkPreface!='undefined'?rmrkPreface:null);
  
  registerRunTimeFunction(setShadowVariables);registerCmdLineFunction(parseShadowExtras);registerHook("cursorOff",shadow_cursorOff,FREPLACE);registerHook("hideObject",checkShadowPreHide,FBEFORE);registerHook("createPopup",generateShadow,FAFTER,before);if(olInfo.meets(4.10))registerNoParameterCommands('shadow');
  
  if(olNs4)shadowAdjust();
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/overlib_bubble.js
  
  Index: overlib_bubble.js
  ===================================================================
  //\/////
  
  //\  overLIB Speech Bubble Plugin
  
  //\
  
  //\  You may not remove or change this notice.
  
  //\  Copyright Erik Bosrup 1998-2003. All rights reserved.
  
  //\  Contributors are listed on the homepage.
  
  //\  See http://www.bosrup.com/web/overlib/ for details.
  
  //\/////
  
  ////////
  
  // PRE-INIT
  
  // Ignore these lines, configuration is below.
  
  ////////
  
  if (typeof olInfo == 'undefined' || typeof olInfo.meets == 'undefined' || !olInfo.meets(4.14)) alert('overLIB 4.14 or later is required for the Speech Bubble Plugin.');
  
  else {
  
  registerCommands('bubble,bubbletype,adjbubble');
  
  var imgWidth=[250,330,144,202,200];						    // image width in pixels
  
  var imgHeight=[150,160,190,221,66];							  // image height in pixels
  
  var contentWidth=[200,250,130,184,190];						// image content width in pixels
  
  var contentHeight=[80,85,150,176,46];						  // image content height in pixels
  
  var padLeft=[30,40,7,9,5];										  // X displacement of content from image upper left corner
  
  var padTop=[25,48,10,34,4];										  // Y displacement of content from image upper left corner
  
  var arwTipX=[180,50,51,9,19];                    // x location of tip from image upper left corner
  
  var arwTipY=[148,5,180,221,64];                  // y location of tip from image upper left corner
  
  ////////
  
  // DEFAULT CONFIGURATION
  
  // Settings you want everywhere are set here. All of this can also be
  
  // changed on your html page or through an overLIB call.
  
  ////////
  
  if (typeof ol_bubble=='undefined') var ol_bubble=0;
  
  if (typeof ol_bubbletype=='undefined') var ol_bubbletype='';
  
  if (typeof ol_adjbubble=='undefined') var ol_adjbubble=0;
  
  var olBId, olBContentWd=contentWidth;
  
  ////////
  
  // END OF CONFIGURATION
  
  // Don't change anything below this line, all configuration is above.
  
  ////////
  
  ////////
  
  // INIT
  
  ////////
  
  // Runtime variables init. Don't change for config!
  
  var o3_bubble=0;
  
  var o3_bubbletype='';
  
  var o3_adjbubble=0;
  
  ////////
  
  // PLUGIN FUNCTIONS
  
  ////////
  
  function setBubbleVariables() {
  
  	o3_bubble=ol_bubble;
  
  	o3_bubbletype=ol_bubbletype;
  
  	o3_adjbubble=ol_adjbubble;
  
  }
  
  // Parses Speech Bubble commands
  
  function parseBubbleExtras(pf,i,ar) {
  
  	var k=i;
  
  	if (k < ar.length) {
  
  		if (ar[k]==BUBBLE) { eval(pf +'bubble=('+pf+'bubble==0) ? 1 : 0'); return k; }
  
  		if (ar[k]==BUBBLETYPE) { eval(pf+'bubbletype="'+ar[++k]+'"'); return k; }
  
  		if (ar[k]==ADJBUBBLE) { eval(pf +'adjbubble=('+pf+'adjbubble==0) ? 1 : 0'); return k; }
  
  	}
  
  	return -1;
  
  }
  
  ////////
  
  // CHECKS FOR BUBBLE EFFECT
  
  ////////
  
  function chkForBubbleEffect() {
  
  	if(o3_bubble) {
  
  		o3_bubbletype=(o3_bubbletype) ? o3_bubbletype : 'flower';
  
  		for (var i=0; i<olBTypes.length; i++) {
  
  			if(olBTypes[i]==o3_bubbletype) {
  
  				olBId=i;
  
  				break;
  
  			}
  
  		}
  
  		// disable inappropriate parameters
  
  		o3_bgcolor=o3_fgcolor='';
  
  		o3_border=0;
  
  		if(o3_fgbackground||o3_bgbackground) o3_fgbackground=o3_bgbackground='';
  
  		if(o3_cap) o3_cap='';
  
  		if(o3_sticky) opt_NOCLOSE();
  
  		if(o3_fullhtml) o3_fullhtml=0;
  
  		if(o3_fixx>0||o3_fixy>0) o3_fixx=o3_fixy=-1;
  
  		if(o3_relx||o3_rely) o3_relx=o3_rely=null;
  
  		if(typeof o3_shadow!='undefined'&&o3_shadow) o3_shadow=0;
  
  		if(o3_bubbletype!='roundcorners') {
  
  			o3_width=olBContentWd[olBId];
  
  			if(o3_hpos==CENTER||o3_hpos==LEFT) o3_hpos=RIGHT;
  
  			if(o3_vpos==ABOVE) o3_vpos=BELOW;
  
  			if(o3_vauto) o3_vauto=0;
  
  			if(o3_hauto) o3_hauto=0;
  
  			if(o3_wrap) o3_wrap=0;
  
  		}
  
  	}
  
  	return true;
  
  }
  
  ////////
  
  // BUBBLE EFFECT SUPPORTING ROUTINES
  
  ////////
  
  function registerImages(imgStr,path) {
  
  	if(typeof imgStr!='string') return;
  
  	path=(path&&typeof path=='string') ? path : 'images';
  
  	if (path.charAt(path.length-1)=='/') path=path.substring(0,path.length-1);
  
  	if(typeof olBTypes=='undefined') olBTypes=imgStr.split(',');
  
  	if(typeof olBubbleImg=='undefined') {
  
  		olBubbleImg=new Array();
  
  		for (var i=0; i<olBTypes.length; i++) {
  
  			if(olBTypes[i]=='roundcorners') {
  
  				olBubbleImg[i]=new Array();
  
  				var o=olBubbleImg[i];
  
  				o[0]=new Image();
  
  				o[0].src=path+'/cornerTL.gif';
  
  				o[1]=new Image();
  
  				o[1].src=path+'/edgeT.gif';
  
  				o[2]=new Image();
  
  				o[2].src=path+'/cornerTR.gif';
  
  				o[3]=new Image();
  
  				o[3].src=path+'/edgeL.gif';
  
  				o[4]=new Image();
  
  				o[4].src=path+'/edgeR.gif';
  
  				o[5]=new Image();
  
  				o[5].src=path+'/cornerBL.gif';
  
  				o[6]=new Image();
  
  				o[6].src=path+'/edgeB.gif';
  
  				o[7]=new Image();
  
  				o[7].src=path+'/cornerBR.gif';
  
  			} else {
  
  				olBubbleImg[i]=new Image();
  
  				olBubbleImg[i].src=path+'/'+olBTypes[i]+'.gif';
  
  			}
  
  		}
  
  	}
  
  }
  
  function generateBubble(content) {
  
  	if(!o3_bubble) return;
  
  	if(o3_bubbletype=='roundcorners') return doRoundCorners(content);
  
  	var ar,X,Y,fc=1.0,txt,sY,bHtDiff, bPadDiff=0,zIdx=0;
  
  	var bTopPad=padTop,bLeftPad=padLeft;
  
  	var bContentHt=contentHeight, bHt=imgHeight;
  
  	var bWd=imgWidth, bArwTipX=arwTipX, bArwTipY=arwTipY;
  
  //
  
  	bHtDiff=fc*bContentHt[olBId]-(olNs4 ? over.clip.height : over.offsetHeight);
  
  	if (o3_adjbubble) {
  
  		fc=resizeBubble(bHtDiff, 0.5, fc);
  
  		ar=getHeightDiff(fc);
  
  		bHtDiff=ar[0];
  
  		content=ar[1];
  
  	}
  
  	if(bHtDiff>0) bPadDiff=parseInt(0.5*bHtDiff);
  
  	Y=(bHtDiff<0) ? fc*bTopPad[olBId] : fc*bTopPad[olBId]+bPadDiff;
  
  	X=fc*bLeftPad[olBId];
  
  	Y=Math.round(Y);
  
  	X=Math.round(X);
  
  //
  
  	txt=(olNs4) ? '<div id="bLayer">' : ((olIe55&&olHideForm) ? backDropSource(Math.round(fc*bWd[olBId]),Math.round((bHtDiff<0 ? fc*bHt[olBId]-bHtDiff : fc*bHt[olBId])),zIdx++) : '') + '<div id="bLayer" style="position: absolute; top:0; left:0; width: '+ Math.round(fc*bWd[olBId]) +'px; z-index: '+(zIdx++)+';">';
  
  	txt += '<img src="'+olBubbleImg[olBId].src+'" width="'+Math.round(fc*bWd[olBId])+'" height="'+Math.round((bHtDiff<0 ? fc*bHt[olBId]-bHtDiff : fc*bHt[olBId]))+'" /></div>';
  
  	txt += (olNs4 ? '<div id="bContent">' : '<div id="bContent" style="position: absolute; top:'+Y+'px; left:'+X+'px; width: '+ Math.round(fc*olBContentWd[olBId])+'px; z-index: '+(zIdx++)+';">')+content+'</div>'
  
  //
  
  	layerWrite(txt);
  
  	if(olNs4) {
  
  		var imgLyr=over.document.layers['bLayer'];
  
  		var cLyr=over.document.layers['bContent'];
  
  		imgLyr.zIndex=0;
  
  		cLyr.zIndex=1;
  
  		cLyr.top=Y;
  
  		cLyr.left=X;
  
  	}
  
  	// Set popup's new width and height values here so they are available in placeLayer()
  
  	o3_width=Math.round(fc*bWd[olBId]);
  
  	o3_aboveheight=Math.round(fc*bHt[olBId]);
  
  	if(fc*bArwTipY[olBId] < 0.5*fc*bHt[olBId]) 
  
  		sY = fc*bArwTipY[olBId]; 
  
  	else
  
  		sY = -(fc*bHt[olBId]+20)
  
  	o3_offsetx-=Math.round(fc*bArwTipX[olBId]);
  
  	o3_offsety+=Math.round(sY);
  
  }
  
  function doRoundCorners(content) {
  
  	var txt='', wd,ht, zIdx=0, o=olBubbleImg[olBId];
  
  	wd=(olNs4) ? over.clip.width : over.offsetWidth;
  
  	ht=(olNs4) ? over.clip.height : over.offsetHeight;
  
  	txt = (olIe55&&olHideForm) ? backDropSource(wd+28,ht+28,zIdx++) + '<div style="position:absolute; top: 0; left: 0; z-index: '+(zIdx++)+';">' : '';
  
  	txt+= '<table cellpadding="0" cellspacing="0" border="0">'+
  
  				'<tr><td align="right" valign="bottom"><img src="'+o[0].src+'" width="14" height="14"'+(olNs6 ? ' style="display: block;"' : '')+' /></td><td valign="bottom"><img src="'+o[1].src+'" height="14" width="'+wd+'"'+(olNs6 ? ' style="display: block;"' : '')+' /></td><td align="left" valign="bottom"><img src="'+o[2].src+'" width="14" height="14"'+(olNs6 ? ' style="display: block;"' : '')+' /></td></tr>'+
  
  				'<tr><td align="right"><img src="'+o[3].src+'" width="14" height="'+ht+'"'+(olNs6 ? ' style="display: block;"' : '')+' /></td><td bgcolor="#ffffcc">'+content+'</td><td align="left"><img src="'+o[4].src+'" width="14" height="'+ht+'"'+(olNs6 ? ' style="display: block;"' : '')+' /></td></tr>'+
  
  				'<tr><td align="right" valign="top"><img src="'+o[5].src+'" width="14" height="14" /></td><td valign="top"><img src="'+o[6].src+'" height="14" width="'+wd+'" /></td><td align="left" valign="top"><img src="'+o[7].src+'" width="14" height="14" /></td></tr></table>';
  
  	txt += (olIe55&&olHideForm) ? '</div>' : '';
  
  	layerWrite(txt);
  
  	o3_width=wd+28;
  
  	o3_aboveheight=ht+28;
  
  }
  
  function resizeBubble(h1, dF, fold) {
  
  	var df,h2,fnew,alpha,cnt=0;
  
  	while(cnt<2) {
  
  		df=-signOf(h1)*dF;
  
  		fnew=fold+df;
  
  		h2=getHeightDiff(fnew)[0];
  
  		if(Math.abs(h2)<o3_textsize) break;
  
  		if (signOf(h1)!=signOf(h2)) {
  
  			alpha=Math.abs(h1)/(Math.abs(h1)+Math.abs(h2));
  
  			if(h1<0) fnew=alpha*fnew+(1.0-alpha)*fold;
  
  			else fnew=(1.0-alpha)*fnew+alpha*fold;
  
  		} else {
  
  			alpha=Math.abs(h1)/(Math.abs(h2)-Math.abs(h1));
  
  			if(h1<0) fnew=(1.0+alpha)*fold-alpha*fnew;
  
  			else fnew=(1.0+alpha)*fnew-alpha*fold;
  
  		}
  
  		fold=fnew;
  
  		h1=h2;
  
  		dF*=0.5;
  
  		cnt++;
  
  	}
  
  	return fnew;
  
  }
  
  function getHeightDiff(f) {
  
  	var lyrhtml;
  
  	o3_width=Math.round(f*contentWidth[olBId]);
  
  	lyrhtml=runHook('ol_content_simple',FALTERNATE,o3_css,o3_text);
  
  	layerWrite(lyrhtml)
  
  	return [Math.round(f*contentHeight[olBId])-((olNs4) ? over.clip.height : over.offsetHeight),lyrhtml];
  
  }
  
  function signOf(x) {
  
  	return (x<0) ? -1 : 1;
  
  }
  
  ////////
  
  // PLUGIN REGISTRATIONS
  
  ////////
  
  registerRunTimeFunction(setBubbleVariables);
  
  registerCmdLineFunction(parseBubbleExtras);
  
  registerPostParseFunction(chkForBubbleEffect);
  
  registerHook("createPopup",generateBubble,FAFTER);
  
  registerImages('flower,oval,square,pushpin,quotation,roundcorners'); // root names given to images (should be gif file)
  
  if(olInfo.meets(4.14)) registerNoParameterCommands('bubble,adjbubble');
  
  if(olNs4) document.write('<style type="text/css">\n<!--\n#bLayer, #bContent {position: absolute;}\n-->\n<'+'\/style>');
  
  }
  
  //end 
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/cornerBL.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/cornerBR.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/cornerTL.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/cornerTR.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/edgeB.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/edgeL.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/edgeR.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/edgeT.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/flower.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/oval.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/pushpin.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/quotation.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/overlib/overlib_bubble/images/square.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/sarissa/Sarissa.js
  
  Index: Sarissa.js
  ===================================================================
  /**
   * ====================================================================
   * About
   * ====================================================================
   * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs.
   * The library supports Gecko based browsers like Mozilla and Firefox,
   * Internet Explorer (5.5+ with MSXML3.0+), Konqueror, Safari and a little of Opera
   * @version 0.9.6.1
   * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
   * ====================================================================
   * Licence 
   * ====================================================================
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 or
   * the GNU Lesser General Public License version 2.1 as published by
   * the Free Software Foundation (your choice between the two).
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License or GNU Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * or GNU Lesser General Public License along with this program; if not,
   * write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   * or visit http://www.gnu.org
   *
   */
  /**
   * <p>Sarissa is a utility class. Provides "static" methods for DOMDocument and 
   * XMLHTTP objects, DOM Node serializatrion to XML strings and other goodies.</p>
   * @constructor
   */
  function Sarissa(){};
  /** @private */
  Sarissa.PARSED_OK = "Document contains no parsing errors";
  /**
   * Tells you whether transformNode and transformNodeToObject are available. This functionality
   * is contained in sarissa_ieemu_xslt.js and is deprecated. If you want to control XSLT transformations
   * use the XSLTProcessor
   * @deprecated
   * @type boolean
   */
  Sarissa.IS_ENABLED_TRANSFORM_NODE = false;
  /**
   * tells you whether XMLHttpRequest (or equivalent) is available
   * @type boolean
   */
  Sarissa.IS_ENABLED_XMLHTTP = false;
  /**
   * tells you whether selectNodes/selectSingleNode is available
   * @type boolean
   */
  Sarissa.IS_ENABLED_SELECT_NODES = false;
  var _sarissa_iNsCounter = 0;
  var _SARISSA_IEPREFIX4XSLPARAM = "";
  var _SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;
  var _SARISSA_HAS_DOM_CREATE_DOCUMENT = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument;
  var _SARISSA_HAS_DOM_FEATURE = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;
  var _SARISSA_IS_MOZ = _SARISSA_HAS_DOM_CREATE_DOCUMENT && _SARISSA_HAS_DOM_FEATURE;
  var _SARISSA_IS_SAFARI = (navigator.userAgent && navigator.vendor && (navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1 || navigator.vendor.indexOf("Apple") != -1));
  var _SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1  && navigator.userAgent.toLowerCase().indexOf("opera") == -1;
  if(!window.Node || !window.Node.ELEMENT_NODE){
      var Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5,  ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12};
  };
  
  // IE initialization
  if(_SARISSA_IS_IE){
      // for XSLT parameter names, prefix needed by IE
      _SARISSA_IEPREFIX4XSLPARAM = "xsl:";
      // used to store the most recent ProgID available out of the above
      var _SARISSA_DOM_PROGID = "";
      var _SARISSA_XMLHTTP_PROGID = "";
      /**
       * Called when the Sarissa_xx.js file is parsed, to pick most recent
       * ProgIDs for IE, then gets destroyed.
       * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object
       * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled
       */
      pickRecentProgID = function (idList, enabledList){
          // found progID flag
          var bFound = false;
          for(var i=0; i < idList.length && !bFound; i++){
              try{
                  var oDoc = new ActiveXObject(idList[i]);
                  o2Store = idList[i];
                  bFound = true;
                  for(var j=0;j<enabledList.length;j++)
                      if(i <= enabledList[j][1])
                          Sarissa["IS_ENABLED_"+enabledList[j][0]] = true;
              }catch (objException){
                  // trap; try next progID
              };
          };
          if (!bFound)
              throw "Could not retreive a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";
          idList = null;
          return o2Store;
      };
      // pick best available MSXML progIDs
      _SARISSA_DOM_PROGID = pickRecentProgID(["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"], [["SELECT_NODES", 2],["TRANSFORM_NODE", 2]]);
      _SARISSA_XMLHTTP_PROGID = pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], [["XMLHTTP", 4]]);
      _SARISSA_THREADEDDOM_PROGID = pickRecentProgID(["Msxml2.FreeThreadedDOMDocument.5.0", "MSXML2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.3.0"]);
      _SARISSA_XSLTEMPLATE_PROGID = pickRecentProgID(["Msxml2.XSLTemplate.5.0", "Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0"], [["XSLTPROC", 2]]);
      // we dont need this anymore
      pickRecentProgID = null;
      //============================================
      // Factory methods (IE)
      //============================================
      // see non-IE version
      Sarissa.getDomDocument = function(sUri, sName){
          var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
          // if a root tag name was provided, we need to load it in the DOM
          // object
          if (sName){
              // if needed, create an artifical namespace prefix the way Moz
              // does
              if (sUri){
                  oDoc.loadXML("<a" + _sarissa_iNsCounter + ":" + sName + " xmlns:a" + _sarissa_iNsCounter + "=\"" + sUri + "\" />");
                  // don't use the same prefix again
                  ++_sarissa_iNsCounter;
              }
              else
                  oDoc.loadXML("<" + sName + "/>");
          };
          return oDoc;
      };
      // see non-IE version   
      Sarissa.getParseErrorText = function (oDoc) {
          var parseErrorText = Sarissa.PARSED_OK;
          if(oDoc.parseError != 0){
              parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason + 
                  "\nLocation: " + oDoc.parseError.url + 
                  "\nLine Number " + oDoc.parseError.line + ", Column " + 
                  oDoc.parseError.linepos + 
                  ":\n" + oDoc.parseError.srcText +
                  "\n";
              for(var i = 0;  i < oDoc.parseError.linepos;i++){
                  parseErrorText += "-";
              };
              parseErrorText +=  "^\n";
          };
          return parseErrorText;
      };
      // see non-IE version
      Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
          oDoc.setProperty("SelectionLanguage", "XPath");
          oDoc.setProperty("SelectionNamespaces", sNsSet);
      };   
      /**
       * Basic implementation of Mozilla's XSLTProcessor for IE. 
       * Reuses the same XSLT stylesheet for multiple transforms
       * @constructor
       */
      XSLTProcessor = function(){
          this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);
          this.processor = null;
      };
      /**
       * Impoprts the given XSLT DOM and compiles it to a reusable transform
       * @argument xslDoc The XSLT DOMDocument to import
       */
      XSLTProcessor.prototype.importStylesheet = function(xslDoc){
          // convert stylesheet to free threaded
          var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID); 
          converted.loadXML(xslDoc.xml);
          this.template.stylesheet = converted;
          this.processor = this.template.createProcessor();
          // (re)set default param values
          this.paramsSet = new Array();
      };
      /**
       * Transform the given XML DOM
       * @argument sourceDoc The XML DOMDocument to transform
       * @return The transformation result as a DOM Document
       */
      XSLTProcessor.prototype.transformToDocument = function(sourceDoc){
          this.processor.input = sourceDoc;
          var outDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
          this.processor.output = outDoc; 
          this.processor.transform();
          return outDoc;
      };
      /**
       * Set global XSLT parameter of the imported stylesheet
       * @argument nsURI The parameter namespace URI
       * @argument name The parameter base name
       * @argument value The new parameter value
       */
      XSLTProcessor.prototype.setParameter = function(nsURI, name, value){
          /* nsURI is optional but cannot be null */
          if(nsURI){
              this.processor.addParameter(name, value, nsURI);
          }else{
              this.processor.addParameter(name, value);
          };
          /* update updated params for getParameter */
          if(!this.paramsSet[""+nsURI]){
              this.paramsSet[""+nsURI] = new Array();
          };
          this.paramsSet[""+nsURI][name] = value;
      };
      /**
       * Gets a parameter if previously set by setParameter. Returns null
       * otherwise
       * @argument name The parameter base name
       * @argument value The new parameter value
       * @return The parameter value if reviously set by setParameter, null otherwise
       */
      XSLTProcessor.prototype.getParameter = function(nsURI, name){
          nsURI = nsURI || "";
          if(nsURI in this.paramsSet && name in this.paramsSet[nsURI]){
              return this.paramsSet[nsURI][name];
          }else{
              return null;
          };
      };
  }
  else{ /* end IE initialization, try to deal with real browsers now ;-) */
      if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){
          /**
           * <p>Ensures the document was loaded correctly, otherwise sets the
           * parseError to -1 to indicate something went wrong. Internal use</p>
           * @private
           */
          Sarissa.__handleLoad__ = function(oDoc){
              if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")
                  oDoc.parseError = -1;
              Sarissa.__setReadyState__(oDoc, 4);
          };
          /**
          * <p>Attached by an event handler to the load event. Internal use.</p>
          * @private
          */
          _sarissa_XMLDocument_onload = function(){
              Sarissa.__handleLoad__(this);
          };
          /**
           * <p>Sets the readyState property of the given DOM Document object.
           * Internal use.</p>
           * @private
           * @argument oDoc the DOM Document object to fire the
           *          readystatechange event
           * @argument iReadyState the number to change the readystate property to
           */
          Sarissa.__setReadyState__ = function(oDoc, iReadyState){
              oDoc.readyState = iReadyState;
              if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")
                  oDoc.onreadystatechange();
          };
          Sarissa.getDomDocument = function(sUri, sName){
              var oDoc = document.implementation.createDocument(sUri?sUri:"", sName?sName:"", null);
              oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);
              return oDoc;
          };
          if(window.XMLDocument){
              /**
              * <p>Emulate IE's onreadystatechange attribute</p>
              */
              XMLDocument.prototype.onreadystatechange = null;
              /**
              * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p>
              * <ul><li>1 == LOADING,</li>
              * <li>2 == LOADED,</li>
              * <li>3 == INTERACTIVE,</li>
              * <li>4 == COMPLETED</li></ul>
              */
              XMLDocument.prototype.readyState = 0;
              /**
              * <p>Emulate IE's parseError attribute</p>
              */
              XMLDocument.prototype.parseError = 0;
  
              // NOTE: setting async to false will only work with documents
              // called over HTTP (meaning a server), not the local file system,
              // unless you are using Moz 1.4+.
              // BTW the try>catch block is for 1.4; I haven't found a way to check if
              // the property is implemented without
              // causing an error and I dont want to use user agent stuff for that...
              var _SARISSA_SYNC_NON_IMPLEMENTED = false;// ("async" in XMLDocument.prototype) ? false: true;
              /**
              * <p>Keeps a handle to the original load() method. Internal use and only
              * if Mozilla version is lower than 1.4</p>
              * @private
              */
              XMLDocument.prototype._sarissa_load = XMLDocument.prototype.load;
  
              /**
              * <p>Overrides the original load method to provide synchronous loading for
              * Mozilla versions prior to 1.4, using an XMLHttpRequest object (if
              * async is set to false)</p>
              * @returns the DOM Object as it was before the load() call (may be  empty)
              */
              XMLDocument.prototype.load = function(sURI) {
                  var oDoc = document.implementation.createDocument("", "", null);
                  Sarissa.copyChildNodes(this, oDoc);
                  this.parseError = 0;
                  Sarissa.__setReadyState__(this, 1);
                  try {
                      if(this.async == false && _SARISSA_SYNC_NON_IMPLEMENTED) {
                          var tmp = new XMLHttpRequest();
                          tmp.open("GET", sURI, false);
                          tmp.send(null);
                          Sarissa.__setReadyState__(this, 2);
                          Sarissa.copyChildNodes(tmp.responseXML, this);
                          Sarissa.__setReadyState__(this, 3);
                      }
                      else {
                          this._sarissa_load(sURI);
                      };
                  }
                  catch (objException) {
                      this.parseError = -1;
                  }
                  finally {
                      if(this.async == false){
                          Sarissa.__handleLoad__(this);
                      };
                  };
                  return oDoc;
              };
              
              
          }//if(window.XMLDocument)
          else if(document.implementation && document.implementation.hasFeature && document.implementation.hasFeature('LS', '3.0')){
              Document.prototype.async = true;
              Document.prototype.onreadystatechange = null;
              Document.prototype.parseError = 0;
              Document.prototype.load = function(sURI) {
                  var parser = document.implementation.createLSParser(this.async ? document.implementation.MODE_ASYNCHRONOUS : document.implementation.MODE_SYNCHRONOUS, null);
                  if(this.async){
                      var self = this;
                      parser.addEventListener("load", 
                          function(e) { 
                              self.readyState = 4;
                              Sarissa.copyChildNodes(e.newDocument, self.documentElement, false);
                              self.onreadystatechange.call(); 
                          }, 
                          false); 
                  };
                  try {
                      var oDoc = parser.parseURI(sURI);
                  }
                  catch(e){
                      this.parseError = -1;
                  };
                  if(!this.async)
                     Sarissa.copyChildNodes(oDoc, this.documentElement, false);
                  return oDoc;
              };
              /**
              * <p>Factory method to obtain a new DOM Document object</p>
              * @argument sUri the namespace of the root node (if any)
              * @argument sUri the local name of the root node (if any)
              * @returns a new DOM Document
              */
              Sarissa.getDomDocument = function(sUri, sName){
                  return document.implementation.createDocument(sUri?sUri:"", sName?sName:"", null);
              };        
          };
      };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)
  };
  //==========================================
  // Common stuff
  //==========================================
  if(!window.DOMParser){
      /*
      * DOMParser is a utility class, used to construct DOMDocuments from XML strings
      * @constructor
      */
      DOMParser = function() {
      };
      if(_SARISSA_IS_SAFARI){
          /** 
          * Construct a new DOM Document from the given XMLstring
          * @param sXml the given XML string
          * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml). 
          * @return a new DOM Document from the given XML string
          */
          DOMParser.prototype.parseFromString = function(sXml, contentType){
              if(contentType.toLowerCase() != "application/xml"){
                  throw "Cannot handle content type: \"" + contentType + "\"";
              };
              var xmlhttp = new XMLHttpRequest();
              xmlhttp.open("GET", "data:text/xml;charset=utf-8," + encodeURIComponent(str), false);
              xmlhttp.send(null);
              return xmlhttp.responseXML;
          };
      }else if(Sarissa.getDomDocument && Sarissa.getDomDocument() && "loadXML" in Sarissa.getDomDocument()){
          DOMParser.prototype.parseFromString = function(sXml, contentType){
              var doc = Sarissa.getDomDocument();
              doc.loadXML(sXml);
              return doc;
          };
      };
  };
  
  if(window.XMLHttpRequest){
      Sarissa.IS_ENABLED_XMLHTTP = true;
  }
  else if(_SARISSA_IS_IE){
      /**
       * Emulate XMLHttpRequest
       * @constructor
       */
      XMLHttpRequest = function() {
          return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);
      };
      Sarissa.IS_ENABLED_XMLHTTP = true;
  };
  
  if(!window.document.importNode && _SARISSA_IS_IE){
      try{
          /**
          * Implements importNode for the current window document in IE using innerHTML.
          * Testing showed that DOM was multiple times slower than innerHTML for this,
          * sorry folks. If you encounter trouble (who knows what IE does behind innerHTML)
          * please gimme a call.
          * @param oNode the Node to import
          * @param bChildren whether to include the children of oNode
          * @returns the imported node for further use
          */
          window.document.importNode = function(oNode, bChildren){
              var importNode = document.createElement("div");
              if(bChildren)
                  importNode.innerHTML = Sarissa.serialize(oNode);
              else
                  importNode.innerHTML = Sarissa.serialize(oNode.cloneNode(false));
              return importNode.firstChild;
          };
          }catch(e){};
  };
  if(!Sarissa.getParseErrorText){
      /**
       * <p>Returns a human readable description of the parsing error. Usefull
       * for debugging. Tip: append the returned error string in a &lt;pre&gt;
       * element if you want to render it.</p>
       * <p>Many thanks to Christian Stocker for the initial patch.</p>
       * @argument oDoc The target DOM document
       * @returns The parsing error description of the target Document in
       *          human readable form (preformated text)
       */
      Sarissa.getParseErrorText = function (oDoc){
          var parseErrorText = Sarissa.PARSED_OK;
          if(oDoc && oDoc.parseError && oDoc.parseError != 0){
              /*moz*/
              if(oDoc.documentElement.tagName == "parsererror"){
                  parseErrorText = oDoc.documentElement.firstChild.data;
                  parseErrorText += "\n" +  oDoc.documentElement.firstChild.nextSibling.firstChild.data;
              }/*konq*/
              else{
                  parseErrorText = Sarissa.getText(oDoc.documentElement);/*.getElementsByTagName("h1")[0], false) + "\n";
                  parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("body")[0], false) + "\n";
                  parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("pre")[0], false);*/
              };
          };
          return parseErrorText;
      };
  };
  Sarissa.getText = function(oNode, deep){
      var s = "";
      var nodes = oNode.childNodes;
      for(var i=0; i < nodes.length; i++){
          var node = nodes[i];
          var nodeType = node.nodeType;
          if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){
              s += node.data;
          }else if(deep == true
                      && (nodeType == Node.ELEMENT_NODE
                          || nodeType == Node.DOCUMENT_NODE
                          || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){
              s += Sarissa.getText(node, true);
          };
      };
      return s;
  };
  if(window.XMLSerializer){
      /**
       * <p>Factory method to obtain the serialization of a DOM Node</p>
       * @returns the serialized Node as an XML string
       */
      Sarissa.serialize = function(oDoc){
          var s = null;
          if(oDoc){
              s = oDoc.innerHTML?oDoc.innerHTML:(new XMLSerializer()).serializeToString(oDoc);
          };
          return s;
      };
  }else{
      if(Sarissa.getDomDocument && (Sarissa.getDomDocument("","foo", null)).xml){
          // see non-IE version
          Sarissa.serialize = function(oDoc) {
              var s = null;
              if(oDoc){
                  s = oDoc.innerHTML?oDoc.innerHTML:oDoc.xml;
              };
              return s;
          };
          /**
           * Utility class to serialize DOM Node objects to XML strings
           * @constructor
           */
          XMLSerializer = function(){};
          /**
           * Serialize the given DOM Node to an XML string
           * @param oNode the DOM Node to serialize
           */
          XMLSerializer.prototype.serializeToString = function(oNode) {
              return oNode.xml;
          };
      };
  };
  
  /**
   * strips tags from a markup string
   */
  Sarissa.stripTags = function (s) {
      return s.replace(/<[^>]+>/g,"");
  };
  /**
   * <p>Deletes all child nodes of the given node</p>
   * @argument oNode the Node to empty
   */
  Sarissa.clearChildNodes = function(oNode) {
      // need to check for firstChild due to opera 8 bug with hasChildNodes
      while(oNode.firstChild){
          oNode.removeChild(oNode.firstChild);
      };
  };
  /**
   * <p> Copies the childNodes of nodeFrom to nodeTo</p>
   * <p> <b>Note:</b> The second object's original content is deleted before 
   * the copy operation, unless you supply a true third parameter</p>
   * @argument nodeFrom the Node to copy the childNodes from
   * @argument nodeTo the Node to copy the childNodes to
   * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false
   */
  Sarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
      if((!nodeFrom) || (!nodeTo)){
          throw "Both source and destination nodes must be provided";
      };
      if(!bPreserveExisting){
          Sarissa.clearChildNodes(nodeTo);
      };
      var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
      var nodes = nodeFrom.childNodes;
      if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {
          for(var i=0;i < nodes.length;i++) {
              nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
          };
      }
      else{
          for(var i=0;i < nodes.length;i++) {
              nodeTo.appendChild(nodes[i].cloneNode(true));
          };
      };
  };
  
  /**
   * <p> Moves the childNodes of nodeFrom to nodeTo</p>
   * <p> <b>Note:</b> The second object's original content is deleted before 
   * the move operation, unless you supply a true third parameter</p>
   * @argument nodeFrom the Node to copy the childNodes from
   * @argument nodeTo the Node to copy the childNodes to
   * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is
   */ 
  Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
      if((!nodeFrom) || (!nodeTo)){
          throw "Both source and destination nodes must be provided";
      };
      if(!bPreserveExisting){
          Sarissa.clearChildNodes(nodeTo);
      };
      var nodes = nodeFrom.childNodes;
      // if within the same doc, just move, else copy and delete
      if(nodeFrom.ownerDocument == nodeTo.ownerDocument){
          while(nodeFrom.firstChild){
              nodeTo.appendChild(nodeFrom.firstChild);
          };
      }else{
          var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
          if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {
             for(var i=0;i < nodes.length;i++) {
                 nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
             };
          }else{
             for(var i=0;i < nodes.length;i++) {
                 nodeTo.appendChild(nodes[i].cloneNode(true));
             };
          };
          Sarissa.clearChildNodes(nodeFrom);
      };
  };
  
  /** 
   * <p>Serialize any object to an XML string. All properties are serialized using the property name
   * as the XML element name. Array elements are rendered as <code>array-item</code> elements, 
   * using their index/key as the value of the <code>key</code> attribute.</p>
   * @argument anyObject the object to serialize
   * @argument objectName a name for that object
   * @return the XML serializationj of the given object as a string
   */
  Sarissa.xmlize = function(anyObject, objectName, indentSpace){
      indentSpace = indentSpace?indentSpace:'';
      var s = indentSpace  + '<' + objectName + '>';
      var isLeaf = false;
      if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String 
          || anyObject instanceof Boolean || anyObject instanceof Date){
          s += Sarissa.escape(""+anyObject);
          isLeaf = true;
      }else{
          s += "\n";
          var itemKey = '';
          var isArrayItem = anyObject instanceof Array;
          for(var name in anyObject){
              s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\""+name+"\"":name), indentSpace + "   ");
          };
          s += indentSpace;
      };
      return s += (objectName.indexOf(' ')!=-1?"</array-item>\n":"</" + objectName + ">\n");
  };
  
  /** 
   * Escape the given string chacters that correspond to the five predefined XML entities
   * @param sXml the string to escape
   */
  Sarissa.escape = function(sXml){
      return sXml.replace(/&/g, "&amp;")
          .replace(/</g, "&lt;")
          .replace(/>/g, "&gt;")
          .replace(/"/g, "&quot;")
          .replace(/'/g, "&apos;");
  };
  
  /** 
   * Unescape the given string. This turns the occurences of the predefined XML 
   * entities to become the characters they represent correspond to the five predefined XML entities
   * @param sXml the string to unescape
   */
  Sarissa.unescape = function(sXml){
      return sXml.replace(/&apos;/g,"'")
          .replace(/&quot;/g,"\"")
          .replace(/&gt;/g,">")
          .replace(/&lt;/g,"<")
          .replace(/&amp;/g,"&");
  };
  //   EOF
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/sarissa/sarissa_dhtml.js
  
  Index: sarissa_dhtml.js
  ===================================================================
  /** 
   * ====================================================================
   * About
   * ====================================================================
   * Sarissa cross browser XML library - AJAX module
   * @version 0.9.6.1
   * @author: Copyright Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
   *
   * This module contains some convinient AJAX tricks based on Sarissa 
   *
   * ====================================================================
   * Licence
   * ====================================================================
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 or
   * the GNU Lesser General Public License version 2.1 as published by
   * the Free Software Foundation (your choice between the two).
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License or GNU Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * or GNU Lesser General Public License along with this program; if not,
   * write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   * or visit http://www.gnu.org
   *
   */
  /**
   * Update an element with response of a GET request on the given URL. 
   * @addon
   * @param sFromUrl the URL to make the request to
   * @param oTargetElement the element to update
   * @param xsltproc (optional) the transformer to use on the returned
   *                  content before updating the target element with it
   */
  Sarissa.updateContentFromURI = function(sFromUrl, oTargetElement, xsltproc) {
      try{
          oTargetElement.style.cursor = "wait";
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.open("GET", sFromUrl);
          function sarissa_dhtml_loadHandler() {
              if (xmlhttp.readyState == 4) {
                  oTargetElement.style.cursor = "auto";
                  Sarissa.updateContentFromNode(xmlhttp.responseXML, oTargetElement, xsltproc);
              };
          };
          xmlhttp.onreadystatechange = sarissa_dhtml_loadHandler;
          xmlhttp.send(null);
          oTargetElement.style.cursor = "auto";
      }
      catch(e){
          oTargetElement.style.cursor = "auto";
          throw e;
      };
  };
  
  /**
   * Update an element's content with the given DOM node.
   * @addon
   * @param sFromUrl the URL to make the request to
   * @param oTargetElement the element to update
   * @param xsltproc (optional) the transformer to use on the given 
   *                  DOM node before updating the target element with it
   */
  Sarissa.updateContentFromNode = function(oNode, oTargetElement, xsltproc) {
      try {
          oTargetElement.style.cursor = "wait";
          Sarissa.clearChildNodes(oTargetElement);
          // check for parsing errors
          var ownerDoc = oNode.nodeType == Node.DOCUMENT_NODE?oNode:oNode.ownerDocument;
          if(ownerDoc.parseError && ownerDoc.parseError != 0) {
              var pre = document.createElement("pre");
              pre.appendChild(document.createTextNode(Sarissa.getParseErrorText(ownerDoc)));
              oTargetElement.appendChild(pre);
          }
          else {
              // transform if appropriate
              if(xsltproc) {
                  oNode = xsltproc.transformToDocument(oNode);
              };
              // be smart, maybe the user wants to display the source instead
              if(oTargetElement.tagName.toLowerCase == "textarea" || oTargetElement.tagName.toLowerCase == "input") {
                  oTargetElement.value = Sarissa.serialize(oNode);
              }
              else {
                  // ok that was not smart; it was paranoid. Keep up the good work by trying to use DOM instead of innerHTML
                  if(oNode.nodeType == Node.DOCUMENT_NODE || oNode.ownerDocument.documentElement == oNode) {
                      oTargetElement.innerHTML = Sarissa.serialize(oNode);
                  }
                  else{
                      oTargetElement.appendChild(oTargetElement.ownerDocument.importNode(oNode, true));
                  };
              };  
          };
      }
      catch(e) {
          throw e;
      }
      finally{
          oTargetElement.style.cursor = "auto";
      };
  };
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/sarissa/sarissa_ieemu_xpath.js
  
  Index: sarissa_ieemu_xpath.js
  ===================================================================
  /**
   * ====================================================================
   * About
   * ====================================================================
   * Sarissa cross browser XML library - IE XPath Emulation 
   * @version 0.9.6.1
   * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
   *
   * This script emulates Internet Explorer's selectNodes and selectSingleNode
   * for Mozilla. Associating namespace prefixes with URIs for your XPath queries
   * is easy with IE's setProperty. 
   * USers may also map a namespace prefix to a default (unprefixed) namespace in the
   * source document with Sarissa.setXpathNamespaces
   * 
   *
   * ====================================================================
   * Licence
   * ====================================================================
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 or
   * the GNU Lesser General Public License version 2.1 as published by
   * the Free Software Foundation (your choice between the two).
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License or GNU Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * or GNU Lesser General Public License along with this program; if not,
   * write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   * or visit http://www.gnu.org
   *
   */
   var _SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;
   var _SARISSA_HAS_DOM_FEATURE = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;
   
  if(_SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){
      /**
      * <p>SarissaNodeList behaves as a NodeList but is only used as a result to <code>selectNodes</code>,
      * so it also has some properties IEs proprietery object features.</p>
      * @private
      * @constructor
      * @argument i the (initial) list size
      */
      function SarissaNodeList(i){
          this.length = i;
      };
      /** <p>Set an Array as the prototype object</p> */
      SarissaNodeList.prototype = new Array(0);
      /** <p>Inherit the Array constructor </p> */
      SarissaNodeList.prototype.constructor = Array;
      /**
      * <p>Returns the node at the specified index or null if the given index
      * is greater than the list size or less than zero </p>
      * <p><b>Note</b> that in ECMAScript you can also use the square-bracket
      * array notation instead of calling <code>item</code>
      * @argument i the index of the member to return
      * @returns the member corresponding to the given index
      */
      SarissaNodeList.prototype.item = function(i) {
          return (i < 0 || i >= this.length)?null:this[i];
      };
      /**
      * <p>Emulate IE's expr property
      * (Here the SarissaNodeList object is given as the result of selectNodes).</p>
      * @returns the XPath expression passed to selectNodes that resulted in
      *          this SarissaNodeList
      */
      SarissaNodeList.prototype.expr = "";
      /** dummy, used to accept IE's stuff without throwing errors */
      XMLDocument.prototype.setProperty  = function(x,y){};
      /**
      * <p>Programmatically control namespace URI/prefix mappings for XPath
      * queries.</p>
      * <p>This method comes especially handy when used to apply XPath queries
      * on XML documents with a default namespace, as there is no other way
      * of mapping that to a prefix.</p>
      * <p>Using no namespace prefix in DOM Level 3 XPath queries, implies you
      * are looking for elements in the null namespace. If you need to look
      * for nodes in the default namespace, you need to map a prefix to it
      * first like:</p>
      * <pre>Sarissa.setXpathNamespaces(oDoc, &quot;xmlns:myprefix=&amp;aposhttp://mynsURI&amp;apos&quot;);</pre>
      * <p><b>Note 1 </b>: Use this method only if the source document features
      * a default namespace (without a prefix), otherwise just use IE's setProperty
      * (moz will rezolve non-default namespaces by itself). You will need to map that
      * namespace to a prefix for queries to work.</p>
      * <p><b>Note 2 </b>: This method calls IE's setProperty method to set the
      * appropriate namespace-prefix mappings, so you dont have to do that.</p>
      * @param oDoc The target XMLDocument to set the namespace mappings for.
      * @param sNsSet A whilespace-seperated list of namespace declarations as
      *            those would appear in an XML document. E.g.:
      *            <code>&quot;xmlns:xhtml=&apos;http://www.w3.org/1999/xhtml&apos;
      * xmlns:&apos;http://www.w3.org/1999/XSL/Transform&apos;&quot;</code>
      * @throws An error if the format of the given namespace declarations is bad.
      */
      Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
          //oDoc._sarissa_setXpathNamespaces(sNsSet);
          oDoc._sarissa_useCustomResolver = true;
          var namespaces = sNsSet.indexOf(" ")>-1?sNsSet.split(" "):new Array(sNsSet);
          oDoc._sarissa_xpathNamespaces = new Array(namespaces.length);
          for(var i=0;i < namespaces.length;i++){
              var ns = namespaces[i];
              var colonPos = ns.indexOf(":");
              var assignPos = ns.indexOf("=");
              if(colonPos == 5 && assignPos > colonPos+2){
                  var prefix = ns.substring(colonPos+1, assignPos);
                  var uri = ns.substring(assignPos+2, ns.length-1);
                  oDoc._sarissa_xpathNamespaces[prefix] = uri;
              }else{
                  throw "Bad format on namespace declaration(s) given";
              };
          };
      };
      /**
      * @private Flag to control whether a custom namespace resolver should
      *          be used, set to true by Sarissa.setXpathNamespaces
      */
      XMLDocument.prototype._sarissa_useCustomResolver = false;
      /** @private */
      XMLDocument.prototype._sarissa_xpathNamespaces = new Array();
      /**
      * <p>Extends the XMLDocument to emulate IE's selectNodes.</p>
      * @argument sExpr the XPath expression to use
      * @argument contextNode this is for internal use only by the same
      *           method when called on Elements
      * @returns the result of the XPath search as a SarissaNodeList
      * @throws An error if no namespace URI is found for the given prefix.
      */
      XMLDocument.prototype.selectNodes = function(sExpr, contextNode){
          var nsDoc = this;
          var nsresolver = this._sarissa_useCustomResolver
          ? function(prefix){
              var s = nsDoc._sarissa_xpathNamespaces[prefix];
              if(s)return s;
              else throw "No namespace URI found for prefix: '" + prefix+"'";
              }
          : this.createNSResolver(this.documentElement);
              var oResult = this.evaluate(sExpr,
                      (contextNode?contextNode:this),
                      nsresolver,
                      XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
          var nodeList = new SarissaNodeList(oResult.snapshotLength);
          nodeList.expr = sExpr;
          for(var i=0;i<nodeList.length;i++)
              nodeList[i] = oResult.snapshotItem(i);
          return nodeList;
      };
      /**
      * <p>Extends the Element to emulate IE's selectNodes</p>
      * @argument sExpr the XPath expression to use
      * @returns the result of the XPath search as an (Sarissa)NodeList
      * @throws An
      *             error if invoked on an HTML Element as this is only be
      *             available to XML Elements.
      */
      Element.prototype.selectNodes = function(sExpr){
          var doc = this.ownerDocument;
          if(doc.selectNodes)
              return doc.selectNodes(sExpr, this);
          else
              throw "Method selectNodes is only supported by XML Elements";
      };
      /**
      * <p>Extends the XMLDocument to emulate IE's selectSingleNodes.</p>
      * @argument sExpr the XPath expression to use
      * @argument contextNode this is for internal use only by the same
      *           method when called on Elements
      * @returns the result of the XPath search as an (Sarissa)NodeList
      */
      XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){
          var ctx = contextNode?contextNode:null;
          sExpr = "("+sExpr+")[1]";
          var nodeList = this.selectNodes(sExpr, ctx);
          if(nodeList.length > 0)
              return nodeList.item(0);
          else
              return null;
      };
      /**
      * <p>Extends the Element to emulate IE's selectNodes.</p>
      * @argument sExpr the XPath expression to use
      * @returns the result of the XPath search as an (Sarissa)NodeList
      * @throws An error if invoked on an HTML Element as this is only be
      *             available to XML Elements.
      */
      Element.prototype.selectSingleNode = function(sExpr){
          var doc = this.ownerDocument;
          if(doc.selectSingleNode)
              return doc.selectSingleNode(sExpr, this);
          else
              throw "Method selectNodes is only supported by XML Elements";
      };
      Sarissa.IS_ENABLED_SELECT_NODES = true;
  };
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/sarissa/sarissa_ieemu_xslt.js
  
  Index: sarissa_ieemu_xslt.js
  ===================================================================
  /**
   * ====================================================================
   * About
   * ====================================================================
   * Sarissa cross browser XML library - IE XSLT Emulation (deprecated)
   * @version 0.9.6.1
   * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
   *
   * This script emulates Internet Explorer's transformNode and transformNodeToObject
   * for Mozilla and provides a common way to set XSLT parameters
   * via Sarissa.setXslParameter.
   *
   * All functionality in this file is DEPRECATED, the XSLTProcessor
   * should be used instead.
   * 
   * ====================================================================
   * Licence
   * ====================================================================
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 or
   * the GNU Lesser General Public License version 2.1 as published by
   * the Free Software Foundation (your choice between the two).
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License or GNU Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * or GNU Lesser General Public License along with this program; if not,
   * write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   * or visit http://www.gnu.org
   *
   */
  if(!Sarissa.IS_ENABLED_TRANSFORM_NODE && window.XSLTProcessor){
      /** 
       * <p><b>Deprecated, will be removed in 0.9.6 (use XSLTProcessor instead): </b>Extends the Element class to emulate IE's transformNodeToObject (deprecated).
       * <b>Note </b>: The transformation result <i>must </i> be well formed,
       * otherwise an error will be thrown</p>
       * @uses Mozilla's XSLTProcessor  
       * @deprecated use the XSLTProcessor instead
       * @argument xslDoc The stylesheet to use (a DOM Document instance)
       * @argument oResult The Document to store the transformation result
       */
      Element.prototype.transformNodeToObject = function(xslDoc, oResult){
          var oDoc = document.implementation.createDocument("", "", null);
          Sarissa.copyChildNodes(this, oDoc);
          oDoc.transformNodeToObject(xslDoc, oResult);
      };
      /**
       * <p><b>Deprecated, will be removed in 0.9.6 (use XSLTProcessor instead): </b> Extends the Document class to emulate IE's transformNodeToObject (deprecated).</p>
       * @uses Mozilla's XSLTProcessor  
       * @deprecated use the XSLTProcessor instead
       * @argument xslDoc The stylesheet to use (a DOM Document instance)
       * @argument oResult The Document to store the transformation result
       * @throws Errors that try to be informative
       */
      Document.prototype.transformNodeToObject = function(xslDoc, oResult){
          var xsltProcessor = null;
          try{
              xsltProcessor = new XSLTProcessor();
              if(xsltProcessor.reset){
                  /* new nsIXSLTProcessor is available */
                  xsltProcessor.importStylesheet(xslDoc);
                  var newFragment = xsltProcessor.transformToFragment(this, oResult);
                  Sarissa.copyChildNodes(newFragment, oResult);
              }else{
                  /* only nsIXSLTProcessorObsolete is available */
                  xsltProcessor.transformDocument(this, xslDoc, oResult, null);
              };
          }catch(e){
              if(xslDoc && oResult)
                  throw "Failed to transform document. (original exception: "+e+")";
              else if(!xslDoc)
                  throw "No Stylesheet Document was provided. (original exception: "+e+")";
              else if(!oResult)
                  throw "No Result Document was provided. (original exception: "+e+")";
              else if(xsltProcessor == null)
                  throw "Could not instantiate an XSLTProcessor object. (original exception: "+e+")";
              else
                  throw e;
          };
      };
      /**
       * <p><b>Deprecated, will be removed in 0.9.6 (use XSLTProcessor instead): </b>Extends the Element class to emulate IE's transformNode (deprecated). </p>
       * <p><b>Note </b>: The result of your transformation must be well formed,
       * otherwise you will get an error</p>. 
       * @uses Mozilla's XSLTProcessor    
       * @deprecated use the XSLTProcessor instead
       * @argument xslDoc The stylesheet to use (a DOM Document instance)
       * @returns the result of the transformation serialized to an XML String
       */
      Element.prototype.transformNode = function(xslDoc){
          var oDoc = document.implementation.createDocument("", "", null);
          Sarissa.copyChildNodes(this, oDoc);
          return oDoc.transformNode(xslDoc);
      };
      /**
       * <p><b>Deprecated, will be removed in 0.9.6 (use XSLTProcessor instead): </b>Extends the Document class to emulate IE's transformNode (deprecated).</p>
       * <p><b>Note </b>: The result of your transformation must be well formed,
       * otherwise you will get an error</p>
       * @uses Mozilla's XSLTProcessor
       * @deprecated use the XSLTProcessor instead
       * @argument xslDoc The stylesheet to use (a DOM Document instance)
       * @returns the result of the transformation serialized to an XML String
       */
      Document.prototype.transformNode = function(xslDoc){
          var out = document.implementation.createDocument("", "", null);
          this.transformNodeToObject(xslDoc, out);
          var str = null;
          try{
              var serializer = new XMLSerializer();
              str = serializer.serializeToString(out);
          }catch(e){
              throw "Failed to serialize result document. (original exception: "+e+")";
          };
          return str;
      };
      Sarissa.IS_ENABLED_TRANSFORM_NODE = true;
  };
  /**
   * <p><b>Deprecated, will be removed in 0.9.6 (use XSLTProcessor instead): </b>Set xslt parameters.</p>
   * <p><b>Note </b> that this method can only work for the main stylesheet and not any included/imported files.</p>
   * @deprecated use the XSLTProcessor instead
   * @argument oXslDoc the target XSLT DOM Document
   * @argument sParamName the name of the XSLT parameter
   * @argument sParamValue the value of the XSLT parameter
   * @returns whether the parameter was set succefully
   */
  Sarissa.setXslParameter = function(oXslDoc, sParamQName, sParamValue){
      try{
          var params = oXslDoc.getElementsByTagName(_SARISSA_IEPREFIX4XSLPARAM+"param");
          var iLength = params.length;
          var bFound = false;
          var param;
          if(sParamValue){
              for(var i=0; i < iLength && !bFound;i++){
                  if(params[i].getAttribute("name") == sParamQName){
                          param = params[i];
                      while(param.firstChild)
                          param.removeChild(param.firstChild);
                      if(!sParamValue || sParamValue == null){
                      }else if(typeof sParamValue == "string"){ 
                          param.setAttribute("select", sParamValue);
                          bFound = true;
                      }else if(sParamValue.nodeName){
                          param.removeAttribute("select");
                          param.appendChild(sParamValue.cloneNode(true));
                          bFound = true;
                      }else if (sParamValue.item(0) && sParamValue.item(0).nodeType){
                          for(var j=0;j < sParamValue.length;j++)
                              if(sParamValue.item(j).nodeType)
                                  param.appendChild(sParamValue.item(j).cloneNode(true));
                          bFound = true;
                      }else
                          throw "Failed to set xsl:param "+sParamQName+" (original exception: "+e+")";
                  };
              };
          };
          return bFound;
      }catch(e){
          throw e;
          return false;
      };
  };
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/scalebar/fancy-bar-alt.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/scalebar/fancy-bar.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/scalebar/license.txt
  
  Index: license.txt
  ===================================================================
  		  GNU LESSER GENERAL PUBLIC LICENSE
  		       Version 2.1, February 1999
  
   Copyright (C) 1991, 1999 Free Software Foundation, Inc.
       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   Everyone is permitted to copy and distribute verbatim copies
   of this license document, but changing it is not allowed.
  
  [This is the first released version of the Lesser GPL.  It also counts
   as the successor of the GNU Library Public License, version 2, hence
   the version number 2.1.]
  
  			    Preamble
  
    The licenses for most software are designed to take away your
  freedom to share and change it.  By contrast, the GNU General Public
  Licenses are intended to guarantee your freedom to share and change
  free software--to make sure the software is free for all its users.
  
    This license, the Lesser General Public License, applies to some
  specially designated software packages--typically libraries--of the
  Free Software Foundation and other authors who decide to use it.  You
  can use it too, but we suggest you first think carefully about whether
  this license or the ordinary General Public License is the better
  strategy to use in any particular case, based on the explanations below.
  
    When we speak of free software, we are referring to freedom of use,
  not price.  Our General Public Licenses are designed to make sure that
  you have the freedom to distribute copies of free software (and charge
  for this service if you wish); that you receive source code or can get
  it if you want it; that you can change the software and use pieces of
  it in new free programs; and that you are informed that you can do
  these things.
  
    To protect your rights, we need to make restrictions that forbid
  distributors to deny you these rights or to ask you to surrender these
  rights.  These restrictions translate to certain responsibilities for
  you if you distribute copies of the library or if you modify it.
  
    For example, if you distribute copies of the library, whether gratis
  or for a fee, you must give the recipients all the rights that we gave
  you.  You must make sure that they, too, receive or can get the source
  code.  If you link other code with the library, you must provide
  complete object files to the recipients, so that they can relink them
  with the library after making changes to the library and recompiling
  it.  And you must show them these terms so they know their rights.
  
    We protect your rights with a two-step method: (1) we copyright the
  library, and (2) we offer you this license, which gives you legal
  permission to copy, distribute and/or modify the library.
  
    To protect each distributor, we want to make it very clear that
  there is no warranty for the free library.  Also, if the library is
  modified by someone else and passed on, the recipients should know
  that what they have is not the original version, so that the original
  author's reputation will not be affected by problems that might be
  introduced by others.
  
    Finally, software patents pose a constant threat to the existence of
  any free program.  We wish to make sure that a company cannot
  effectively restrict the users of a free program by obtaining a
  restrictive license from a patent holder.  Therefore, we insist that
  any patent license obtained for a version of the library must be
  consistent with the full freedom of use specified in this license.
  
    Most GNU software, including some libraries, is covered by the
  ordinary GNU General Public License.  This license, the GNU Lesser
  General Public License, applies to certain designated libraries, and
  is quite different from the ordinary General Public License.  We use
  this license for certain libraries in order to permit linking those
  libraries into non-free programs.
  
    When a program is linked with a library, whether statically or using
  a shared library, the combination of the two is legally speaking a
  combined work, a derivative of the original library.  The ordinary
  General Public License therefore permits such linking only if the
  entire combination fits its criteria of freedom.  The Lesser General
  Public License permits more lax criteria for linking other code with
  the library.
  
    We call this license the "Lesser" General Public License because it
  does Less to protect the user's freedom than the ordinary General
  Public License.  It also provides other free software developers Less
  of an advantage over competing non-free programs.  These disadvantages
  are the reason we use the ordinary General Public License for many
  libraries.  However, the Lesser license provides advantages in certain
  special circumstances.
  
    For example, on rare occasions, there may be a special need to
  encourage the widest possible use of a certain library, so that it becomes
  a de-facto standard.  To achieve this, non-free programs must be
  allowed to use the library.  A more frequent case is that a free
  library does the same job as widely used non-free libraries.  In this
  case, there is little to gain by limiting the free library to free
  software only, so we use the Lesser General Public License.
  
    In other cases, permission to use a particular library in non-free
  programs enables a greater number of people to use a large body of
  free software.  For example, permission to use the GNU C Library in
  non-free programs enables many more people to use the whole GNU
  operating system, as well as its variant, the GNU/Linux operating
  system.
  
    Although the Lesser General Public License is Less protective of the
  users' freedom, it does ensure that the user of a program that is
  linked with the Library has the freedom and the wherewithal to run
  that program using a modified version of the Library.
  
    The precise terms and conditions for copying, distribution and
  modification follow.  Pay close attention to the difference between a
  "work based on the library" and a "work that uses the library".  The
  former contains code derived from the library, whereas the latter must
  be combined with the library in order to run.
  
  		  GNU LESSER GENERAL PUBLIC LICENSE
     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  
    0. This License Agreement applies to any software library or other
  program which contains a notice placed by the copyright holder or
  other authorized party saying it may be distributed under the terms of
  this Lesser General Public License (also called "this License").
  Each licensee is addressed as "you".
  
    A "library" means a collection of software functions and/or data
  prepared so as to be conveniently linked with application programs
  (which use some of those functions and data) to form executables.
  
    The "Library", below, refers to any such software library or work
  which has been distributed under these terms.  A "work based on the
  Library" means either the Library or any derivative work under
  copyright law: that is to say, a work containing the Library or a
  portion of it, either verbatim or with modifications and/or translated
  straightforwardly into another language.  (Hereinafter, translation is
  included without limitation in the term "modification".)
  
    "Source code" for a work means the preferred form of the work for
  making modifications to it.  For a library, complete source code means
  all the source code for all modules it contains, plus any associated
  interface definition files, plus the scripts used to control compilation
  and installation of the library.
  
    Activities other than copying, distribution and modification are not
  covered by this License; they are outside its scope.  The act of
  running a program using the Library is not restricted, and output from
  such a program is covered only if its contents constitute a work based
  on the Library (independent of the use of the Library in a tool for
  writing it).  Whether that is true depends on what the Library does
  and what the program that uses the Library does.
    
    1. You may copy and distribute verbatim copies of the Library's
  complete source code as you receive it, in any medium, provided that
  you conspicuously and appropriately publish on each copy an
  appropriate copyright notice and disclaimer of warranty; keep intact
  all the notices that refer to this License and to the absence of any
  warranty; and distribute a copy of this License along with the
  Library.
  
    You may charge a fee for the physical act of transferring a copy,
  and you may at your option offer warranty protection in exchange for a
  fee.
  
    2. You may modify your copy or copies of the Library or any portion
  of it, thus forming a work based on the Library, and copy and
  distribute such modifications or work under the terms of Section 1
  above, provided that you also meet all of these conditions:
  
      a) The modified work must itself be a software library.
  
      b) You must cause the files modified to carry prominent notices
      stating that you changed the files and the date of any change.
  
      c) You must cause the whole of the work to be licensed at no
      charge to all third parties under the terms of this License.
  
      d) If a facility in the modified Library refers to a function or a
      table of data to be supplied by an application program that uses
      the facility, other than as an argument passed when the facility
      is invoked, then you must make a good faith effort to ensure that,
      in the event an application does not supply such function or
      table, the facility still operates, and performs whatever part of
      its purpose remains meaningful.
  
      (For example, a function in a library to compute square roots has
      a purpose that is entirely well-defined independent of the
      application.  Therefore, Subsection 2d requires that any
      application-supplied function or table used by this function must
      be optional: if the application does not supply it, the square
      root function must still compute square roots.)
  
  These requirements apply to the modified work as a whole.  If
  identifiable sections of that work are not derived from the Library,
  and can be reasonably considered independent and separate works in
  themselves, then this License, and its terms, do not apply to those
  sections when you distribute them as separate works.  But when you
  distribute the same sections as part of a whole which is a work based
  on the Library, the distribution of the whole must be on the terms of
  this License, whose permissions for other licensees extend to the
  entire whole, and thus to each and every part regardless of who wrote
  it.
  
  Thus, it is not the intent of this section to claim rights or contest
  your rights to work written entirely by you; rather, the intent is to
  exercise the right to control the distribution of derivative or
  collective works based on the Library.
  
  In addition, mere aggregation of another work not based on the Library
  with the Library (or with a work based on the Library) on a volume of
  a storage or distribution medium does not bring the other work under
  the scope of this License.
  
    3. You may opt to apply the terms of the ordinary GNU General Public
  License instead of this License to a given copy of the Library.  To do
  this, you must alter all the notices that refer to this License, so
  that they refer to the ordinary GNU General Public License, version 2,
  instead of to this License.  (If a newer version than version 2 of the
  ordinary GNU General Public License has appeared, then you can specify
  that version instead if you wish.)  Do not make any other change in
  these notices.
  
    Once this change is made in a given copy, it is irreversible for
  that copy, so the ordinary GNU General Public License applies to all
  subsequent copies and derivative works made from that copy.
  
    This option is useful when you wish to copy part of the code of
  the Library into a program that is not a library.
  
    4. You may copy and distribute the Library (or a portion or
  derivative of it, under Section 2) in object code or executable form
  under the terms of Sections 1 and 2 above provided that you accompany
  it with the complete corresponding machine-readable source code, which
  must be distributed under the terms of Sections 1 and 2 above on a
  medium customarily used for software interchange.
  
    If distribution of object code is made by offering access to copy
  from a designated place, then offering equivalent access to copy the
  source code from the same place satisfies the requirement to
  distribute the source code, even though third parties are not
  compelled to copy the source along with the object code.
  
    5. A program that contains no derivative of any portion of the
  Library, but is designed to work with the Library by being compiled or
  linked with it, is called a "work that uses the Library".  Such a
  work, in isolation, is not a derivative work of the Library, and
  therefore falls outside the scope of this License.
  
    However, linking a "work that uses the Library" with the Library
  creates an executable that is a derivative of the Library (because it
  contains portions of the Library), rather than a "work that uses the
  library".  The executable is therefore covered by this License.
  Section 6 states terms for distribution of such executables.
  
    When a "work that uses the Library" uses material from a header file
  that is part of the Library, the object code for the work may be a
  derivative work of the Library even though the source code is not.
  Whether this is true is especially significant if the work can be
  linked without the Library, or if the work is itself a library.  The
  threshold for this to be true is not precisely defined by law.
  
    If such an object file uses only numerical parameters, data
  structure layouts and accessors, and small macros and small inline
  functions (ten lines or less in length), then the use of the object
  file is unrestricted, regardless of whether it is legally a derivative
  work.  (Executables containing this object code plus portions of the
  Library will still fall under Section 6.)
  
    Otherwise, if the work is a derivative of the Library, you may
  distribute the object code for the work under the terms of Section 6.
  Any executables containing that work also fall under Section 6,
  whether or not they are linked directly with the Library itself.
  
    6. As an exception to the Sections above, you may also combine or
  link a "work that uses the Library" with the Library to produce a
  work containing portions of the Library, and distribute that work
  under terms of your choice, provided that the terms permit
  modification of the work for the customer's own use and reverse
  engineering for debugging such modifications.
  
    You must give prominent notice with each copy of the work that the
  Library is used in it and that the Library and its use are covered by
  this License.  You must supply a copy of this License.  If the work
  during execution displays copyright notices, you must include the
  copyright notice for the Library among them, as well as a reference
  directing the user to the copy of this License.  Also, you must do one
  of these things:
  
      a) Accompany the work with the complete corresponding
      machine-readable source code for the Library including whatever
      changes were used in the work (which must be distributed under
      Sections 1 and 2 above); and, if the work is an executable linked
      with the Library, with the complete machine-readable "work that
      uses the Library", as object code and/or source code, so that the
      user can modify the Library and then relink to produce a modified
      executable containing the modified Library.  (It is understood
      that the user who changes the contents of definitions files in the
      Library will not necessarily be able to recompile the application
      to use the modified definitions.)
  
      b) Use a suitable shared library mechanism for linking with the
      Library.  A suitable mechanism is one that (1) uses at run time a
      copy of the library already present on the user's computer system,
      rather than copying library functions into the executable, and (2)
      will operate properly with a modified version of the library, if
      the user installs one, as long as the modified version is
      interface-compatible with the version that the work was made with.
  
      c) Accompany the work with a written offer, valid for at
      least three years, to give the same user the materials
      specified in Subsection 6a, above, for a charge no more
      than the cost of performing this distribution.
  
      d) If distribution of the work is made by offering access to copy
      from a designated place, offer equivalent access to copy the above
      specified materials from the same place.
  
      e) Verify that the user has already received a copy of these
      materials or that you have already sent this user a copy.
  
    For an executable, the required form of the "work that uses the
  Library" must include any data and utility programs needed for
  reproducing the executable from it.  However, as a special exception,
  the materials to be distributed need not include anything that is
  normally distributed (in either source or binary form) with the major
  components (compiler, kernel, and so on) of the operating system on
  which the executable runs, unless that component itself accompanies
  the executable.
  
    It may happen that this requirement contradicts the license
  restrictions of other proprietary libraries that do not normally
  accompany the operating system.  Such a contradiction means you cannot
  use both them and the Library together in an executable that you
  distribute.
  
    7. You may place library facilities that are a work based on the
  Library side-by-side in a single library together with other library
  facilities not covered by this License, and distribute such a combined
  library, provided that the separate distribution of the work based on
  the Library and of the other library facilities is otherwise
  permitted, and provided that you do these two things:
  
      a) Accompany the combined library with a copy of the same work
      based on the Library, uncombined with any other library
      facilities.  This must be distributed under the terms of the
      Sections above.
  
      b) Give prominent notice with the combined library of the fact
      that part of it is a work based on the Library, and explaining
      where to find the accompanying uncombined form of the same work.
  
    8. You may not copy, modify, sublicense, link with, or distribute
  the Library except as expressly provided under this License.  Any
  attempt otherwise to copy, modify, sublicense, link with, or
  distribute the Library is void, and will automatically terminate your
  rights under this License.  However, parties who have received copies,
  or rights, from you under this License will not have their licenses
  terminated so long as such parties remain in full compliance.
  
    9. You are not required to accept this License, since you have not
  signed it.  However, nothing else grants you permission to modify or
  distribute the Library or its derivative works.  These actions are
  prohibited by law if you do not accept this License.  Therefore, by
  modifying or distributing the Library (or any work based on the
  Library), you indicate your acceptance of this License to do so, and
  all its terms and conditions for copying, distributing or modifying
  the Library or works based on it.
  
    10. Each time you redistribute the Library (or any work based on the
  Library), the recipient automatically receives a license from the
  original licensor to copy, distribute, link with or modify the Library
  subject to these terms and conditions.  You may not impose any further
  restrictions on the recipients' exercise of the rights granted herein.
  You are not responsible for enforcing compliance by third parties with
  this License.
  
    11. If, as a consequence of a court judgment or allegation of patent
  infringement or for any other reason (not limited to patent issues),
  conditions are imposed on you (whether by court order, agreement or
  otherwise) that contradict the conditions of this License, they do not
  excuse you from the conditions of this License.  If you cannot
  distribute so as to satisfy simultaneously your obligations under this
  License and any other pertinent obligations, then as a consequence you
  may not distribute the Library at all.  For example, if a patent
  license would not permit royalty-free redistribution of the Library by
  all those who receive copies directly or indirectly through you, then
  the only way you could satisfy both it and this License would be to
  refrain entirely from distribution of the Library.
  
  If any portion of this section is held invalid or unenforceable under any
  particular circumstance, the balance of the section is intended to apply,
  and the section as a whole is intended to apply in other circumstances.
  
  It is not the purpose of this section to induce you to infringe any
  patents or other property right claims or to contest validity of any
  such claims; this section has the sole purpose of protecting the
  integrity of the free software distribution system which is
  implemented by public license practices.  Many people have made
  generous contributions to the wide range of software distributed
  through that system in reliance on consistent application of that
  system; it is up to the author/donor to decide if he or she is willing
  to distribute software through any other system and a licensee cannot
  impose that choice.
  
  This section is intended to make thoroughly clear what is believed to
  be a consequence of the rest of this License.
  
    12. If the distribution and/or use of the Library is restricted in
  certain countries either by patents or by copyrighted interfaces, the
  original copyright holder who places the Library under this License may add
  an explicit geographical distribution limitation excluding those countries,
  so that distribution is permitted only in or among countries not thus
  excluded.  In such case, this License incorporates the limitation as if
  written in the body of this License.
  
    13. The Free Software Foundation may publish revised and/or new
  versions of the Lesser General Public License from time to time.
  Such new versions will be similar in spirit to the present version,
  but may differ in detail to address new problems or concerns.
  
  Each version is given a distinguishing version number.  If the Library
  specifies a version number of this License which applies to it and
  "any later version", you have the option of following the terms and
  conditions either of that version or of any later version published by
  the Free Software Foundation.  If the Library does not specify a
  license version number, you may choose any version ever published by
  the Free Software Foundation.
  
    14. If you wish to incorporate parts of the Library into other free
  programs whose distribution conditions are incompatible with these,
  write to the author to ask for permission.  For software which is
  copyrighted by the Free Software Foundation, write to the Free
  Software Foundation; we sometimes make exceptions for this.  Our
  decision will be guided by the two goals of preserving the free status
  of all derivatives of our free software and of promoting the sharing
  and reuse of software generally.
  
  			    NO WARRANTY
  
    15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
  WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
  OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
  LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
  THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  
    16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
  WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
  AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
  FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
  CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
  LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
  RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
  FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
  SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  DAMAGES.
  
  		     END OF TERMS AND CONDITIONS
  
             How to Apply These Terms to Your New Libraries
  
    If you develop a new library, and you want it to be of the greatest
  possible use to the public, we recommend making it free software that
  everyone can redistribute and change.  You can do so by permitting
  redistribution under these terms (or, alternatively, under the terms of the
  ordinary General Public License).
  
    To apply these terms, attach the following notices to the library.  It is
  safest to attach them to the start of each source file to most effectively
  convey the exclusion of warranty; and each file should have at least the
  "copyright" line and a pointer to where the full notice is found.
  
      <one line to give the library's name and a brief idea of what it does.>
      Copyright (C) <year>  <name of author>
  
      This library is free software; you can redistribute it and/or
      modify it under the terms of the GNU Lesser General Public
      License as published by the Free Software Foundation; either
      version 2.1 of the License, or (at your option) any later version.
  
      This library is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Lesser General Public License for more details.
  
      You should have received a copy of the GNU Lesser General Public
      License along with this library; if not, write to the Free Software
      Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  
  Also add information on how to contact you by electronic and paper mail.
  
  You should also get your employer (if you work as a programmer) or your
  school, if any, to sign a "copyright disclaimer" for the library, if
  necessary.  Here is a sample; alter the names:
  
    Yoyodyne, Inc., hereby disclaims all copyright interest in the
    library `Frob' (a library for tweaking knobs) written by James Random Hacker.
  
    <signature of Ty Coon>, 1 April 1990
    Ty Coon, President of Vice
  
  That's all there is to it!
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/scalebar/scalebar-fancy.css
  
  Index: scalebar-fancy.css
  ===================================================================
  .sbWrapper {
  	position: absolute;
  	margin: 25px 50% 0 50%;
  	font-family: "Lucida Grande", Georgia, "Times New Roman", Times, serif;
  }
  
  .sbBar {
  	top: -5px;
  	border: 1px solid #8C8675;
  	background: url('fancy-bar.gif');
  	height: 8px;
  }
  
  .sbBarAlt {
  	top: -5px;
  	border: 1px solid #8C8675;
  	background: url('fancy-bar-alt.gif');
  	height: 8px;
  }
  
  .sbMarkerMajor {
  	width: 0px;
  }
  
  .sbMarkerMinor {
  	width: 0px;
  }
  
  .sbNumbersBox {
  	top: 6px;
  	font-size: 0.8em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: -23px;
  	font-size: 0.9em;
  	color: #333333;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.8em;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/scalebar/scalebar-fat.css
  
  Index: scalebar-fat.css
  ===================================================================
  .sbWrapper {
  	position: absolute;
  	margin: 25px 50% 0 50%;
  	font-family: Verdana, sans-serif;
  }
  
  .sbBar {
  	top: -4px;
  	border: 1px solid #999999;
  	background-color: #cccccc;
  	height: 7px;
  }
  
  .sbBarAlt {
  	top: -4px;
  	border: 1px solid #999999;
  	background-color: #ffffff;
  	height: 7px;
  }
  
  .sbMarkerMajor {
  	width: 0px;
  }
  
  .sbMarkerMinor {
  	width: 0px;
  }
  
  .sbNumbersBox {
  	top: -19px;
  	font-size: 0.65em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: 6px;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.7em;
  	font-size: 0.7em;
  	color: #333333;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/scalebar/scalebar-thin.css
  
  Index: scalebar-thin.css
  ===================================================================
  .sbWrapper {
  	position: absolute;
  	margin: 25px 50% 0 50%;
  	font-family: Tahoma, Arial, Verdana, sans-serif;
  }
  
  .sbBar {
  	background-color: #666666;
  	height: 1px;
  }
  
  .sbBarAlt {
  	background-color: #666666;
  	height: 1px;
  }
  
  .sbMarkerMajor {
  	height: 7px;
  	width: 1px;
  	background-color: #666666;
  }
  
  .sbMarkerMinor {
  	height: 5px;
  	width: 1px;
  	background-color: #666666;
  }
  
  .sbNumbersBox {
  	top: 7px;
  	font-size: 0.7em;
  	color: #333333;
  }
  
  .sbLabelBox {
  	top: -16px;
  	font-size: 0.8em;
  	color: #333333;
  	font-variant: small-caps;
  }
  
  .sbLabelBoxSingleLine {
  	top: -0.8em;
  	font-size: 0.8em;
  	color: #333333;
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/scalebar/scalebar.js
  
  Index: scalebar.js
  ===================================================================
  /*
  JavaScript Scalebar for MapServer (scalebar.js)
  
  Copyright (c) 2005 Tim Schaub of CommEn Space (http://www.commenspace.org)
  
  This is free software; you can redistribute it and/or modify it under
  the terms of the GNU Lesser General Public License as published by the
  Free Software Foundation; either version 2.1 of the License, or (at
  your option) any later version.
  
  This software is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  License for more details.
  
  You should have received a copy of the GNU Lesser General Public License
  along with this software; if not, write to the Free Software Foundation,
  Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  
  v1.3 - scalebar is now centered on .sbWrapper div by default, more css control
       - reduced likelihood of displaying very large numbers
       - added condition to deal with @import styles (thanks dokai)
  
  */
  
  function ScaleBar(scaleDenominator) {
  	// default properties
  	// may be modified after construction
  	// if modified after ScaleBar.place(), use ScaleBar.update()
  	this.scaleDenominator = (scaleDenominator == null) ? 1 : scaleDenominator;
  	this.displaySystem = 'metric'; // metric or english supported
  	this.minWidth = 100; // pixels
  	this.maxWidth = 200; // pixels
  	this.divisions = 2;
  	this.subdivisions = 2;
  	this.showMinorMeasures = false;
  	this.abbreviateLabel = false;
  	this.singleLine = false;
  	this.resolution = 72; // dpi
  	this.align = 'center'; // left, center, or right supported
  	// create scalebar elements
  	this.container = document.createElement('div');
  	this.container.className = 'sbWrapper';
  	this.labelContainer = document.createElement('div');
  	this.labelContainer.className = 'sbUnitsContainer';
  	this.labelContainer.style.position = 'absolute';
  	this.graphicsContainer = document.createElement('div');
  	this.graphicsContainer.style.position = 'absolute';
  	this.graphicsContainer.className = 'sbGraphicsContainer';
  	this.numbersContainer = document.createElement('div');
  	this.numbersContainer.style.position = 'absolute';
  	this.numbersContainer.className = 'sbNumbersContainer';
  	// private functions
  	// put in some markers and bar pieces so style attributes can be grabbed
  	// this is a solution for Safari support
  	var markerMajor = document.createElement('div');
  	markerMajor.className = 'sbMarkerMajor';
  	this.graphicsContainer.appendChild(markerMajor);
  	var markerMinor = document.createElement('div');
  	markerMinor.className = 'sbMarkerMinor';
  	this.graphicsContainer.appendChild(markerMinor);
  	var barPiece = document.createElement('div');
  	barPiece.className = 'sbBar';
  	this.graphicsContainer.appendChild(barPiece);
  	var barPieceAlt = document.createElement('div');
  	barPieceAlt.className = 'sbBarAlt';
  	this.graphicsContainer.appendChild(barPieceAlt);
  }
  ScaleBar.prototype.update = function(scaleDenominator) {
  	if(scaleDenominator != null) {
  		this.scaleDenominator = scaleDenominator;
  	}
  	// local functions (and object constructors)
  	function HandsomeNumber(smallUglyNumber, bigUglyNumber, sigFigs) {
  		var sigFigs = (sigFigs == null) ? 10 : sigFigs;
  		var bestScore = Number.POSITIVE_INFINITY;
  		var bestTieBreaker = Number.POSITIVE_INFINITY;
  		// if all else fails, return a small ugly number
  		var handsomeValue = smallUglyNumber;
  		var handsomeNumDec = 3;
  		// try the first three comely multiplicands (in order of comliness)
  		for(var halvingExp = 0; halvingExp < 3; ++halvingExp) {
  			var comelyMultiplicand = Math.pow(2, (-1 * halvingExp));
  			var maxTensExp = Math.floor(Math.log(bigUglyNumber / comelyMultiplicand) / Math.LN10)
  			for(var tensExp = maxTensExp; tensExp > (maxTensExp - sigFigs + 1); --tensExp) {
  				var numDec = Math.max(halvingExp - tensExp, 0);
  				var testMultiplicand = comelyMultiplicand * Math.pow(10, tensExp);
  				// check if there is an integer multiple of testMultiplicand between smallUglyNumber and bigUglyNumber
  				if((testMultiplicand * Math.floor(bigUglyNumber / testMultiplicand)) >= smallUglyNumber) {
  					// check if smallUglyNumber is an integer multiple of testMultiplicand
  					if(smallUglyNumber % testMultiplicand == 0) {
  						var testMultiplier = smallUglyNumber / testMultiplicand;
  					}
  					// otherwise go for the smallest integer multiple between small and big
  					else {
  						var testMultiplier = Math.floor(smallUglyNumber / testMultiplicand) + 1;
  					}
  					// test against the best (lower == better)
  					var testScore = testMultiplier + (2 * halvingExp);
  					var testTieBreaker = (tensExp < 0) ? (Math.abs(tensExp) + 1) : tensExp;
  					if((testScore < bestScore) || ((testScore == bestScore) && (testTieBreaker < bestTieBreaker))) {
  						bestScore = testScore;
  						bestTieBreaker = testTieBreaker;
  						handsomeValue = (testMultiplicand * testMultiplier).toFixed(numDec);
  						handsomeNumDec = numDec;
  					}
  				}
  			}
  		}
  		this.value = handsomeValue;
  		this.score = bestScore;
  		this.tieBreaker = bestTieBreaker;
  		this.numDec = handsomeNumDec;
  	}
  	HandsomeNumber.prototype.toString = function() {
  		return this.value.toString();
  	}
  	HandsomeNumber.prototype.valueOf = function() {
  		return this.value;
  	}
  	function styleValue(aSelector, styleKey) {
  		// returns an integer value associated with a particular selector and key
  		// given a stylesheet with .someSelector {border: 2px solid red}
  		// styleValue('.someSelector', 'borderWidth') returns 2
  		var aValue = 0;
  		if(document.styleSheets) {
  			for(var sheetIndex = document.styleSheets.length - 1; sheetIndex >= 0; --sheetIndex) {
  				var aSheet = document.styleSheets[sheetIndex];
  				if(!aSheet.disabled) {
  					var allRules;
  					if(typeof(aSheet.cssRules) == 'undefined') {
  						if(typeof(aSheet.rules) == 'undefined') {
  							// can't get rules, assume zero
  							return 0;
  						}
  						else {
  							allRules = aSheet.rules;
  						}
  					}
  					else {
  						allRules = aSheet.cssRules;
  					}
  					for(var ruleIndex = 0; ruleIndex < allRules.length; ++ruleIndex) {
  						var aRule = allRules[ruleIndex];
  						if(aRule.selectorText && (aRule.selectorText.toLowerCase() == aSelector.toLowerCase())) {
  							if(aRule.style[styleKey] != '') {
  								aValue = parseInt(aRule.style[styleKey]);
  							}
  						}
  					}
  				}
  			}
  		}
  		// if the styleKey was not found, the equivalent value is zero
  		return aValue ? aValue : 0;
  	}
  	function formatNumber(aNumber, numDecimals) {
  		numDecimals = (numDecimals) ? numDecimals : 0;
  		var formattedInteger = '' + Math.round(aNumber);
  		var thousandsPattern = /(-?[0-9]+)([0-9]{3})/;
  		while(thousandsPattern.test(formattedInteger)) {
  			formattedInteger = formattedInteger.replace(thousandsPattern, '$1,$2');
  		}
  		if(numDecimals > 0) {
  			var formattedDecimal = Math.floor(Math.pow(10, numDecimals) * (aNumber - Math.round(aNumber)));
  			if(formattedDecimal == 0) {
  				return formattedInteger;
  			}
  			else {
  				return formattedInteger + '.' + formattedDecimal;
  			}
  		}
  		else {
  			return formattedInteger;
  		}
  	}
  	// update the container title (for displaying scale as a tooltip)
  	this.container.title = 'scale 1:' + formatNumber(this.scaleDenominator);
  	// measurementProperties holds display units, abbreviations,
  	// and conversion to inches (since we're using dpi) - per measurement sytem
  	var measurementProperties = new Object();
  	measurementProperties.english = {
  		units: ['miles', 'feet', 'inches'],
  		abbr: ['mi', 'ft', 'in'],
  		inches: [63360, 12, 1]
  	}
  	measurementProperties.metric = {
  		units: ['kilometers', 'meters', 'centimeters'],
  		abbr: ['km', 'm', 'cm'],
  		inches: [39370.07874, 39.370079, 0.393701]
  	}
  	// check each measurement unit in the display system
  	var comparisonArray = new Array();
  	for(var unitIndex = 0; unitIndex < measurementProperties[this.displaySystem].units.length; ++unitIndex) {
  		comparisonArray[unitIndex] = new Object();
  		var pixelsPerDisplayUnit = this.resolution * measurementProperties[this.displaySystem].inches[unitIndex] / this.scaleDenominator;
  		var minSDDisplayLength = (this.minWidth / pixelsPerDisplayUnit) / (this.divisions * this.subdivisions);
  		var maxSDDisplayLength = (this.maxWidth / pixelsPerDisplayUnit) / (this.divisions * this.subdivisions);
  		// add up scores for each marker (even if numbers aren't displayed)
  		for(var valueIndex = 0; valueIndex < (this.divisions * this.subdivisions); ++valueIndex) {
  			var minNumber = minSDDisplayLength * (valueIndex + 1);
  			var maxNumber = maxSDDisplayLength * (valueIndex + 1);
  			var niceNumber = new HandsomeNumber(minNumber, maxNumber);
  			comparisonArray[unitIndex][valueIndex] = {value: (niceNumber.value / (valueIndex + 1)), score: 0, tieBreaker: 0, numDec: 0, displayed: 0};
  			// now tally up scores for all values given this subdivision length
  			for(var valueIndex2 = 0; valueIndex2 < (this.divisions * this.subdivisions); ++valueIndex2) {
  				displayedValuePosition = niceNumber.value * (valueIndex2 + 1) / (valueIndex + 1);
  				niceNumber2 = new HandsomeNumber(displayedValuePosition, displayedValuePosition);
  				var isMajorMeasurement = ((valueIndex2 + 1) % this.subdivisions == 0);
  				var isLastMeasurement = ((valueIndex2 + 1) == (this.divisions * this.subdivisions));
  				if((this.singleLine && isLastMeasurement) || (!this.singleLine && (isMajorMeasurement || this.showMinorMeasures))) {
  					// count scores for displayed marker measurements
  					comparisonArray[unitIndex][valueIndex].score += niceNumber2.score;
  					comparisonArray[unitIndex][valueIndex].tieBreaker += niceNumber2.tieBreaker;
  					comparisonArray[unitIndex][valueIndex].numDec = Math.max(comparisonArray[unitIndex][valueIndex].numDec, niceNumber2.numDec);
  					comparisonArray[unitIndex][valueIndex].displayed += 1;
  				}
  				else {
  					// count scores for non-displayed marker measurements
  					comparisonArray[unitIndex][valueIndex].score += niceNumber2.score / this.subdivisions;
  					comparisonArray[unitIndex][valueIndex].tieBreaker += niceNumber2.tieBreaker / this.subdivisions;
  				}
  			}
  			// adjust scores so numbers closer to 1 are preferred for display
  			var scoreAdjustment = (unitIndex + 1) * comparisonArray[unitIndex][valueIndex].tieBreaker / comparisonArray[unitIndex][valueIndex].displayed;
  			comparisonArray[unitIndex][valueIndex].score *= scoreAdjustment;
  		}
  	}
  	// get the value (subdivision length) with the lowest cumulative score
  	var subdivisionDisplayLength = null;
  	var displayUnits = null;
  	var displayUnitsAbbr = null;
  	var subdivisionPixelLength = null;
  	var bestScore = Number.POSITIVE_INFINITY;
  	var bestTieBreaker = Number.POSITIVE_INFINITY;
  	var numDec = 0;
  	for(var unitIndex = 0; unitIndex < comparisonArray.length; ++unitIndex) {
  		for(valueIndex in comparisonArray[unitIndex]) {
  			if((comparisonArray[unitIndex][valueIndex].score < bestScore) || ((comparisonArray[unitIndex][valueIndex].score == bestScore) && (comparisonArray[unitIndex][valueIndex].tieBreaker < bestTieBreaker))) {
  				bestScore = comparisonArray[unitIndex][valueIndex].score;
  				bestTieBreaker = comparisonArray[unitIndex][valueIndex].tieBreaker;
  				subdivisionDisplayLength = comparisonArray[unitIndex][valueIndex].value;
  				numDec = comparisonArray[unitIndex][valueIndex].numDec;
  				displayUnits = measurementProperties[this.displaySystem].units[unitIndex];
  				displayUnitsAbbr = measurementProperties[this.displaySystem].abbr[unitIndex];
  				pixelsPerDisplayUnit = this.resolution * measurementProperties[this.displaySystem].inches[unitIndex] / this.scaleDenominator;
  				subdivisionPixelLength = pixelsPerDisplayUnit * subdivisionDisplayLength; // round before use in style
  			}
  		}
  	}
  	// determine offsets for graphic elements
  	var xOffsetMarkerMajor = (styleValue('.sbMarkerMajor', 'borderLeftWidth') + styleValue('.sbMarkerMajor', 'width') + styleValue('.sbMarkerMajor', 'borderRightWidth')) / 2;
  	var xOffsetMarkerMinor = (styleValue('.sbMarkerMinor', 'borderLeftWidth') + styleValue('.sbMarkerMinor', 'width') + styleValue('.sbMarkerMinor', 'borderRightWidth')) / 2;
  	var xOffsetBar = (styleValue('.sbBar', 'borderLeftWidth') + styleValue('.sbBar', 'border-right-width')) / 2;
  	var xOffsetBarAlt = (styleValue('.sbBarAlt', 'borderLeftWidth') + styleValue('.sbBarAlt', 'borderRightWidth')) / 2;
  	// support for browsers without the Document.styleSheets property (Opera)
  	if(!document.styleSheets) {
  		// this is a two part hack, one for the offsets here and one for the css below
  		xOffsetMarkerMajor = 0.5;
  		xOffsetMarkerMinor = 0.5;
  	}
  	// clean out any old content from containers
  	while(this.labelContainer.hasChildNodes()) {
  		this.labelContainer.removeChild(this.labelContainer.firstChild);
  	}
  	while(this.graphicsContainer.hasChildNodes()) {
  		this.graphicsContainer.removeChild(this.graphicsContainer.firstChild);
  	}
  	while(this.numbersContainer.hasChildNodes()) {
  		this.numbersContainer.removeChild(this.numbersContainer.firstChild);
  	}
  	// create all divisions
  	var aMarker, aBarPiece, numbersBox, xOffset;
  	var alignmentOffset = {
  		left: 0,
  		center: (-1 * this.divisions * this.subdivisions * subdivisionPixelLength / 2),
  		right: (-1 * this.divisions * this.subdivisions * subdivisionPixelLength)
  	}
  	var xPosition = 0 + alignmentOffset[this.align];
  	var markerMeasure = 0;
  	for(var divisionIndex = 0; divisionIndex < this.divisions; ++divisionIndex) {
  		// set xPosition and markerMeasure to start of division
  		xPosition = divisionIndex * this.subdivisions * subdivisionPixelLength;
  		xPosition += alignmentOffset[this.align];
  		markerMeasure = (divisionIndex == 0) ? 0 : ((divisionIndex * this.subdivisions) * subdivisionDisplayLength).toFixed(numDec);
  		// add major marker
  		aMarker = document.createElement('div');
  		aMarker.className = 'sbMarkerMajor';
  		aMarker.style.position = 'absolute';
  		aMarker.style.overflow = 'hidden';
  		aMarker.style.left = Math.round(xPosition - xOffsetMarkerMajor) + 'px';
  		aMarker.appendChild(document.createTextNode(' '));
  		this.graphicsContainer.appendChild(aMarker);
  		// add initial measure
  		if(!this.singleLine) {
  			numbersBox = document.createElement('div');
  			numbersBox.className = 'sbNumbersBox';
  			numbersBox.style.position = 'absolute';
  			numbersBox.style.overflow = 'hidden';
  			numbersBox.style.textAlign = 'center';
  			if(this.showMinorMeasures) {
  				numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + 'px';
  				numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + 'px';
  			}
  			else {
  				numbersBox.style.width = Math.round(this.subdivisions * subdivisionPixelLength * 2) + 'px';
  				numbersBox.style.left = Math.round(xPosition - (this.subdivisions * subdivisionPixelLength)) + 'px';
  			}
  			numbersBox.appendChild(document.createTextNode(markerMeasure));
  			this.numbersContainer.appendChild(numbersBox);
  		}
  		// create all subdivisions
  		for(var subdivisionIndex = 0; subdivisionIndex < this.subdivisions; ++subdivisionIndex) {
  			aBarPiece = document.createElement('div');
  			aBarPiece.style.position = 'absolute';
  			aBarPiece.style.overflow = 'hidden';
  			aBarPiece.style.width = Math.round(subdivisionPixelLength) + 'px';
  			if((subdivisionIndex % 2) == 0) {
  				aBarPiece.className = 'sbBar';
  				aBarPiece.style.left = Math.round(xPosition - xOffsetBar) + 'px';
  			}
  			else {
  				aBarPiece.className = 'sbBarAlt';
  				aBarPiece.style.left = Math.round(xPosition - xOffsetBarAlt) + 'px';
  			}
  			aBarPiece.appendChild(document.createTextNode(' '));
  			this.graphicsContainer.appendChild(aBarPiece);
  			// add minor marker if not the last subdivision
  			if(subdivisionIndex < (this.subdivisions - 1)) {
  				// set xPosition and markerMeasure to end of subdivision
  				xPosition = ((divisionIndex * this.subdivisions) + (subdivisionIndex + 1)) * subdivisionPixelLength;
  				xPosition += alignmentOffset[this.align];
  				markerMeasure = (divisionIndex * this.subdivisions + subdivisionIndex + 1) * subdivisionDisplayLength;
  				aMarker = document.createElement('div');
  				aMarker.className = 'sbMarkerMinor';
  				aMarker.style.position = 'absolute';
  				aMarker.style.overflow = 'hidden';
  				aMarker.style.left = Math.round(xPosition - xOffsetMarkerMinor) + 'px';
  				aMarker.appendChild(document.createTextNode(' '));
  				this.graphicsContainer.appendChild(aMarker);
  				if(this.showMinorMeasures && !this.singleLine) {
  					// add corresponding measure
  					numbersBox = document.createElement('div');
  					numbersBox.className = 'sbNumbersBox';
  					numbersBox.style.position = 'absolute';
  					numbersBox.style.overflow = 'hidden';
  					numbersBox.style.textAlign = 'center';
  					numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + 'px';
  					numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + 'px';
  					numbersBox.appendChild(document.createTextNode(markerMeasure));
  					this.numbersContainer.appendChild(numbersBox);
  				}
  			}
  		}
  	}
  	// set xPosition and markerMeasure to end of divisions
  	xPosition = (this.divisions * this.subdivisions) * subdivisionPixelLength;
  	xPosition += alignmentOffset[this.align];
  	markerMeasure = ((this.divisions * this.subdivisions) * subdivisionDisplayLength).toFixed(numDec);
  	// add the final major marker
  	aMarker = document.createElement('div');
  	aMarker.className = 'sbMarkerMajor';
  	aMarker.style.position = 'absolute';
  	aMarker.style.overflow = 'hidden';
  	aMarker.style.left = Math.round(xPosition - xOffsetMarkerMajor) + 'px';
  	aMarker.appendChild(document.createTextNode(' '));
  	this.graphicsContainer.appendChild(aMarker);
  	// add final measure
  	if(!this.singleLine) {
  		numbersBox = document.createElement('div');
  		numbersBox.className = 'sbNumbersBox';
  		numbersBox.style.position = 'absolute';
  		numbersBox.style.overflow = 'hidden';
  		numbersBox.style.textAlign = 'center';
  		if(this.showMinorMeasures) {
  			numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + 'px';
  			numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + 'px';
  		}
  		else {
  			numbersBox.style.width = Math.round(this.subdivisions * subdivisionPixelLength * 2) + 'px';
  			numbersBox.style.left = Math.round(xPosition - (this.subdivisions * subdivisionPixelLength)) + 'px';
  		}
  		numbersBox.appendChild(document.createTextNode(markerMeasure));
  		this.numbersContainer.appendChild(numbersBox);
  	}
  	// add content to the label container
  	var labelBox = document.createElement('div');
  	labelBox.style.position = 'absolute';
  	var labelText;
  	if(this.singleLine) {
  		labelText = markerMeasure;
  		labelBox.className = 'sbLabelBoxSingleLine';
  		labelBox.style.top = '-0.6em';
  		labelBox.style.left = (xPosition + 10) + 'px';
  	}
  	else {
  		labelText = '';
  		labelBox.className = 'sbLabelBox';
  		labelBox.style.textAlign = 'center';
  		labelBox.style.width = Math.round(this.divisions * this.subdivisions * subdivisionPixelLength) + 'px'
  		labelBox.style.left = Math.round(alignmentOffset[this.align]) + 'px';
  		labelBox.style.overflow = 'hidden';
  	}
  	if(this.abbreviateLabel) {
  		labelText += ' ' + displayUnitsAbbr;
  	}
  	else {
  		labelText += ' ' + displayUnits;
  	}
  	labelBox.appendChild(document.createTextNode(labelText));
  	this.labelContainer.appendChild(labelBox);
  	// support for browsers without the Document.styleSheets property (Opera)
  	if(!document.styleSheets) {
  		// override custom css with default
  		var defaultStyle = document.createElement('style');
  		defaultStyle.type = 'text/css';
  		var styleText = '.sbBar {top: 0px; background: #666666; height: 1px; border: 0;}';
  		styleText += '.sbBarAlt {top: 0px; background: #666666; height: 1px; border: 0;}';
  		styleText += '.sbMarkerMajor {height: 7px; width: 1px; background: #666666; border: 0;}';
  		styleText += '.sbMarkerMinor {height: 5px; width: 1px; background: #666666; border: 0;}';
  		styleText += '.sbLabelBox {top: -16px;}';
  		styleText += '.sbNumbersBox {top: 7px;}';
  		defaultStyle.appendChild(document.createTextNode(styleText));
  		document.getElementsByTagName('head').item(0).appendChild(defaultStyle);
  	}
  	// append the child containers to the parent container
  	this.container.appendChild(this.graphicsContainer);
  	this.container.appendChild(this.labelContainer);
  	this.container.appendChild(this.numbersContainer);
  }
  ScaleBar.prototype.place = function(elementId) {
  	if(elementId == null) {
  		document.body.appendChild(this.container);
  	}
  	else {
  		var anElement = document.getElementById(elementId);
  		if(anElement != null) {
  			anElement.appendChild(this.container);
  		}
  	}
  	this.update();
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/util/wz_jsgraphics/wz_jsgraphics.js
  
  Index: wz_jsgraphics.js
  ===================================================================
  /* This notice must be untouched at all times.
  
  
  
  wz_jsgraphics.js    v. 2.3
  
  The latest version is available at
  
  http://www.walterzorn.com
  
  or http://www.devira.com
  
  or http://www.walterzorn.de
  
  
  
  Copyright (c) 2002-2004 Walter Zorn. All rights reserved.
  
  Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )
  
  Last modified: 15. 3. 2004
  
  
  
  Performance optimizations for Internet Explorer
  
  by Thomas Frank and John Holdsworth.
  
  fillPolygon method implemented by Matthieu Haller.
  
  
  
  High Performance JavaScript Graphics Library.
  
  Provides methods
  
  - to draw lines, rectangles, ellipses, polygons
  
    with specifiable line thickness,
  
  - to fill rectangles and ellipses
  
  - to draw text.
  
  NOTE: Operations, functions and branching have rather been optimized
  
  to efficiency and speed than to shortness of source code.
  
  
  
  This program is free software;
  
  you can redistribute it and/or modify it under the terms of the
  
  GNU General Public License as published by the Free Software Foundation;
  
  either version 2 of the License, or (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  
  but WITHOUT ANY WARRANTY;
  
  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  
  See the GNU General Public License
  
  at http://www.gnu.org/copyleft/lesser.html for more details.
  
  */
  
  
  
  
  
  var jg_ihtm, jg_ie, jg_fast, jg_dom, jg_moz,
  
  jg_n4 = (document.layers && typeof document.classes != "undefined");
  
  
  
  
  
  function chkDHTM(x, i)
  
  {
  
  	x = document.body || null;
  
  	jg_ie = x && typeof x.insertAdjacentHTML != "undefined";
  
  	jg_dom = (x && !jg_ie &&
  
  		typeof x.appendChild != "undefined" &&
  
  		typeof document.createRange != "undefined" &&
  
  		typeof (i = document.createRange()).setStartBefore != "undefined" &&
  
  		typeof i.createContextualFragment != "undefined");
  
  	jg_ihtm = !jg_ie && !jg_dom && x && typeof x.innerHTML != "undefined";
  
  	jg_fast = jg_ie && document.all && !window.opera;
  
  	jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";
  
  }
  
  
  
  
  
  function pntDoc()
  
  {
  
  	this.wnd.document.write(jg_fast? this.htmRpc() : this.htm);
  
  	this.htm = '';
  
  }
  
  
  
  
  
  function pntCnvDom()
  
  {
  
  	var x = document.createRange();
  
  	x.setStartBefore(this.cnv);
  
  	x = x.createContextualFragment(jg_fast? this.htmRpc() : this.htm);
  
  	this.cnv.appendChild(x);
  
  	this.htm = '';
  
  }
  
  
  
  
  
  function pntCnvIe()
  
  {
  
  	this.cnv.insertAdjacentHTML("beforeEnd", jg_fast? this.htmRpc() : this.htm);
  
  	this.htm = '';
  
  }
  
  
  
  
  
  function pntCnvIhtm()
  
  {
  
  	this.cnv.innerHTML += this.htm;
  
  	this.htm = '';
  
  }
  
  
  
  
  
  function pntCnv()
  
  {
  
  	this.htm = '';
  
  }
  
  
  
  
  
  function mkDiv(x, y, w, h)
  
  {
  
  	this.htm += '<div style="position:absolute;'+
  
  		'left:' + x + 'px;'+
  
  		'top:' + y + 'px;'+
  
  		'width:' + w + 'px;'+
  
  		'height:' + h + 'px;'+
  
  		'clip:rect(0,'+w+'px,'+h+'px,0);'+
  
  		'background-color:' + this.color +
  
  		(!jg_moz? ';overflow:hidden' : '')+
  
  		';"><\/div>';
  
  }
  
  
  
  
  
  function mkDivIe(x, y, w, h)
  
  {
  
  	this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';
  
  }
  
  
  
  
  
  function mkDivPrt(x, y, w, h)
  
  {
  
  	this.htm += '<div style="position:absolute;'+
  
  		'border-left:' + w + 'px solid ' + this.color + ';'+
  
  		'left:' + x + 'px;'+
  
  		'top:' + y + 'px;'+
  
  		'width:0px;'+
  
  		'height:' + h + 'px;'+
  
  		'clip:rect(0,'+w+'px,'+h+'px,0);'+
  
  		'background-color:' + this.color +
  
  		(!jg_moz? ';overflow:hidden' : '')+
  
  		';"><\/div>';
  
  }
  
  
  
  
  
  function mkLyr(x, y, w, h)
  
  {
  
  	this.htm += '<layer '+
  
  		'left="' + x + '" '+
  
  		'top="' + y + '" '+
  
  		'width="' + w + '" '+
  
  		'height="' + h + '" '+
  
  		'bgcolor="' + this.color + '"><\/layer>\n';
  
  }
  
  
  
  
  
  var regex =  /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;
  
  function htmRpc()
  
  {
  
  	return this.htm.replace(
  
  		regex,
  
  		'<div style="overflow:hidden;position:absolute;background-color:'+
  
  		'$1;left:$2;top:$3;width:$4;height:$5"></div>\n');
  
  }
  
  
  
  
  
  function htmPrtRpc()
  
  {
  
  	return this.htm.replace(
  
  		regex,
  
  		'<div style="overflow:hidden;position:absolute;background-color:'+
  
  		'$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n');
  
  }
  
  
  
  
  
  function mkLin(x1, y1, x2, y2)
  
  {
  
  	if (x1 > x2)
  
  	{
  
  		var _x2 = x2;
  
  		var _y2 = y2;
  
  		x2 = x1;
  
  		y2 = y1;
  
  		x1 = _x2;
  
  		y1 = _y2;
  
  	}
  
  	var dx = x2-x1, dy = Math.abs(y2-y1),
  
  	x = x1, y = y1,
  
  	yIncr = (y1 > y2)? -1 : 1;
  
  
  
  	if (dx >= dy)
  
  	{
  
  		var pr = dy<<1,
  
  		pru = pr - (dx<<1),
  
  		p = pr-dx,
  
  		ox = x;
  
  		while ((dx--) > 0)
  
  		{
  
  			++x;
  
  			if (p > 0)
  
  			{
  
  				this.mkDiv(ox, y, x-ox, 1);
  
  				y += yIncr;
  
  				p += pru;
  
  				ox = x;
  
  			}
  
  			else p += pr;
  
  		}
  
  		this.mkDiv(ox, y, x2-ox+1, 1);
  
  	}
  
  
  
  	else
  
  	{
  
  		var pr = dx<<1,
  
  		pru = pr - (dy<<1),
  
  		p = pr-dy,
  
  		oy = y;
  
  		if (y2 <= y1)
  
  		{
  
  			while ((dy--) > 0)
  
  			{
  
  				if (p > 0)
  
  				{
  
  					this.mkDiv(x++, y, 1, oy-y+1);
  
  					y += yIncr;
  
  					p += pru;
  
  					oy = y;
  
  				}
  
  				else
  
  				{
  
  					y += yIncr;
  
  					p += pr;
  
  				}
  
  			}
  
  			this.mkDiv(x2, y2, 1, oy-y2+1);
  
  		}
  
  		else
  
  		{
  
  			while ((dy--) > 0)
  
  			{
  
  				y += yIncr;
  
  				if (p > 0)
  
  				{
  
  					this.mkDiv(x++, oy, 1, y-oy);
  
  					p += pru;
  
  					oy = y;
  
  				}
  
  				else p += pr;
  
  			}
  
  			this.mkDiv(x2, oy, 1, y2-oy+1);
  
  		}
  
  	}
  
  }
  
  
  
  
  
  function mkLin2D(x1, y1, x2, y2)
  
  {
  
  	if (x1 > x2)
  
  	{
  
  		var _x2 = x2;
  
  		var _y2 = y2;
  
  		x2 = x1;
  
  		y2 = y1;
  
  		x1 = _x2;
  
  		y1 = _y2;
  
  	}
  
  	var dx = x2-x1, dy = Math.abs(y2-y1),
  
  	x = x1, y = y1,
  
  	yIncr = (y1 > y2)? -1 : 1;
  
  
  
  	var s = this.stroke;
  
  	if (dx >= dy)
  
  	{
  
  		if (s-3 > 0)
  
  		{
  
  			var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;
  
  			_s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;
  
  		}
  
  		else var _s = s;
  
  		var ad = Math.ceil(s/2);
  
  
  
  		var pr = dy<<1,
  
  		pru = pr - (dx<<1),
  
  		p = pr-dx,
  
  		ox = x;
  
  		while ((dx--) > 0)
  
  		{
  
  			++x;
  
  			if (p > 0)
  
  			{
  
  				this.mkDiv(ox, y, x-ox+ad, _s);
  
  				y += yIncr;
  
  				p += pru;
  
  				ox = x;
  
  			}
  
  			else p += pr;
  
  		}
  
  		this.mkDiv(ox, y, x2-ox+ad+1, _s);
  
  	}
  
  
  
  	else
  
  	{
  
  		if (s-3 > 0)
  
  		{
  
  			var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;
  
  			_s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;
  
  		}
  
  		else var _s = s;
  
  		var ad = Math.round(s/2);
  
  
  
  		var pr = dx<<1,
  
  		pru = pr - (dy<<1),
  
  		p = pr-dy,
  
  		oy = y;
  
  		if (y2 <= y1)
  
  		{
  
  			++ad;
  
  			while ((dy--) > 0)
  
  			{
  
  				if (p > 0)
  
  				{
  
  					this.mkDiv(x++, y, _s, oy-y+ad);
  
  					y += yIncr;
  
  					p += pru;
  
  					oy = y;
  
  				}
  
  				else
  
  				{
  
  					y += yIncr;
  
  					p += pr;
  
  				}
  
  			}
  
  			this.mkDiv(x2, y2, _s, oy-y2+ad);
  
  		}
  
  		else
  
  		{
  
  			while ((dy--) > 0)
  
  			{
  
  				y += yIncr;
  
  				if (p > 0)
  
  				{
  
  					this.mkDiv(x++, oy, _s, y-oy+ad);
  
  					p += pru;
  
  					oy = y;
  
  				}
  
  				else p += pr;
  
  			}
  
  			this.mkDiv(x2, oy, _s, y2-oy+ad+1);
  
  		}
  
  	}
  
  }
  
  
  
  
  
  function mkLinDott(x1, y1, x2, y2)
  
  {
  
  	if (x1 > x2)
  
  	{
  
  		var _x2 = x2;
  
  		var _y2 = y2;
  
  		x2 = x1;
  
  		y2 = y1;
  
  		x1 = _x2;
  
  		y1 = _y2;
  
  	}
  
  	var dx = x2-x1, dy = Math.abs(y2-y1),
  
  	x = x1, y = y1,
  
  	yIncr = (y1 > y2)? -1 : 1,
  
  	drw = true;
  
  	if (dx >= dy)
  
  	{
  
  		var pr = dy<<1,
  
  		pru = pr - (dx<<1),
  
  		p = pr-dx;
  
  		while ((dx--) > 0)
  
  		{
  
  			if (drw) this.mkDiv(x, y, 1, 1);
  
  			drw = !drw;
  
  			if (p > 0)
  
  			{
  
  				y += yIncr;
  
  				p += pru;
  
  			}
  
  			else p += pr;
  
  			++x;
  
  		}
  
  		if (drw) this.mkDiv(x, y, 1, 1);
  
  	}
  
  
  
  	else
  
  	{
  
  		var pr = dx<<1,
  
  		pru = pr - (dy<<1),
  
  		p = pr-dy;
  
  		while ((dy--) > 0)
  
  		{
  
  			if (drw) this.mkDiv(x, y, 1, 1);
  
  			drw = !drw;
  
  			y += yIncr;
  
  			if (p > 0)
  
  			{
  
  				++x;
  
  				p += pru;
  
  			}
  
  			else p += pr;
  
  		}
  
  		if (drw) this.mkDiv(x, y, 1, 1);
  
  	}
  
  }
  
  
  
  
  
  function mkOv(left, top, width, height)
  
  {
  
  	var a = width>>1, b = height>>1,
  
  	wod = width&1, hod = (height&1)+1,
  
  	cx = left+a, cy = top+b,
  
  	x = 0, y = b,
  
  	ox = 0, oy = b,
  
  	aa = (a*a)<<1, bb = (b*b)<<1,
  
  	st = (aa>>1)*(1-(b<<1)) + bb,
  
  	tt = (bb>>1) - aa*((b<<1)-1),
  
  	w, h;
  
  	while (y > 0)
  
  	{
  
  		if (st < 0)
  
  		{
  
  			st += bb*((x<<1)+3);
  
  			tt += (bb<<1)*(++x);
  
  		}
  
  		else if (tt < 0)
  
  		{
  
  			st += bb*((x<<1)+3) - (aa<<1)*(y-1);
  
  			tt += (bb<<1)*(++x) - aa*(((y--)<<1)-3);
  
  			w = x-ox;
  
  			h = oy-y;
  
  			if (w&2 && h&2)
  
  			{
  
  				this.mkOvQds(cx, cy, -x+2, ox+wod, -oy, oy-1+hod, 1, 1);
  
  				this.mkOvQds(cx, cy, -x+1, x-1+wod, -y-1, y+hod, 1, 1);
  
  			}
  
  			else this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, oy-h+hod, w, h);
  
  			ox = x;
  
  			oy = y;
  
  		}
  
  		else
  
  		{
  
  			tt -= aa*((y<<1)-3);
  
  			st -= (aa<<1)*(--y);
  
  		}
  
  	}
  
  	this.mkDiv(cx-a, cy-oy, a-ox+1, (oy<<1)+hod);
  
  	this.mkDiv(cx+ox+wod, cy-oy, a-ox+1, (oy<<1)+hod);
  
  }
  
  
  
  
  
  function mkOv2D(left, top, width, height)
  
  {
  
  	var s = this.stroke;
  
  	width += s-1;
  
  	height += s-1;
  
  	var a = width>>1, b = height>>1,
  
  	wod = width&1, hod = (height&1)+1,
  
  	cx = left+a, cy = top+b,
  
  	x = 0, y = b,
  
  	aa = (a*a)<<1, bb = (b*b)<<1,
  
  	st = (aa>>1)*(1-(b<<1)) + bb,
  
  	tt = (bb>>1) - aa*((b<<1)-1);
  
  
  
  	if (s-4 < 0 && (!(s-2) || width-51 > 0 && height-51 > 0))
  
  	{
  
  		var ox = 0, oy = b,
  
  		w, h,
  
  		pxl, pxr, pxt, pxb, pxw;
  
  		while (y > 0)
  
  		{
  
  			if (st < 0)
  
  			{
  
  				st += bb*((x<<1)+3);
  
  				tt += (bb<<1)*(++x);
  
  			}
  
  			else if (tt < 0)
  
  			{
  
  				st += bb*((x<<1)+3) - (aa<<1)*(y-1);
  
  				tt += (bb<<1)*(++x) - aa*(((y--)<<1)-3);
  
  				w = x-ox;
  
  				h = oy-y;
  
  
  
  				if (w-1)
  
  				{
  
  					pxw = w+1+(s&1);
  
  					h = s;
  
  				}
  
  				else if (h-1)
  
  				{
  
  					pxw = s;
  
  					h += 1+(s&1);
  
  				}
  
  				else pxw = h = s;
  
  				this.mkOvQds(cx, cy, -x+1, ox-pxw+w+wod, -oy, -h+oy+hod, pxw, h);
  
  				ox = x;
  
  				oy = y;
  
  			}
  
  			else
  
  			{
  
  				tt -= aa*((y<<1)-3);
  
  				st -= (aa<<1)*(--y);
  
  			}
  
  		}
  
  		this.mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);
  
  		this.mkDiv(cx+a+wod-s+1, cy-oy, s, (oy<<1)+hod);
  
  	}
  
  
  
  	else
  
  	{
  
  		var _a = (width-((s-1)<<1))>>1,
  
  		_b = (height-((s-1)<<1))>>1,
  
  		_x = 0, _y = _b,
  
  		_aa = (_a*_a)<<1, _bb = (_b*_b)<<1,
  
  		_st = (_aa>>1)*(1-(_b<<1)) + _bb,
  
  		_tt = (_bb>>1) - _aa*((_b<<1)-1),
  
  
  
  		pxl = new Array(),
  
  		pxt = new Array(),
  
  		_pxb = new Array();
  
  		pxl[0] = 0;
  
  		pxt[0] = b;
  
  		_pxb[0] = _b-1;
  
  		while (y > 0)
  
  		{
  
  			if (st < 0)
  
  			{
  
  				st += bb*((x<<1)+3);
  
  				tt += (bb<<1)*(++x);
  
  				pxl[pxl.length] = x;
  
  				pxt[pxt.length] = y;
  
  			}
  
  			else if (tt < 0)
  
  			{
  
  				st += bb*((x<<1)+3) - (aa<<1)*(y-1);
  
  				tt += (bb<<1)*(++x) - aa*(((y--)<<1)-3);
  
  				pxl[pxl.length] = x;
  
  				pxt[pxt.length] = y;
  
  			}
  
  			else
  
  			{
  
  				tt -= aa*((y<<1)-3);
  
  				st -= (aa<<1)*(--y);
  
  			}
  
  
  
  			if (_y > 0)
  
  			{
  
  				if (_st < 0)
  
  				{
  
  					_st += _bb*((_x<<1)+3);
  
  					_tt += (_bb<<1)*(++_x);
  
  					_pxb[_pxb.length] = _y-1;
  
  				}
  
  				else if (_tt < 0)
  
  				{
  
  					_st += _bb*((_x<<1)+3) - (_aa<<1)*(_y-1);
  
  					_tt += (_bb<<1)*(++_x) - _aa*(((_y--)<<1)-3);
  
  					_pxb[_pxb.length] = _y-1;
  
  				}
  
  				else
  
  				{
  
  					_tt -= _aa*((_y<<1)-3);
  
  					_st -= (_aa<<1)*(--_y);
  
  					_pxb[_pxb.length-1]--;
  
  				}
  
  			}
  
  		}
  
  
  
  		var ox = 0, oy = b,
  
  		_oy = _pxb[0],
  
  		l = pxl.length,
  
  		w, h;
  
  		for (var i = 0; i < l; i++)
  
  		{
  
  			if (typeof _pxb[i] != "undefined")
  
  			{
  
  				if (_pxb[i] < _oy || pxt[i] < oy)
  
  				{
  
  					x = pxl[i];
  
  					this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, _oy+hod, x-ox, oy-_oy);
  
  					ox = x;
  
  					oy = pxt[i];
  
  					_oy = _pxb[i];
  
  				}
  
  			}
  
  			else
  
  			{
  
  				x = pxl[i];
  
  				this.mkDiv(cx-x+1, cy-oy, 1, (oy<<1)+hod);
  
  				this.mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
  
  				ox = x;
  
  				oy = pxt[i];
  
  			}
  
  		}
  
  		this.mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);
  
  		this.mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
  
  	}
  
  }
  
  
  
  
  
  function mkOvDott(left, top, width, height)
  
  {
  
  	var a = width>>1, b = height>>1,
  
  	wod = width&1, hod = height&1,
  
  	cx = left+a, cy = top+b,
  
  	x = 0, y = b,
  
  	aa2 = (a*a)<<1, aa4 = aa2<<1, bb = (b*b)<<1,
  
  	st = (aa2>>1)*(1-(b<<1)) + bb,
  
  	tt = (bb>>1) - aa2*((b<<1)-1),
  
  	drw = true;
  
  	while (y > 0)
  
  	{
  
  		if (st < 0)
  
  		{
  
  			st += bb*((x<<1)+3);
  
  			tt += (bb<<1)*(++x);
  
  		}
  
  		else if (tt < 0)
  
  		{
  
  			st += bb*((x<<1)+3) - aa4*(y-1);
  
  			tt += (bb<<1)*(++x) - aa2*(((y--)<<1)-3);
  
  		}
  
  		else
  
  		{
  
  			tt -= aa2*((y<<1)-3);
  
  			st -= aa4*(--y);
  
  		}
  
  		if (drw) this.mkOvQds(cx, cy, -x, x+wod, -y, y+hod, 1, 1);
  
  		drw = !drw;
  
  	}
  
  }
  
  
  
  
  
  function mkRect(x, y, w, h)
  
  {
  
  	var s = this.stroke;
  
  	this.mkDiv(x, y, w, s);
  
  	this.mkDiv(x+w, y, s, h);
  
  	this.mkDiv(x, y+h, w+s, s);
  
  	this.mkDiv(x, y+s, s, h-s);
  
  }
  
  
  
  
  
  function mkRectDott(x, y, w, h)
  
  {
  
  	this.drawLine(x, y, x+w, y);
  
  	this.drawLine(x+w, y, x+w, y+h);
  
  	this.drawLine(x, y+h, x+w, y+h);
  
  	this.drawLine(x, y, x, y+h);
  
  }
  
  
  
  
  
  function jsgFont()
  
  {
  
  	this.PLAIN = 'font-weight:normal;';
  
  	this.BOLD = 'font-weight:bold;';
  
  	this.ITALIC = 'font-style:italic;';
  
  	this.ITALIC_BOLD = this.ITALIC + this.BOLD;
  
  	this.BOLD_ITALIC = this.ITALIC_BOLD;
  
  }
  
  var Font = new jsgFont();
  
  
  
  
  
  function jsgStroke()
  
  {
  
  	this.DOTTED = -1;
  
  }
  
  var Stroke = new jsgStroke();
  
  
  
  
  
  function jsGraphics(id, wnd)
  
  {
  
  	this.setColor = new Function('arg', 'this.color = arg.toLowerCase();');
  
  
  
  	this.setStroke = function(x)
  
  	{
  
  		this.stroke = x;
  
  		if (!(x+1))
  
  		{
  
  			this.drawLine = mkLinDott;
  
  			this.mkOv = mkOvDott;
  
  			this.drawRect = mkRectDott;
  
  		}
  
  		else if (x-1 > 0)
  
  		{
  
  			this.drawLine = mkLin2D;
  
  			this.mkOv = mkOv2D;
  
  			this.drawRect = mkRect;
  
  		}
  
  		else
  
  		{
  
  			this.drawLine = mkLin;
  
  			this.mkOv = mkOv;
  
  			this.drawRect = mkRect;
  
  		}
  
  	};
  
  
  
  
  
  	this.setPrintable = function(arg)
  
  	{
  
  		this.printable = arg;
  
  		if (jg_fast)
  
  		{
  
  			this.mkDiv = mkDivIe;
  
  			this.htmRpc = arg? htmPrtRpc : htmRpc;
  
  		}
  
  		else this.mkDiv = jg_n4? mkLyr : arg? mkDivPrt : mkDiv;
  
  	};
  
  
  
  
  
  	this.setFont = function(fam, sz, sty)
  
  	{
  
  		this.ftFam = fam;
  
  		this.ftSz = sz;
  
  		this.ftSty = sty || Font.PLAIN;
  
  	};
  
  
  
  
  
  	this.drawPolyline = this.drawPolyLine = function(x, y, s)
  
  	{
  
  		for (var i=0 ; i<x.length-1 ; i++ )
  
  			this.drawLine(x[i], y[i], x[i+1], y[i+1]);
  
  	};
  
  
  
  
  
  	this.fillRect = function(x, y, w, h)
  
  	{
  
  		this.mkDiv(x, y, w, h);
  
  	};
  
  
  
  
  
  	this.drawPolygon = function(x, y)
  
  	{
  
  		this.drawPolyline(x, y);
  
  		this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);
  
  	};
  
  
  
  
  
  	this.drawEllipse = this.drawOval = function(x, y, w, h)
  
  	{
  
  		this.mkOv(x, y, w, h);
  
  	};
  
  
  
  
  
  	this.fillEllipse = this.fillOval = function(left, top, w, h)
  
  	{
  
  		var a = (w -= 1)>>1, b = (h -= 1)>>1,
  
  		wod = (w&1)+1, hod = (h&1)+1,
  
  		cx = left+a, cy = top+b,
  
  		x = 0, y = b,
  
  		ox = 0, oy = b,
  
  		aa2 = (a*a)<<1, aa4 = aa2<<1, bb = (b*b)<<1,
  
  		st = (aa2>>1)*(1-(b<<1)) + bb,
  
  		tt = (bb>>1) - aa2*((b<<1)-1),
  
  		pxl, dw, dh;
  
  		if (w+1) while (y > 0)
  
  		{
  
  			if (st < 0)
  
  			{
  
  				st += bb*((x<<1)+3);
  
  				tt += (bb<<1)*(++x);
  
  			}
  
  			else if (tt < 0)
  
  			{
  
  				st += bb*((x<<1)+3) - aa4*(y-1);
  
  				pxl = cx-x;
  
  				dw = (x<<1)+wod;
  
  				tt += (bb<<1)*(++x) - aa2*(((y--)<<1)-3);
  
  				dh = oy-y;
  
  				this.mkDiv(pxl, cy-oy, dw, dh);
  
  				this.mkDiv(pxl, cy+oy-dh+hod, dw, dh);
  
  				ox = x;
  
  				oy = y;
  
  			}
  
  			else
  
  			{
  
  				tt -= aa2*((y<<1)-3);
  
  				st -= aa4*(--y);
  
  			}
  
  		}
  
  		this.mkDiv(cx-a, cy-oy, w+1, (oy<<1)+hod);
  
  	};
  
  
  
  
  
  
  
  /* fillPolygon method, implemented by Matthieu Haller.
  
  This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.
  
  C source of GD 1.8.4 found at http://www.boutell.com/gd/
  
  
  
  THANKS to Kirsten Schulz for the polygon fixes!
  
  
  
  The intersection finding technique of this code could be improved
  
  by remembering the previous intertersection, and by using the slope.
  
  That could help to adjust intersections to produce a nice
  
  interior_extrema. */
  
  	this.fillPolygon = function(array_x, array_y)
  
  	{
  
  		var i;
  
  		var y;
  
  		var miny, maxy;
  
  		var x1, y1;
  
  		var x2, y2;
  
  		var ind1, ind2;
  
  		var ints;
  
  
  
  		var n = array_x.length;
  
  
  
  		if (!n) return;
  
  
  
  
  
  		miny = array_y[0];
  
  		maxy = array_y[0];
  
  		for (i = 1; i < n; i++)
  
  		{
  
  			if (array_y[i] < miny)
  
  				miny = array_y[i];
  
  
  
  			if (array_y[i] > maxy)
  
  				maxy = array_y[i];
  
  		}
  
  		for (y = miny; y <= maxy; y++)
  
  		{
  
  			var polyInts = new Array();
  
  			ints = 0;
  
  			for (i = 0; i < n; i++)
  
  			{
  
  				if (!i)
  
  				{
  
  					ind1 = n-1;
  
  					ind2 = 0;
  
  				}
  
  				else
  
  				{
  
  					ind1 = i-1;
  
  					ind2 = i;
  
  				}
  
  				y1 = array_y[ind1];
  
  				y2 = array_y[ind2];
  
  				if (y1 < y2)
  
  				{
  
  					x1 = array_x[ind1];
  
  					x2 = array_x[ind2];
  
  				}
  
  				else if (y1 > y2)
  
  				{
  
  					y2 = array_y[ind1];
  
  					y1 = array_y[ind2];
  
  					x2 = array_x[ind1];
  
  					x1 = array_x[ind2];
  
  				}
  
  				else continue;
  
  
  
  				 // modified 11. 2. 2004 Walter Zorn
  
  				if ((y >= y1) && (y < y2))
  
  					polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);
  
  
  
  				else if ((y == maxy) && (y > y1) && (y <= y2))
  
  					polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);
  
  			}
  
  			polyInts.sort(integer_compare);
  
  
  
  			for (i = 0; i < ints; i+=2)
  
  			{
  
  				w = polyInts[i+1]-polyInts[i]
  
  				this.mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);
  
  			}
  
  		}
  
  	};
  
  
  
  
  
  	this.drawString = function(txt, x, y)
  
  	{
  
  		this.htm += '<div style="position:absolute;white-space:nowrap;'+
  
  			'left:' + x + 'px;'+
  
  			'top:' + y + 'px;'+
  
  			'font-family:' +  this.ftFam + ';'+
  
  			'font-size:' + this.ftSz + ';'+
  
  			'color:' + this.color + ';' + this.ftSty + '">'+
  
  			txt +
  
  			'<\/div>';
  
  	}
  
  
  
  
  
  	this.drawImage = function(imgSrc, x, y, w, h)
  
  	{
  
  		this.htm += '<div style="position:absolute;'+
  
  			'left:' + x + 'px;'+
  
  			'top:' + y + 'px;'+
  
  			'width:' +  w + ';'+
  
  			'height:' + h + ';">'+
  
  			'<img src="' + imgSrc + '" width="' + w + '" height="' + h + '">'+
  
  			'<\/div>';
  
  	}
  
  
  
  
  
  	this.clear = function()
  
  	{
  
  		this.htm = "";
  
  		if (this.cnv) this.cnv.innerHTML = this.defhtm;
  
  	};
  
  
  
  
  
  	this.mkOvQds = function(cx, cy, xl, xr, yt, yb, w, h)
  
  	{
  
  		this.mkDiv(xr+cx, yt+cy, w, h);
  
  		this.mkDiv(xr+cx, yb+cy, w, h);
  
  		this.mkDiv(xl+cx, yb+cy, w, h);
  
  		this.mkDiv(xl+cx, yt+cy, w, h);
  
  	};
  
  
  
  	this.setStroke(1);
  
  	this.setFont('verdana,geneva,helvetica,sans-serif', String.fromCharCode(0x31, 0x32, 0x70, 0x78), Font.PLAIN);
  
  	this.color = '#000000';
  
  	this.htm = '';
  
  	this.wnd = wnd || window;
  
  
  
  	if (!(jg_ie || jg_dom || jg_ihtm)) chkDHTM();
  
  	if (typeof id != 'string' || !id) this.paint = pntDoc;
  
  	else
  
  	{
  
  		this.cnv = document.all? (this.wnd.document.all[id] || null)
  
  			: document.getElementById? (this.wnd.document.getElementById(id) || null)
  
  			: null;
  
  		this.defhtm = (this.cnv && this.cnv.innerHTML)? this.cnv.innerHTML : '';
  
  		this.paint = jg_dom? pntCnvDom : jg_ie? pntCnvIe : jg_ihtm? pntCnvIhtm : pntCnv;
  
  	}
  
  
  
  	this.setPrintable(false);
  
  }
  
  
  
  
  
  
  
  function integer_compare(x,y)
  
  {
  
  	return (x < y) ? -1 : ((x > y)*1);
  
  }
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Abstract.xsl
  
  Index: Abstract.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" xmlns:wmc="http://www.opengis.net/context" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <!--
  Description: Output the context title and abstract
  Author:      Mike Adair mike.adairATnrcan.gc.ca
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  Abstract.xsl,v 1.5 2004/06/25 17:59:38 madair1 Exp
  
  -->
    <xsl:output method="xml" encoding="utf-8"/>
    
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="widgetNode"/>
    
    <!-- Text params for this widget -->
    <xsl:param name="abstract"/>
    <xsl:param name="moreInfo"/>
    
    <xsl:template match="/">
      <xsl:apply-templates select="wmc:ViewContext/wmc:General"/>
      <xsl:apply-templates select="wmc:OWSContext/wmc:General"/>
    </xsl:template>
  
    
    <!-- Main html -->
    <xsl:template match="wmc:General">
      <xsl:param name="metadataUrl">
        <xsl:value-of select="wmc:DescriptionURL/wmc:OnlineResource/@xlink:href"/>
      </xsl:param>
      <xsl:param name="logoUrl">
        <xsl:value-of select="wmc:LogoURL/wmc:OnlineResource/@xlink:href"/>
      </xsl:param>
      <div>
        <h3><xsl:value-of select="$abstract"/></h3>
        <xsl:if test="$logoUrl">
          <div style="float:right"><img src='{$logoUrl}' alt='{$logoUrl}'/></div>
        </xsl:if>
        <p>
          <xsl:choose>
            <xsl:when test="wmc:Abstract/@xml:lang">              
              <xsl:value-of select="wmc:Abstract[@xml:lang=$lang]"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="wmc:Abstract"/>
            </xsl:otherwise>
          </xsl:choose>
          <!--br/><xsl:value-of select="{$widgetNode}/stylesheet"/-->
        </p>
        <p>
          <a href='{$metadataUrl}' title='{$metadataUrl}' target="moreInfo"><xsl:value-of select="$moreInfo"/></a>
        </p>
      </div>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
    
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/AoiBox2.js
  
  Index: AoiBox2.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/GmlRenderer.js");
  
  /**
   * Render an Area Of Interest (AOI) Box over a map.
   * This widget extends GmlRenderer and uses GmlRenderer.xsl to build the HTML box.
   * @constructor
   * @base GmlRenderer
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function AoiBox2(widgetNode, model) {
    // Inherit the GmlRenderer functions and parameters
    var base = new GmlRenderer(widgetNode, model);
    for (sProperty in base) { 
      this[sProperty] = base[sProperty]; 
    } 
  
    /** Use the GmlRenderer stylesheet. */
    this.stylesheet=new XslProcessor(baseDir+"/widget/GmlRenderer.xsl");
  
    /**
     * Build Gml Envelope from AOI and set XSL params.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      objRef.stylesheet.setParameter("width", objRef.targetModel.getWindowWidth() );
      objRef.stylesheet.setParameter("height", objRef.targetModel.getWindowHeight() );
      bBox=objRef.targetModel.getBoundingBox();
      objRef.stylesheet.setParameter("bBoxMinX", bBox[0]);
      objRef.stylesheet.setParameter("bBoxMinY", bBox[1]);
      objRef.stylesheet.setParameter("bBoxMaxX", bBox[2]);
      objRef.stylesheet.setParameter("bBoxMaxY", bBox[3]);
      objRef.stylesheet.setParameter("color", "#FF0000");
      objRef.stylesheet.setParameter("crossSize", "15");
      objRef.stylesheet.setParameter("lineWidth", "1");
  
      aoiBox = objRef.model.getParam("aoi");
      gml='<?xml version="1.0" encoding="utf-8" standalone="no"?>';
      if (aoiBox) {
        ul = objRef.model.extent.getPL(aoiBox[0]);
        lr = objRef.model.extent.getPL(aoiBox[1]);
        gml=gml+'<Aoi version="1.0.0" xmlns:gml="http://www.opengis.net/gml">';
        gml=gml+'<gml:Envelope>';
        gml=gml+'<gml:coord>';
        gml=gml+'<gml:X>'+aoiBox[0][0]+'</gml:X>';
        gml=gml+'<gml:Y>'+aoiBox[0][1]+'</gml:Y>';
        gml=gml+'</gml:coord>';
        gml=gml+'<gml:coord>';
        gml=gml+'<gml:X>'+aoiBox[1][0]+'</gml:X>';
        gml=gml+'<gml:Y>'+aoiBox[1][1]+'</gml:Y>';
        gml=gml+'</gml:coord>';
        gml=gml+'</gml:Envelope>';
        gml=gml+'</Aoi>';
      } else {
        gml=gml+"<null/>";
      }
  
      objRef.resultDoc = Sarissa.getDomDocument();
      objRef.resultDoc.loadXML(gml);
    }
  
    /**
     * Called when the AoiChanged.
     * @param objRef This object.
     */
    this.aoiListener = function(objRef) {
      objRef.paint(objRef);
    }
    model.addListener("aoi",this.aoiListener, this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/AoiBoxDHTML.js
  
  Index: AoiBoxDHTML.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * Widget to draw an Area Of Interest box of a model.  The box can be drawn with
   * the paint() method and is registered as a listener of the context AOI property.
   * This object works entirely in pixel/line coordinate space and knows nothing
   * about geography.  This widget uses DHTML methods to draw the box.
   * @constructor
   * @base MapContainerBase
   * @param widgetNode The node for this object from the Config file.
   * @param model The model that contains this object.
   */
  function AoiBoxDHTML(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
  
    this.lineWidth = widgetNode.selectSingleNode("mb:lineWidth").firstChild.nodeValue; // Zoombox line width; pass in as param?
    this.lineColor = widgetNode.selectSingleNode("mb:lineColor").firstChild.nodeValue; // color of zoombox lines; pass in as param?
    this.crossSize = parseInt(widgetNode.selectSingleNode("mb:crossSize").firstChild.nodeValue);
  
    /** draw out the box.
      * if the box width or height is less than the cross size property, then the
      * drawCross method is called, otherwise call drawBox.
      * @param objRef a pointer to this widget object
      */
    this.paint = function(objRef) {
      var aoiBox = objRef.model.getParam("aoi");
      if (aoiBox) {
        var ul = objRef.model.extent.getPL(aoiBox[0]);
        var lr = objRef.model.extent.getPL(aoiBox[1]);
        //check if ul=lr, then draw cross, else drawbox
        if ( (Math.abs( ul[0]-lr[0] ) < objRef.crossSize) && 
            (Math.abs( ul[1]-lr[1] ) < objRef.crossSize) ) {
          objRef.drawCross( new Array( (ul[0]+lr[0])/2, (ul[1]+lr[1])/2) );
        } else {
          objRef.drawBox(ul, lr);
        }
      }
    }
    model.addListener("aoi",this.paint, this);
  
    MapContainerBase.apply(this,new Array(widgetNode, model));
  
    /** Hide or show the box.
      * @param vis    boolean true for visible; false for hidden
      * @return       none
      */
    this.setVis = function(vis) {
      var visibility = "hidden";
      if (vis) visibility = "visible";
      this.Top.style.visibility = visibility;
      this.Left.style.visibility = visibility;
      this.Right.style.visibility = visibility;
      this.Bottom.style.visibility = visibility;
    }
  
    /** Listener to turn the box off
      * @param objRef  reference to this object
      * @return       none
      */
    this.clear = function(objRef) {
      objRef.setVis(false);
    }
    this.containerModel.addListener("bbox",this.clear, this);
  
  
    /** Draw a box.
      * @param ul Upper Left position as an (x,y) array in screen coords.
      * @param lr Lower Right position as an (x,y) array in screen coords.
      */
    this.drawBox = function(ul, lr) {
      this.Top.style.left = ul[0] +'px';
      this.Top.style.top = ul[1] +'px';
      this.Top.style.width = lr[0]-ul[0]  +'px';
      this.Top.style.height = this.lineWidth +'px';
  
      this.Left.style.left = ul[0]  +'px';
      this.Left.style.top = ul[1]  +'px';
      this.Left.style.width = this.lineWidth  +'px';
      this.Left.style.height = lr[1]-ul[1]  +'px';
  
      this.Right.style.left = lr[0]-this.lineWidth  +'px';
      this.Right.style.top = ul[1]  +'px';
      this.Right.style.width = this.lineWidth +'px';
      this.Right.style.height = lr[1]-ul[1] +'px';
  
      this.Bottom.style.left = ul[0] +'px';
      this.Bottom.style.top = lr[1]-this.lineWidth  +'px';
      this.Bottom.style.width = lr[0]-ul[0] +'px';
      this.Bottom.style.height = this.lineWidth +'px';
  
      this.setVis(true);
    }
      
    /** Draw a cross.
      * @param center The center of the cross as an (x,y) array in screen coordinates.
      */
    this.drawCross = function(center) {
      this.Top.style.left = Math.floor( center[0] - this.crossSize/2 ) +'px';
      this.Top.style.top = Math.floor( center[1] - this.lineWidth/2 ) +'px';
      this.Top.style.width = this.crossSize +'px';
      this.Top.style.height = this.lineWidth +'px';
      this.Top.style.visibility = "visible";
  
      this.Left.style.left = Math.floor( center[0] - this.lineWidth/2 ) +'px';
      this.Left.style.top = Math.floor( center[1] - this.crossSize/2 ) +'px';
      this.Left.style.width = this.lineWidth +'px';
      this.Left.style.height = this.crossSize +'px';
      this.Left.style.visibility = "visible";
  
      this.Right.style.visibility = "hidden";
      this.Bottom.style.visibility = "hidden";
    }
      
    /** Insert a <div> element into the parentNode html to hold the lines.
      * @return The new <div> node.
      */
    this.getImageDiv = function( ) {
      var newDiv = document.createElement("div");
      newDiv.innerHTML = "<img src='"+config.skinDir+"/images/Spacer.gif' width='1px' height='1px'/>";
      newDiv.style.position = "absolute";
      newDiv.style.backgroundColor = this.lineColor;
      newDiv.style.visibility = "hidden";
      newDiv.style.zIndex = 300;
      this.node.appendChild( newDiv );
      return newDiv;
    }
  
    /**
     * Called when the parent widget is painted to create the aoi box 
     * @param objRef This object.
     */
    this.loadAoiBox = function(objRef) {
      objRef.Top = objRef.getImageDiv( );
      objRef.Bottom = objRef.getImageDiv( );
      objRef.Left = objRef.getImageDiv( );
      objRef.Right = objRef.getImageDiv( );
      objRef.paint(objRef);
    }
    this.loadAoiBox(this);
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/AoiBoxWZ.js
  
  Index: AoiBoxWZ.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  mapbuilder.loadScript(baseDir+"/util/wz_jsgraphics/wz_jsgraphics.js");
  
  /**
   * Widget to draw an Area Of Interest box of a model.  The box can be drawn with
   * the paint() method and is registered as a listener of the context AOI property.
   * This object works entirely in pixel/line coordinate space and knows nothing
   * about geography.  This widget uses the Walter-Zorn graphics library to draw.
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function AoiBoxWZ(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
  
    this.lineWidth = widgetNode.selectSingleNode("mb:lineWidth").firstChild.nodeValue;
    this.lineColor = widgetNode.selectSingleNode("mb:lineColor").firstChild.nodeValue;
    this.crossSize = widgetNode.selectSingleNode("mb:crossSize").firstChild.nodeValue;
  
    /**
     * Render the widget.
     * If the box width or height is less than the cross size, then draw a cross,
     * otherwise draw a box.
     * @param objRef Pointer to this object.
     */
    this.paint = function(objRef) {
  
      //create the output node the first time this is called
      var outputNode = document.getElementById( objRef.outputNodeId );
      if (!outputNode) {
        outputNode = document.createElement("DIV");
        outputNode.setAttribute("id",objRef.outputNodeId);
        outputNode.style.position="relative";
        objRef.node.appendChild(outputNode);
      }
      outputNode.style.left=0;
      outputNode.style.top=0;
  
      if (! objRef.jg) {
        // WZ Graphics object and rendering functions.
        objRef.jg=new jsGraphics(objRef.outputNodeId);
        objRef.jg.setColor(objRef.lineColor);
  
        //TBD: The following causes lines to be drawn incorrectly in Mozilla 1.71
        objRef.jg.setStroke(parseInt(objRef.lineWidth));
      }
  
      var aoiBox = objRef.model.getParam("aoi");
      if (aoiBox) {
        var ul = objRef.model.extent.getPL(aoiBox[0]);
        var lr = objRef.model.extent.getPL(aoiBox[1]);
        var width= lr[0]-ul[0];
        var height= lr[1]-ul[1];
  
        objRef.jg.clear();
  
        //check if ul=lr, then draw cross, else drawbox
        if ((width < objRef.crossSize) && (height < objRef.crossSize) ) {
          // draw cross
          var x=(lr[0]+ul[0])/2;
          var y=(lr[1]+ul[1])/2;
          var c=objRef.crossSize/2;
          objRef.jg.drawLine(x+c,y,x-c,y);
          objRef.jg.drawLine(x,y+c,x,y-c);
        } else {
          // draw box
          objRef.jg.drawRect(ul[0],ul[1],width,height);
        }
        objRef.jg.paint();
      }
    }
    this.model.addListener("aoi",this.paint, this);
  
    MapContainerBase.apply(this,new Array(widgetNode, model));
  
    /**
     * Reset internal variables after container is redrawn due to refreshing
     * of the model.
     * @param objRef Pointer to this object.
     */
    this.clearAoiBox = function(objRef) {
      if (objRef.jg) objRef.jg.clear();
    }
    this.model.addListener("bbox",this.clearAoiBox, this);
  
    /**
     * Reset internal variables after container is redrawn due to refreshing
     * of the model.
     * @param objRef Pointer to this object.
     */
    this.refresh = function(objRef) {
      objRef.clearAoiBox(objRef);
      objRef.jg=null;
    }
    this.model.addListener("newModel",this.refresh, this);
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/AoiForm.js
  
  Index: AoiForm.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  
  /**
   * Widget to display the AOI box coordinates in a form.
   *
   * @constructor
   * @base WidgetBase
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function AoiForm(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Output the AOI coordinates to the associated form input elements.  This
     * method is registered as an AOI listener on the context doc.
     * @param objRef Pointer to this AoiForm object.
     * @param targetNode The node for the enclosing HTML tag for this widget.
     */
    this.displayAoiCoords = function(objRef, targetNode) {
      objRef.aoiForm = document.getElementById(objRef.formName);
      var aoi = objRef.model.getParam("aoi");
      if (aoi && objRef.aoiForm) {
        objRef.aoiForm.westCoord.value = aoi[0][0];
        objRef.aoiForm.northCoord.value = aoi[0][1];
        objRef.aoiForm.eastCoord.value = aoi[1][0];
        objRef.aoiForm.southCoord.value = aoi[1][1];
      }
    }
    this.model.addListener('aoi', this.displayAoiCoords, this);
  
    /**
     * Handles user input from the form element.  This is an onblur handler for 
     * the input elements.
     */
    this.setAoi = function() {
      var aoi = this.model.getParam("aoi");
      if (aoi) {
        var ul = aoi[0];
        var lr = aoi[1];
        switch(this.name) {
          case 'westCoord':
            ul[0] = this.value;
            break;
          case 'northCoord':
            ul[1] = this.value;
            break;
          case 'eastCoord':
            lr[0] = this.value;
            break;
          case 'southCoord':
            lr[1] = this.value;
            break;
        }
        this.model.setParam("aoi",new Array(ul,lr) );
      }
    }
  
    /**
     * Refreshes the form onblur handlers when this widget is painted.
     * @param objRef Pointer to this AoiForm object.
     */
    this.postPaint = function(objRef) {
      objRef.aoiForm = document.getElementById(objRef.formName);
      objRef.aoiForm.westCoord.onblur = objRef.setAoi;
      objRef.aoiForm.northCoord.onblur = objRef.setAoi;
      objRef.aoiForm.eastCoord.onblur = objRef.setAoi;
      objRef.aoiForm.southCoord.onblur = objRef.setAoi;
      objRef.aoiForm.westCoord.model = objRef.model;
      objRef.aoiForm.northCoord.model = objRef.model;
      objRef.aoiForm.eastCoord.model = objRef.model;
      objRef.aoiForm.southCoord.model = objRef.model;
    }
  
    //set some properties for the form output
    //allow it to have a different form name
    var formNameNode = widgetNode.selectSingleNode("mb:formName");
    if ( formNameNode ) {
      this.formName = formNameNode.firstChild.nodeValue;
    } else {
      this.formName = "AoiForm_" + mbIds.getId();
    }
    this.stylesheet.setParameter("formName", this.formName);
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/AoiForm.xsl
  
  Index: AoiForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="no" ?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Output a form for display of the context doc AOI
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  AoiForm.xsl,v 1.2 2004/06/25 17:59:38 madair1 Exp
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- The name of the form for coordinate output -->
    <xsl:param name="formName">AOIForm</xsl:param>
  
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
    <xsl:param name="north"/>
    <xsl:param name="south"/>
    <xsl:param name="east"/>
    <xsl:param name="west"/>
    
    <!-- Main html -->
    <xsl:template match="/">
      <div>
      <form name="{$formName}" id="{$formName}">
        <table>
          <tr>
            <th align="left" colspan="3">
              <xsl:value-of select="$title"/>
            </th>
          </tr>
          <tr>
            <td>
            </td>
            <td>
              <xsl:value-of select="$north"/>
              <input name="northCoord" type="text" size="10" style="font: 8pt Verdana, geneva, arial, sans-serif;" readonly="readonly"/>
            </td>
            <td>
            </td>
          </tr>
          <tr>
            <td>
              <xsl:value-of select="$west"/>
              <input name="westCoord" type="text" size="10" style="font: 8pt Verdana, geneva, arial, sans-serif;" readonly="readonly"/>
            </td>
            <td>
            </td>
            <td>
              <xsl:value-of select="$east"/>
              <input name="eastCoord" type="text" size="10" style="font: 8pt Verdana, geneva, arial, sans-serif;" readonly="readonly"/>
            </td>
          </tr>
          <tr>
            <td>
            </td>
            <td>
              <xsl:value-of select="$south"/>
              <input name="southCoord" type="text" size="10" style="font: 8pt Verdana, geneva, arial, sans-serif;" readonly="readonly"/>
            </td>
            <td>
            </td>
          </tr>
        </table>
      </form>
      </div>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/AoiMetacatQuery.js
  
  Index: AoiMetacatQuery.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is selected, clicks on the MapPane trigger a Metacat query with the 
   * currently set AOI.
   * @constructor
   * @base ButtonBase
   * @authors P. Mark Anderson anderson at nceas.ucsb.edu, Matthew Perry perry at nceas.ucsb.edu
   * @param widgetNode The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function AoiMetacatQuery(widgetNode, model) {
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model))
  
    // Grab the important values from the config file
    var metacat = widgetNode.selectSingleNode("mb:metacat").firstChild.nodeValue;
    var skin = widgetNode.selectSingleNode("mb:skin").firstChild.nodeValue;
    var tolerance = widgetNode.selectSingleNode("mb:pixel_tolerance").firstChild.nodeValue;
  
    /**
     * Queries metacat and displays the result in a popup window.
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        var method = "popup";
        var bbox = objRef.targetModel.getParam("aoi");
        if ( bbox!=null) {
          var ul = bbox[0];
          var lr = bbox[1];
          var extent = objRef.targetModel.extent;
          var extbox = extent.model.getBoundingBox();
          var mapwidth_real = extbox[2] - extbox[0];
          var mapwidth_pixel = extent.model.getWindowWidth();
          var res = mapwidth_real / mapwidth_pixel;
        }
  
        //var selectedLayer = objRef.context.getParam("selectedLayer");
         
  
       // Determine the BBOX
       var x1 = ul[0];
       var y1 = lr[1];
       var x2 = lr[0];
       var y2 = ul[1];
       if ( x1 == x2 && y1 == y2 ) {
        // BBOX is really a point; give a bit of wiggle room
        // tolerance is number of pixels to buffer, set in config
        x1 = x1 - tolerance * res;
        y1 = y1 - tolerance * res;
        x2 = x2 + tolerance * res;
        y2 = y2 + tolerance * res;          
       } 
  
       var url = metacat + "?action=spatial_query&XMIN=" + x1 + "&XMAX=" + x2 + 
                "&YMIN=" + y1 + "&YMAX=" + y2 + "&SKIN=" + skin;
  
       if (method == 'popup') {
         newwindow = window.open(url,'queryWin',
                    'height=600,width=800,status=yes,toolbar=yes,menubar=no,location=yes,resizable=yes,scrollbars=yes');
         if (window.focus) {newwindow.focus()}
       }
  
      }
    }
  
    /**
     * Register for mouseUp events.
     * @param objRef  Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.mouseHandler) {
        objRef.mouseHandler.model.addListener('mouseup',objRef.doAction,objRef);
      }
      objRef.context=objRef.widgetNode.selectSingleNode("mb:context");
      if (objRef.context){
        alert("got context!");
        objRef.context=eval("config.objects."+objRef.context.firstChild.nodeValue);
      } else {
  		//alert("no context in AoiMetacatQuery widget.  using mainMap ");
  		objRef.context=eval("config.objects.mainMap");
  		/*
  		var nodes = objRef.widgetNode.childNodes;
      	for (var i=0; i<nodes.length; i++) {
      		alert(nodes.item(i).nodeType + " // " +
      		nodes.item(i).nodeName + " // " +
      		nodes.item(i).nodeValue);
  		}
  		*/
  	}
    }
    this.model.addListener( "loadModel", this.setMouseListener, this );
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/AoiWFSQuery.js
  
  Index: AoiWFSQuery.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is selected, clicks on the MapPane trigger a Metacat query with the 
   * currently set AOI.
   * @constructor
   * @base ButtonBase
   * @authors P. Mark Anderson anderson at nceas.ucsb.edu, Matthew Perry perry at nceas.ucsb.edu
   * @param widgetNode The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function AoiMetacatQuery(widgetNode, model) {
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model))
  
    // Grab the important values from the config file
    var wfs_proxy = widgetNode.selectSingleNode("mb:wfs_proxy").firstChild.nodeValue;
    var wfs_server = widgetNode.selectSingleNode("mb:wfs_server").firstChild.nodeValue;
    var tolerance = widgetNode.selectSingleNode("mb:pixel_tolerance").firstChild.nodeValue;
  
    /**
     * Queries metacat and displays the result in a popup window.
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        var method = "popup";
        var bbox = objRef.targetModel.getParam("aoi");
        if ( bbox!=null) {
          var ul = bbox[0];
          var lr = bbox[1];
          var extent = objRef.targetModel.extent;
          var extbox = extent.model.getBoundingBox();
          var mapwidth_real = extbox[2] - extbox[0];
          var mapwidth_pixel = extent.model.getWindowWidth();
          var res = mapwidth_real / mapwidth_pixel;
        }
  
        var selectedLayer = objRef.context.getParam("selectedLayer");
         
        if ( selectedLayer != null ) {
  
          // Determine the BBOX
          var x1 = ul[0];
          var y1 = lr[1];
          var x2 = lr[0];
          var y2 = ul[1];
          if ( x1 == x2 && y1 == y2 ) {
            // BBOX is really a point; give a bit of wiggle room
            // tolerance is number of pixels to buffer, set in config
            x1 = x1 - tolerance * res;
            y1 = y1 - tolerance * res;
            x2 = x2 + tolerance * res;
            y2 = y2 + tolerance * res;          
          } 
  
          var wfs_url = wfs_server + "?request=GetFeature&typename=" + selectedLayer + 
                    "&BBOX=" + x1 + "," + y1 + "," + x2 + "," + y2;
          var url = wfs_proxy + "?wfsurl=" + escape(wfs_url);
  
          if (method == 'popup') {
             newwindow = window.open(url,'queryWin','height=600,width=800,status=yes,toolbar=yes,menubar=no,location=yes,resizable=yes,scrollbars=yes');
             if (window.focus) {newwindow.focus()}
          }
        } else {
          alert("Please select a query layer first");
          
        }
  
      }
    }
  
    /**
     * Register for mouseUp events.
     * @param objRef  Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.mouseHandler) {
        objRef.mouseHandler.model.addListener('mouseup',objRef.doAction,objRef);
      }
      objRef.context=objRef.widgetNode.selectSingleNode("mb:context");
      if (objRef.context){
        alert("got context!");
        objRef.context=eval("config.objects."+objRef.context.firstChild.nodeValue);
      } else {
  		//alert("no context in AoiMetacatQuery widget.  using mainMap ");
  		objRef.context=eval("config.objects.mainMap");
  		/*
  		var nodes = objRef.widgetNode.childNodes;
      	for (var i=0; i<nodes.length; i++) {
      		alert(nodes.item(i).nodeType + " // " +
      		nodes.item(i).nodeName + " // " +
      		nodes.item(i).nodeValue);
  		}
  		*/
  	}
    }
    this.model.addListener( "loadModel", this.setMouseListener, this );
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Back.js
  
  Index: Back.js
  ===================================================================
  /*
  Author:       Steven Ottens AT geodan.nl
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is pressed the map will reload with it's original extent
   * @constructor
   * @base ButtonBase
   * @author Steven Ottens AT geodan.nl
   * @param widgetNode      The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function Back(widgetNode, model) {
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    /**
     * Replaces the current extent with the previous one in history
     * @param objRef      Pointer to this object.
     */
    this.doSelect = function(selected,objRef) {
      if (selected){
  
  		this.targetModel.setParam("historyBack");
        var previousExtent = objRef.targetModel.previousExtent;
        if(previousExtent){
          this.targetModel.setParam("historyStop");
          objRef.targetModel.extent.zoomToBox( previousExtent[0], previousExtent[1] );
          this.targetModel.setParam("historyStart");
        }
      }
    }
  }
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Button.js
  
  Index: Button.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * Generic Button object.  Set the <action> property in config for the controller
   * method to be called when selected
   * @base ButtonBase
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param widgetNode      The tool node from the Config XML file.
   * @param model  The ButtonBar widget.
   */
  function Button(widgetNode, model) {
    ButtonBase.apply(this, new Array(widgetNode, model));
  
  }
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Button.xsl
  
  Index: Button.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
    xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--
  Description: Convert Mapbuilder Config to a button image and link.  This stylesheet 
              takes a Button node from config as input.  The link executes two
              Javascript methods:
              - button.select() see ButtonBase
              - config.objects.$action where $action is a objectReference.method() 
                specified in config.
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  ButtonBar.xsl,v 1.5 2004/03/25 21:25:43 madair1 Exp
  -->
  
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    
    <!-- The common params set for all widgets -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="action"/>
    <xsl:param name="skinDir" select="/mb:MapbuilderConfig/mb:skinDir"/>
  
    <!-- Text params for this widget -->
    <xsl:param name="tooltip">set the tooltip property in WidgetText file</xsl:param>
    <xsl:param name="buttonText"/>
      
    <xsl:template match="*">
      <xsl:param name="linkUrl">javascript:config.objects.<xsl:value-of select="$widgetId"/>.select()<xsl:if test="$action">;config.objects.<xsl:value-of select="$action"/></xsl:if></xsl:param>
      <xsl:param name="imageID"><xsl:value-of select="@id"/>_image</xsl:param>
      <xsl:param name="imageSrc"><xsl:value-of select="mb:disabledSrc"/></xsl:param>
      <a href="{$linkUrl}" class="mbButton">
        <xsl:if test="string-length($imageSrc)>0"><img src="{$skinDir}{$imageSrc}" id="{$imageID}" title="{$tooltip}" border="0"/></xsl:if>
        <xsl:if test="string-length($buttonText)>0"><xsl:value-of select="$buttonText"/></xsl:if>
      </a>
    </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ButtonBase.js
  
  Index: ButtonBase.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Abstract base Button object that all Buttons extend.  
   * A Button is a widget which renders an image and an optional second image 
   * for the enabled state.
   * @constructor
   * @base WidgetBase
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param button Pointer to the button instance being created.
   * @param widgetNode The tool node from the Config XML file.
   * @param model The parent model object (optional).
   */
  function ButtonBase(widgetNode, model) {
  
    //stylesheet is fixed to this one
    this.stylesheet = new XslProcessor(baseDir+"/widget/Button.xsl");
    var buttonBarNode = widgetNode.selectSingleNode("mb:buttonBar");
    if ( buttonBarNode ) {
      this.htmlTagId = buttonBarNode.firstChild.nodeValue;
    } else {
      alert("buttonBar property required for object:" + widgetNode.nodeName );
    }
  
    WidgetBaseXSL.apply(this, new Array(widgetNode, model));
  
    //set the button type
    this.buttonType = widgetNode.selectSingleNode("mb:class").firstChild.nodeValue;
    if (this.buttonType == "RadioButton") this.enabled = false;
  
    //pre-load the button bar images; add them to the config
    var disabledImage = widgetNode.selectSingleNode("mb:disabledSrc");
    if (disabledImage) {
      this.disabledImage = document.createElement("img");
      this.disabledImage.src = config.skinDir + disabledImage.firstChild.nodeValue;
    }
  
    //optional second image to be displayed in the enabled state
    var enabledImage = widgetNode.selectSingleNode("mb:enabledSrc");
    if (enabledImage) {
      this.enabledImage = document.createElement("img");
      this.enabledImage.src = config.skinDir + enabledImage.firstChild.nodeValue;
    }
    
    // Check for cursor override
    var cursorNode = this.widgetNode.selectSingleNode("mb:cursor");
    if( cursorNode != null ) {
      var cursor = cursorNode.firstChild.nodeValue;
      this.cursor = cursor;
    } else {
      this.cursor = "default"; // Adding support for customized cursors
    }
  
    /**
     * Override of widgetBase prePaint to set the doc to be styled as the widget
     * node in config for this button.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      objRef.resultDoc = objRef.widgetNode;
    }
  
    /**
     * Override this in buttons which inherit from this object to carry out the action.
     * This is the function that will be called either when the button is selected
     * via the select() method or on a mouseup event if there is an associated 
     * mouseHandler property in config.
     */
    this.doAction = function() {}
  
    /**
     * Called when a user clicks on a this.  Switches the image to the enabled 
     * button source, enables and disables associated tools, then calls the 
     * doSelect method defined in derived classes.
     */
    this.select = function() {
    
      // Add support to change cursors in the map area based on:
      // either user selected cursor in config file using <cursor> tag
      // or default tool cursor as defined in constructor   
      var a = document.getElementById("mainMapContainer");
      if( a != null ) {
        // default or user selected cursor
        a.style.cursor = this.cursor;
      }  
         
      if (this.buttonType == "RadioButton") {
        if (this.node.selectedRadioButton) {
          with (this.node.selectedRadioButton) {
            if (disabledImage) image.src = disabledImage.src;
            enabled = false;
            if ( mouseHandler ) mouseHandler.enabled = false;
            link.className = "mbButton";
            doSelect(false,this);
          }
        }
        this.node.selectedRadioButton = this;
        if (this.enabledImage) this.image.src = this.enabledImage.src;
        this.link.className = "mbButtonSelected";
      }
      
      //enable this tool and any dependancies
      this.enabled = true;
      if ( this.mouseHandler ) this.mouseHandler.enabled = true;
      this.doSelect(true,this);
    }
  
    /**
     * Method overriden by subclasses
     * @param selected True when selected, false when deselected.
     * @param objRef Reference to this object.
     */
    this.doSelect = function(selected, objRef) {
    }
  
    //a button may be set as selected in the config file
    var selected = widgetNode.selectSingleNode("mb:selected");
    if (selected && selected.firstChild.nodeValue) this.selected = true;
  
    /**
     * A listener method to initialize the mouse handler, if configured.  This is
     * called as an init event so that the object pointed to is guaranteed to 
     * be instantiated.
     * @param objRef Reference to this object.
     */
    this.initMouseHandler = function(objRef) {
      /** Mouse handler which this tool will register listeners with. */
      var mouseHandler = objRef.widgetNode.selectSingleNode("mb:mouseHandler");
      if (mouseHandler) {
        objRef.mouseHandler = eval("config.objects." + mouseHandler.firstChild.nodeValue);
        if (!objRef.mouseHandler) {
          alert("error finding mouseHandler:"+mouseHandler.firstChild.nodeValue+" for button:"+objRef.id);
        }
      } else {
        objRef.mouseHandler = null;
      }
    }
  
    /**
     * Initialise image for the button and select it if required.
     * @param objRef Reference to this object.
     */
    this.buttonInit = function(objRef) {
      objRef.image = document.getElementById( objRef.id+"_image" );
      objRef.link = document.getElementById( objRef.outputNodeId );
      if (objRef.selected) objRef.select();
    }
  
    this.model.addListener("refresh",this.buttonInit,this);
    this.model.addListener("init", this.initMouseHandler, this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/CatSearchForm.js
  
  Index: CatSearchForm.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display a form for input of parameters to generate a web service 
   * request.  This JS object handles the form submit via HTTP Get by appending 
   * a query string to the form's action URL.  The query string is created from
   * all input elements and their values.
   * The target model is then loaded from the URL created.
   * A stylehseet must be specified as a property in config for this widget.  
   * See widget/NtsForm.xsl for an example. 
   *
   * @constructor
   * @base WidgetBase
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function OWSCatSearchForm(widgetNode, model) {
    WidgetBaseXSL.apply(this, new Array(widgetNode, model));
  
    /**
     * Refreshes the form onblur handlers when this widget is painted.
     * @param objRef Pointer to this CurorTrack object.
     */
    this.postPaint = function(objRef) {
      objRef.searchForm = document.getElementById(objRef.formName);
      objRef.searchForm.parentWidget = objRef;
  
      objRef.searchForm.westCoord.onblur = objRef.setAoi;
      objRef.searchForm.northCoord.onblur = objRef.setAoi;
      objRef.searchForm.eastCoord.onblur = objRef.setAoi;
      objRef.searchForm.southCoord.onblur = objRef.setAoi;
      objRef.searchForm.westCoord.model = objRef.model;
      objRef.searchForm.northCoord.model = objRef.model;
      objRef.searchForm.eastCoord.model = objRef.model;
      objRef.searchForm.southCoord.model = objRef.model;
  
  
  
      objRef.searchForm.onkeypress = objRef.handleKeyPress;
      objRef.searchForm.onsubmit = objRef.submitForm;
      //objRef.searchForm.mapsheet.onblur = objRef.setMapsheet;
    }
  
    /**
     * Output the AOI coordinates to the associated form input elements.  This
     * method is registered as an AOI listener on the context doc.
     * @param objRef Pointer to this searchForm object.
     */
    this.displayAoiCoords = function(objRef) {
      objRef.searchForm = document.getElementById(objRef.formName);
      var aoi = objRef.model.getParam("aoi");
      objRef.searchForm.westCoord.value = aoi[0][0];
      objRef.searchForm.northCoord.value = aoi[0][1];
      objRef.searchForm.eastCoord.value = aoi[1][0];
      objRef.searchForm.southCoord.value = aoi[1][1];
    }
    this.model.addListener('aoi', this.displayAoiCoords, this);
  
    /**
     * Handles user input from the form element.  This is an onblur handler for 
     * the input elements.
     */
    this.setAoi = function() {
      var aoi = this.model.getParam("aoi");
      if (aoi) {
        var ul = aoi[0];
        var lr = aoi[1];
        switch(this.name) {
          case 'westCoord':
            ul[0] = this.value;
            break;
          case 'northCoord':
            ul[1] = this.value;
            break;
          case 'eastCoord':
            lr[0] = this.value;
            break;
          case 'southCoord':
            lr[1] = this.value;
            break;
        }
        this.model.setParam("aoi",new Array(ul,lr) );
      }
    }
  
  /**
   * Change the AOI coordinates from select box choice of prefined locations
   * @param bbox the bbox value of the location keyword chosen
   */
    this.setLocation = function(bbox) {
      var bboxArray = new Array();
      bboxArray     = bbox.split(",");
      var ul = new Array(parseFloat(bboxArray[0]),parseFloat(bboxArray[2]));
      var lr = new Array(parseFloat(bboxArray[1]),parseFloat(bboxArray[3]));
      this.model.setParam("aoi",new Array(ul,lr));
  
      //convert this.model XY to latlong
      //convert latlong to targetmodel XY
      //extent.setAoi takes XY as input
      //this.targetModel.setParam("aoi", new Array(ul,lr));
      //this.targetModel.setParam("mouseup",this);
    }
  
  
    /**
     * Handles submission of the form (via javascript in an <a> tag)
     */
    this.submitForm = function() {
      thisWidget = this.parentWidget;
      thisWidget.webServiceForm = document.getElementById(thisWidget.formName);
      //thisWidget.targetModel.setParam("filter",filter);
      thisWidget.targetModel.setParam("wfs_GetFeature","service_resources");
      return false;
    }
  
    /**
     * handles keypress events to filter out everything except "enter".  
     * Pressing the "enter" key will trigger a form submit
     * @param event  the event object passed in for Mozilla; IE uses window.event
     */
    this.handleKeyPress = function(event) {
      var keycode;
      var target;
      if (event){
        //Mozilla
        keycode=event.which;
        target=event.currentTarget;
      }else{
        //IE
        keycode=window.event.keyCode;
        target=window.event.srcElement.form;
      }
  
      if (keycode == 13) {    //enter key
        target.parentWidget.submitForm();
        return false;
      }
    }
  
    var RUC_Window=null;
    this.openRucWindow = function( rucType ) { 
      if ( RUC_Window == null || RUC_Window.closed ) { 
        var baseUrl;
        var params;
        switch(rucType) {
          case "placename":
            baseURL = "/rucs/placeName.html?language=" + config.lang + "&formName=" + this.formName;
            params = "width=290,height=480,scrollbars=0,toolbar=0,location=0,directories=0,status=0,menubar=0,resizable=0";
            break;
          case "postalCode":
            baseURL = "/rucs/postalCode.html?language=" + config.lang + "&formName=" + this.formName;
            params = "width=280,height=180,scrollbars=0,toolbar=0,location=0,directories=0,status=0,menubar=0,resizable=0";
            break;
          default:
            alert("unkown RUC type");
            break;
        }
        RUC_Window = open( baseURL, "RUCWindow", params );
      }
      RUC_Window.focus();
      return false;
    } 
    function RUC_closeRUCWindow() { 
      if ( RUC_Window != null && !RUC_Window.closed ) { 
        RUC_Window.close();
      } 
    } 
  
    //set some properties for the form output
    this.formName = "WebServiceForm_" + mbIds.getId();
    this.stylesheet.setParameter("formName", this.formName);
  }
  
    /**
     */
    SetAoiCoords = function(aoiBox) {
      config.objects.mainMap.setParam("aoi",aoiBox );
    }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/CatSearchForm.xsl
  
  Index: CatSearchForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parses an listing of OGC services from the Discovery Portal registry
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  		xmlns:ogc="http://www.opengis.net/ogc"
  		xmlns:gml="http://www.opengis.net/gml"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelTitle"/>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="targetModelId"/>
    <xsl:param name="targetModel"/>
    <xsl:param name="lang">en</xsl:param>
    
    <xsl:param name="webServiceUrl">http://devgeo.cciw.ca/cgi-bin/mapserv/owscat</xsl:param>
    <xsl:param name="formName">owsCatSearch</xsl:param>
    <xsl:param name="searchConfigDoc" select="document('searchConfig.xml')"/>  
    <xsl:param name="selectSize" select="1"/>
    
    <!-- Text params for this widget -->
    <xsl:param name="north">North</xsl:param>
    <xsl:param name="south">South</xsl:param>
    <xsl:param name="east">East</xsl:param>
    <xsl:param name="west">West</xsl:param>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/">
      <div>
      <form name="{$formName}" id="{$formName}" method="get">
        <input type="hidden" name="version" value="1.0.0"/>
        <input type="hidden" name="service" value="WFS"/>
        <input type="hidden" name="request" value="GetFeature"/>
        <input type="hidden" name="typename" value="service_resources"/>
        <input type="hidden" name="outputFormat" value="GML3"/>
        
        <h3>Keywords</h3>
        <input type="text" name="keywords"/>
        <h3>Location</h3>
        <xsl:call-template name="locations">
          <xsl:with-param name="locationsDoc" select="$searchConfigDoc"/>
        </xsl:call-template>
        <!--xsl:call-template name="rucs"/-->
        <xsl:call-template name="aoiBox"/>
        <!--xsl:call-template name="ntsInput"/-->
        <h3>Service Type</h3>
        <select name="serviceType">
          <option></option>
          <option>WMS</option>
          <option>WFS</option>
        </select>
        <input class="button" type="reset"/>
        <input class="button" type="submit"/>
        
      </form>
      </div>
    </xsl:template>
  
    <xsl:template name="locations">
      <xsl:param name="locationsDoc"/>
      <DIV>
        <select name="locations" onchange="config.objects.{$widgetId}.setLocation(this.options[this.selectedIndex].value);" size="{$selectSize}">
          <xsl:apply-templates select="$locationsDoc/searchConfig[@entryType='productCollection']/locations/location"/>
        </select>
      </DIV>
    </xsl:template>
    
    <xsl:template match="location">
      <xsl:param name="indent"/>
      <xsl:variable name="bbox" select="translate(wens,' ',',')"/>
      <option value="{$bbox}"><xsl:value-of select="$indent"/><xsl:value-of select="title[@lang=$lang]"/></option>
      <xsl:apply-templates select="location">
        <xsl:with-param name="indent"><xsl:value-of select="$indent"/>&#160;&#160;</xsl:with-param>
      </xsl:apply-templates>
    </xsl:template>
    
    <xsl:template name="rucs">
      <p>
        or 
        <a class="button" onclick="config.objects.{$widgetId}.openRucWindow('placename' );return false;">Select by placename</a>
        or
        <a class="button" onclick="config.objects.{$widgetId}.openRucWindow('postalCode' );return false;">Select by postal code</a>
      </p>
    </xsl:template>
    
    <xsl:template name="aoiBox">
      <p>
        <table>
          <tr>
            <td align="left">or enter</td>
            <td><xsl:value-of select="$north"/></td>
            <td><xsl:value-of select="$south"/></td>
            <td><xsl:value-of select="$east"/></td>
            <td><xsl:value-of select="$west"/></td>
          </tr>
          <tr>
            <td>
            </td>
            <td>
              <input name="northCoord" type="text" size="10" class="searchInput"/>
            </td>
            <td>
              <input name="southCoord" type="text" size="10" class="searchInput"/>
            </td>
            <td>
              <input name="eastCoord" type="text" size="10"  class="searchInput"/>
            </td>
            <td>
              <input name="westCoord" type="text" size="10" class="searchInput"/>
            </td>
          </tr>
        </table>
      </p>
    </xsl:template>
    
    <xsl:template name="ntsInput">
      <p>or enter NTS mapsheet index
        <input name="ntsIndex" type="text" size="6" class="searchInput"/>
      </p>
    </xsl:template>
   
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/CdnWatershedForm.xsl
  
  Index: CdnWatershedForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Output a form for display of the context doc AOI
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- Text params for this widget -->
    <xsl:param name="watershedTitle">Canadian Watershed Lookup service</xsl:param>
    <xsl:param name="watershedCode">Watershed code</xsl:param>
  
    <!-- The name of the form for coordinate output -->
    <xsl:param name="webServiceUrl">http://devgeo.cciw.ca:8080/WatershedLookupServlet/WatershedLookupServlet</xsl:param>
    <xsl:param name="formName">WatershedForm</xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/">
      <div>
      <form name="{$formName}" id="{$formName}" method="get" action="{$webServiceUrl}">
        <input name="request" type="hidden" value="GetWatershed"/>
        <input name="version" type="hidden" value="1.0.0"/>
      
        <table>
          <tr>
            <th align="left" colspan="3">
              <xsl:value-of select="$watershedTitle"/>
            </th>
          </tr>
          <tr>
            <td>
              <xsl:value-of select="$watershedCode"/>
            </td>
            <td>
              <input name="code" type="text" size="10" value="01E"/>
            </td>
            <td>
              <!--input type="submit"/-->
              <a href="javascript:config.objects.{$widgetId}.submitForm();">load web service data</a>
            </td>
          </tr>
        </table>
      </form>
      </div>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/CollectionList.js
  
  Index: CollectionList.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronAtshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * A widget to display a list of context docs to pick from.  This is a view of 
   * a Context Collection as specified in the OGC Context specification.
   * @constructor
   * @base WidgetBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  
  function CollectionList(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/CollectionList.xsl
  
  Index: CollectionList.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parses an OGC context collection document to generate a context pick list
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xlink="http://www.w3.org/1999/xlink"
      exclude-result-prefixes="wmc xlink">
  
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8"/>
    <xsl:strip-space elements="*"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
  
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="jsfunction">config.loadModel('</xsl:param>
    <xsl:param name="targetModel"/>
  
    <!-- template rule matching source root element -->
    <xsl:template match="/wmc:ViewContextCollection">
  
      <ul>
        <xsl:apply-templates select="wmc:ViewContextReference"/>
      </ul>
  
    </xsl:template>
  
    <xsl:template match="wmc:ViewContextReference">
      <xsl:param name="linkUrl">javascript:<xsl:value-of select="$jsfunction"/><xsl:value-of select="$targetModel"/>','<xsl:value-of select="wmc:ContextURL/wmc:OnlineResource/@xlink:href"/>')</xsl:param>
      <li>    
        <a href="{$linkUrl}">
          <xsl:choose>
            <xsl:when test="wmc:Title/@xml:lang">              
              <xsl:value-of select="wmc:Title[@xml:lang=$lang]"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="wmc:Title"/>
            </xsl:otherwise>
          </xsl:choose>
        </a>
      </li>    
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/CursorTrack.js
  
  Index: CursorTrack.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  
  /**
   * Widget to display the mouse coordinates when it is over a MapContainer widget.
   *
   * @constructor
   * @base WidgetBase
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function CursorTrack(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    //by default, display coords in latlon; if false show map XY
    this.showPx 	  = false;		// pixel coordinates
    this.showXY 	  = false;		// XY Coordinates
    this.showLatLong = true;		// Standard lat long
    this.showDMS	  = false;		// Lat/long in DD MM SS format
    this.showMGRS 	  = false;		// Military Grid Reference System
    this.precision   = 2;
  	
    var showXYNode = widgetNode.selectSingleNode("mb:showXY");
    if (showXYNode) 
    	this.showXY = (showXYNode.firstChild.nodeValue=="false")?false:true;
    
    var showPx = widgetNode.selectSingleNode("mb:showPx");
    if( showPx )
    	this.showPx = (showPx.firstChild.nodeValue=="false")?false:true;
  
    var showLatLong = widgetNode.selectSingleNode("mb:showLatLong");
    if( showLatLong )
    	this.showLatLong = (showLatLong.firstChild.nodeValue=="false")?false:true;
  
    var showDMS = widgetNode.selectSingleNode("mb:showDMS");
    if( showDMS )
    	this.showDMS = (showDMS.firstChild.nodeValue=="false")?false:true;
  
    var showMGRS = widgetNode.selectSingleNode("mb:showMGRS");
    if( showMGRS ) {
    	this.showMGRS = (showMGRS.firstChild.nodeValue=="false")?false:true;
    	// load this here so it is not required for everyone
    	mapbuilder.loadScript(baseDir+"/util/MGRS.js");
    }
    
    var precision = widgetNode.selectSingleNode("mb:precision");
    if (precision) 
      this.precision = precision.firstChild.nodeValue;
    
    /**
     * Start cursor tracking when the mouse is over the MapContainer.
     * set an interval to output the coords so that it doesn't execute on every
     * move event.  The setInterval method in IE doesn't allow passing of an
     * argument to the function called so set a global reference to MapContainer
     * here;  mouse can only be over one MapContainer at time so this should be safe.
     * @param objRef Pointer to this CurorTrack object.
     * @param targetNode The node for the enclosing HTML tag for this widget.
     */
    this.mouseOverHandler = function(objRef, targetNode) {
      objRef.coordForm = document.getElementById(objRef.formName);
      window.cursorTrackObject = objRef;
      window.cursorTrackNode = targetNode;
      objRef.mouseOver = true;
      objRef.mouseTrackTimer = setInterval( ReportCoords, 100, objRef);
    }
  
    /**
     * Stop cursor tracking when the mouse leaves the MapContainer.
     * @param objRef Pointer to this CurorTrack object.
     * @param targetNode The node for the enclosing HTML tag for this widget.
     */
    this.mouseOutHandler = function(objRef, targetNode) {
      
      if (objRef.mouseTrackTimer) 
      		clearInterval(objRef.mouseTrackTimer);
      
      objRef.mouseOver = false;
      
      if( objRef.showLatLong ) {
        if( objRef.coordForm.longitude )
          objRef.coordForm.longitude.value = "";
    	    if( objRef.coordForm.latitude )
          objRef.coordForm.latitude.value = "";
      } 
  
      if( objRef.showDMS ) {
        if( objRef.coordForm.longdeg )
          objRef.coordForm.longdeg.value = "";
        if( objRef.coordForm.longmin )
          objRef.coordForm.longmin.value = "";
        if( objRef.coordForm.longsec )
          objRef.coordForm.longsec.value = "";
  
        if( objRef.coordForm.latdeg )
          objRef.coordForm.latdeg.value = "";
        if( objRef.coordForm.latmin )
          objRef.coordForm.latmin.value = "";
        if( objRef.coordForm.latsec )
          objRef.coordForm.latsec.value = "";
      } 
      
      if( objRef.showXY ) {
      	  if( objRef.coordForm.x)
          objRef.coordForm.x.value = "";
        if( objRef.coordForm.y)
          objRef.coordForm.y.value = "";
      }
      
      if( objRef.showPx ) {
        if( objRef.coordForm.px)
          objRef.coordForm.px.value = "";
        if( objRef.coordForm.py)
          objRef.coordForm.py.value = "";
      }
      
      if( objRef.showMGRS ) {
        if( objRef.coordForm.mgrs )
          objRef.coordForm.mgrs.value = "";
      }
    }
  
    /**
     * Add mouse event listeners to the MapContainer object sepecified by the
     * mouseHandler property in config.
     * @param objRef Pointer to this CurorTrack object.
     */
    this.init = function(objRef) {
      //associate the cursor track with a mappane widget
      var mouseHandler = widgetNode.selectSingleNode("mb:mouseHandler");
      if (mouseHandler) {
        objRef.mouseHandler = eval("config.objects."+mouseHandler.firstChild.nodeValue);
        objRef.mouseHandler.addListener('mouseover', objRef.mouseOverHandler, objRef);
        objRef.mouseHandler.addListener('mouseout', objRef.mouseOutHandler, objRef);
      } else {
        alert('CursorTrack requires a mouseHandler property');
      }
      
      if( objRef.showLatLong || objRef.showDMS || objRef.showMGRS ) {
        objRef.proj = new Proj( objRef.model.getSRS() );
      }
  
      if( this.showMGRS )
        this.MGRS = new MGRS();
    }
    
    this.model.addListener("loadModel", this.init, this );
  
    //set some properties for the form output
    this.formName = "CursorTrackForm_" + mbIds.getId();
    this.stylesheet.setParameter("formName", this.formName);
  
  }
  
  /**
    * Decimal to DMS conversion
    */
  function convertDMS(coordinate, type) {
  
      coordinate = Math.floor(coordinate*100);
      coordinate = coordinate/100;
  
      abscoordinate = Math.abs(coordinate)
      coordinatedegrees = Math.floor(abscoordinate);
  
      coordinateminutes = (abscoordinate - coordinatedegrees)/(1/60);
      tempcoordinateminutes = coordinateminutes;
      coordinateminutes = Math.floor(coordinateminutes);
      coordinateseconds = (tempcoordinateminutes - coordinateminutes)/(1/60);
      coordinateseconds =  Math.floor(coordinateseconds);
  
    if (type == 'LAT') {
      if (coordinate >= 0) {
        coordinatehemi = "N";
      } else {
        coordinatehemi = "S";
      }
    } else if (type == 'LON') {
      if (coordinate >= 0) {
        coordinatehemi = "E";
      } else {
        coordinatehemi = "W";
      }
    }
    if( coordinatedegrees < 10 )
      coordinatedegrees = "0" + coordinatedegrees;
      
    if( coordinateminutes < 10 )
      coordinateminutes = "0" + coordinateminutes;
      
    if( coordinateseconds < 10 )
      coordinateseconds = "0" + coordinateseconds;
      
    coordinate = coordinatedegrees + " " + coordinateminutes + " " + coordinateseconds + " " + coordinatehemi;
  
    return coordinate;       
  }
  
  /**
   * A method which actually outputs the coordinates to the form.  This is a
   * global method because it is called by a Javascript setInterval timer.
   */
  function ReportCoords() {
    var objRef = window.cursorTrackObject;
    
    if (objRef.mouseOver) {
      var evPL =  window.cursorTrackNode.evpl;
  
  	// capture the pixel coordinates
  	if( objRef.showPx ) {    
        if( objRef.coordForm.px )
          objRef.coordForm.px.value = evPL[0];
  
        if( objRef.coordForm.py )
          objRef.coordForm.py.value = evPL[1];
      }
      
      // capture XY coordinates
      var evXY = objRef.model.extent.getXY( evPL );
      
      // store them
      if( objRef.showXY ) {
        if( objRef.coordForm.x )
          objRef.coordForm.x.value = evXY[0].toFixed(objRef.precision);;
        if( objRef.coordForm.y )
          objRef.coordForm.y.value = evXY[1].toFixed(objRef.precision);;
      }
      
      if( objRef.showLatLong || objRef.showDMS || objRef.showMGRS ) {
  	    var evLatLon = objRef.proj.Inverse( evXY );   //convert to lat/long
  	    
          if( objRef.showLatLong ) {
  	      if( objRef.coordForm.longitude )
  	        objRef.coordForm.longitude.value = evLatLon[0].toFixed(objRef.precision);
  	    
  	      if( objRef.coordForm.latitude )
  	        objRef.coordForm.latitude.value = evLatLon[1].toFixed(objRef.precision);
  	    }
          
          if( objRef.showDMS ) {
            var longitude = convertDMS(evLatLon[0], 'LON').split(" ");
            if( objRef.coordForm.longdeg )
              objRef.coordForm.longdeg.value = longitude[0];          
            if( objRef.coordForm.longmin )
              objRef.coordForm.longmin.value = longitude[1];
            if( objRef.coordForm.longsec )
              objRef.coordForm.longsec.value = longitude[2];           
           if( objRef.coordForm.longH )
              objRef.coordForm.longH.value = longitude[3];
  
            var latitude = convertDMS(evLatLon[1], 'LAT').split(" ");
            if( objRef.coordForm.latdeg )
              objRef.coordForm.latdeg.value = latitude[0];          
            if( objRef.coordForm.latmin )
              objRef.coordForm.latmin.value = latitude[1];
            if( objRef.coordForm.latsec )
              objRef.coordForm.latsec.value = latitude[2];
            if( objRef.coordForm.latH )
              objRef.coordForm.latH.value = latitude[3];
          }
          
  	    if( objRef.showMGRS ) {
  	      if( !objRef.MGRS )
  	        objRef.MGRS = new MGRS();
            objRef.coordForm.mgrs.value = objRef.MGRS.convert(evLatLon[1],evLatLon[0]) ;
          }
        }
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/CursorTrack.xsl
  
  Index: CursorTrack.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Output a form for display of the cursor coordinates
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    
    <!-- text value params -->
    <xsl:param name="longitude">lon:</xsl:param>
    <xsl:param name="latitude">lat:</xsl:param>
    <xsl:param name="xcoord">x:</xsl:param>
    <xsl:param name="ycoord">y:</xsl:param>
    <xsl:param name="showXY">false</xsl:param>
    <xsl:param name="showDMS">false</xsl:param>
    <xsl:param name="showMGRS">false</xsl:param>
    <xsl:param name="showPx">false</xsl:param>
    <xsl:param name="showLatLong">true</xsl:param>
    
    <!-- The name of the form for coordinate output -->
    <xsl:param name="formName"/>
  
    <!-- Main html -->
    <xsl:template match="/">
      <div>
      <form name="{$formName}" id="{$formName}">
        
          <xsl:if test="$showXY='true'">
            <xsl:value-of select="$xcoord"/> <input name="x" type="text" size="8" readonly="readonly"/>
            <xsl:value-of select="$ycoord"/> <input name="y" type="text" size="8" readonly="readonly"/>
          </xsl:if>
          
          <xsl:if test="$showPx='true'">
            <xsl:value-of select="$xcoord"/> <input name="px" type="text" size="8" readonly="readonly"/>
            <xsl:value-of select="$ycoord"/> <input name="py" type="text" size="8" readonly="readonly"/>
          </xsl:if>
          
          <xsl:if test="$showDMS='true'">
            <xsl:value-of select="$longitude"/> 
            <input name="longdeg" type="text" size="3" readonly="readonly"/>&#176;
            <input name="longmin" type="text" size="2" readonly="readonly"/>&quot;
            <input name="longsec" type="text" size="2" readonly="readonly"/>&apos;
            <input name="longH" type="text" size="1" readonly="readonly"/>&#8195;
  
            <xsl:value-of select="$latitude"/> 
             <input name="latdeg" type="text" size="2" readonly="readonly"/>&#176;
             <input name="latmin" type="text" size="2" readonly="readonly"/>&quot;
             <input name="latsec" type="text" size="2" readonly="readonly"/>&apos;
             <input name="latH" type="text" size="1" readonly="readonly"/>
           </xsl:if>
  
          <xsl:if test="$showLatLong='true'">
            <xsl:value-of select="$longitude"/> <input name="longitude" type="text" size="8" readonly="readonly"/>
            <xsl:value-of select="$latitude"/> <input name="latitude" type="text" size="8" readonly="readonly"/>
          </xsl:if>
   
          <xsl:if test="$showMGRS='true'">
            MGRS: <input name="mgrs" type="text" size="14" readonly="readonly"/>
          </xsl:if>
       
      </form>
      </div>
    </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/DeleteFeature.js
  
  Index: DeleteFeature.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is pressed a WFS-T DeleteFeature transaction will be started.
   * @constructor
   * @base ButtonBase
   * @author Cameron Shorter
   * @param widgetNode The widget node from the Config XML file.
   * @param model The model for this widget
   */
  function DeleteFeature(widgetNode, model) {
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model));
    
    // override default cursor by user
    // cursor can be changed by spefying a new cursor in config file
    this.cursor = "default"; 
  
    this.trm=widgetNode.selectSingleNode("mb:transactionResponseModel").firstChild.nodeValue;
    this.tm=widgetNode.selectSingleNode("mb:targetModel").firstChild.nodeValue;
    this.tc=widgetNode.selectSingleNode("mb:targetContext").firstChild.nodeValue;
  
    this.httpPayload=new Object();
    this.httpPayload.url=widgetNode.selectSingleNode("mb:webServiceUrl").firstChild.nodeValue;
    this.httpPayload.method="post";
  
    /** Xsl to convert Feature into a WFS Transaction Delete. */
    this.deleteXsl=new XslProcessor(baseDir+"/tool/xsl/wfs_Delete.xsl");
  
    /**
     * Start a WFS-T DeleteFeature transaction.
     * @param objRef Pointer to this object.
     */
    this.doSelect = function(selected,objRef) {
      if (selected){
        // Model that will be populated with the WFS response.
        if (!objRef.transactionResponseModel){
          objRef.transactionResponseModel=eval("config.objects."+objRef.trm);
          objRef.transactionResponseModel.addListener("loadModel",objRef.handleResponse, objRef);
        }
        if (!objRef.targetModel){
          objRef.targetModel=eval("config.objects."+objRef.tm);
        }
        if (!objRef.targetContext){
          objRef.targetContext=eval("config.objects."+objRef.tc);
        }
        fid=objRef.targetModel.getXpathValue(objRef.targetModel,"//@fid");
        //if fid exists, then we are deleting an existing feature.
        if (objRef.targetModel.doc && fid){
          s=objRef.deleteXsl.transformNodeToObject(objRef.targetModel.doc);
          objRef.httpPayload.postData=s;
          objRef.transactionResponseModel.newRequest(objRef.transactionResponseModel,objRef.httpPayload);
        }else alert("No feature available to delete");
      }
    }
  
    /**
     * If transaction was sucessful, refresh the map and remove contents of
     * FeatureList.  This function is called after the TransactionResponseModel
     * has been updated.
     * @param objRef Pointer to this object.
     */
    this.handleResponse=function(objRef){
      sucess=objRef.transactionResponseModel.doc.selectSingleNode("//wfs:TransactionResult/wfs:Status/wfs:SUCCESS");
      if (sucess){
        // Remove FeatureList if feature entry was successful.
        httpPayload=new Object();
        httpPayload.url=null;
        objRef.targetModel.newRequest(objRef.targetModel,httpPayload);
        // Repaint the WMS layers
        objRef.targetContext.callListeners("refreshWmsLayers");
      }
    }
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/DragPan.js
  
  Index: DragPan.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is selected, click and drag on the MapPane to recenter the map.
   * @constructor
   * @base ButtonBase
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param widgetNode  The widget node from the Config XML file.
   * @param model  The parent model for this widget
   */
  function DragPan(widgetNode, model) {
  
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    // override default cursor by user
    // cursor can be changed by spefying a new cursor in config file
    this.cursor = "move";	
  
    /**
     * Calls the centerAt method of the context doc extent to recenter to its AOI
     * @param objRef      Pointer to this DragPan object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        var bbox = objRef.targetModel.getParam("aoi");
        if ( objRef.targetModel.getParam("aoi")!=null) {
          var extent = objRef.targetModel.extent;
          var ul = bbox[0];
          var lr = bbox[1];
          if ( ( ul[0]==lr[0] ) && ( ul[1]==lr[1] ) ) {
            extent.centerAt( ul, extent.res[0]/objRef.zoomBy );
          } else {
            extent.zoomToBox( ul, lr );
          }
        }
      }
    }
  
    /**
     * Register for mouseUp events.
     * @param objRef      Pointer to this DragPan object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.mouseHandler) {
        objRef.mouseHandler.model.addListener('mouseup',objRef.doAction,objRef);
      }
    }
    this.model.addListener( "refresh", this.setMouseListener, this );
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/EditButtonBase.js
  
  Index: EditButtonBase.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * Base class for tools which update GML by clicking on the mapPane.
   * @constructor
   * @base ButtonBase
   * @author Cameron Shorter cameronATshorter.net
   * @param widgetNode The node from the Config XML file.
   * @param model  The ButtonBar widget.
   */
  function EditButtonBase(widgetNode, model) {
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    // override default cursor by user
    // cursor can be changed by specifying a new cursor in config file
    this.cursor = "crosshair"; 
  
    this.trm=widgetNode.selectSingleNode("mb:transactionResponseModel");
    if(this.trm)this.trm=this.trm.firstChild.nodeValue;
  
    /** Empty GML to load when this tool is selected. */
    this.defaultModelUrl=widgetNode.selectSingleNode("mb:defaultModelUrl").firstChild.nodeValue;
  
    /** Reference to GML node to update when a feature is added. */
    this.featureXpath=widgetNode.selectSingleNode("mb:featureXpath").firstChild.nodeValue;
  
    /**
     * If tool is selected and the Edit Tool has changed (eg, changed from
     * LineEdit to PointEdit) then load new default feature.
     * This function is called when a tool is selected or deselected.
     * @param objRef Pointer to this object.
     * @param selected True when selected.
     */
    this.doSelect = function(selected,objRef) {
      // Model that will be populated with the WFS response.
      if (objRef.trm && !objRef.transactionResponseModel){
        objRef.transactionResponseModel=eval("config.objects."+objRef.trm);
      }
      // Load default feature.
      if (objRef.enabled && selected && objRef.targetModel.url!=objRef.defaultModelUrl){
        objRef.loadDefaultModel(objRef);
      }
      // Remove the transactionResponseModel (and result of last transaction)
      // when a transaction button is deselected
      if(!selected && objRef.transactionResponseModel){
        objRef.transactionResponseModel.setModel(objRef.transactionResponseModel,null);
      }
    }
  
    /**
     * Load the defaultModel into the targetModel.
     */
    this.loadDefaultModel=function(objRef){
      objRef.targetModel.url=objRef.defaultModelUrl;
      // load default GML
      var httpPayload=new Object();
      httpPayload.url=objRef.defaultModelUrl;
      httpPayload.method="get";
      httpPayload.postData=null;
      objRef.targetModel.newRequest(objRef.targetModel,httpPayload);
     }
    /**
     * Register for mouseup events, called after model loads.
     * @param objRef Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.mouseHandler) {
        objRef.mouseHandler.model.addListener('mouseup',objRef.doAction,objRef);
      }
    }
  
    /**
     * Set the loadModel listener in response to init event
     * @param objRef Pointer to this object.
     */
    this.initButton = function(objRef) {
      objRef.targetModel.addListener("loadModel",objRef.setMouseListener, objRef);
    }
  
    this.model.addListener("init",this.initButton, this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/EditLine.js
  
  Index: EditLine.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/EditButtonBase.js");
  
  /**
   * When this button is selected, clicks on the MapPane will add a
   * new point to a line.
   * @constructor
   * @base EditButtonBase
   * @author Cameron Shorter cameronATshorter.net
   * @param widgetNode The from the Config XML file.
   * @param model  The ButtonBar widget.
   */
  function EditLine(widgetNode, model) {
    // Extend EditButtonBase
    EditButtonBase.apply(this, new Array(widgetNode, model));
  
    /**
     * Append a point to a line.
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        point=objRef.mouseHandler.model.extent.getXY(targetNode.evpl);
        old=objRef.targetModel.getXpathValue(
          objRef.targetModel,
          objRef.featureXpath);
        if(!old){old=""};
        sucess=objRef.targetModel.setXpathValue(
          objRef.targetModel,
          objRef.featureXpath,
          old+" "+point[0]+","+point[1]);
        if(!sucess){
          alert("EditLine: invalid featureXpath in config: "+objRef.featureXpath);
        }
      }
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/EditLine_1.js
  
  Index: EditLine_1.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is selected, clicks on the MapPane will add a
   * new point to a line.
   * @constructor
   * @base EditButtonBase
   * @author Cameron Shorter cameronATshorter.net
   * @param widgetNode The from the Config XML file.
   * @param model  The ButtonBar widget.
   */
  function EditLine_1(widgetNode, model) {
    // Extend EditButtonBase
    var base = new ButtonBase(this, widgetNode, model);
  
    /** Reference to GML node to update when a feature is added. */
    this.featureXpath=widgetNode.selectSingleNode("mb:featureXpath").firstChild.nodeValue;
  
    /**
     * Append a point to a line.
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        point=objRef.targetModel.containerModel.extent.getXY(targetNode.evpl);
        old=objRef.targetModel.getXpathValue(
          objRef.targetModel,
          objRef.targetModel.nodeSelectXpath+objRef.featureXpath);
        if(!old){old=""};
        sucess=objRef.targetModel.setXpathValue(
          objRef.targetModel,
          objRef.targetModel.nodeSelectXpath+objRef.featureXpath,
          old+" "+point[0]+","+point[1]);
        if(!sucess){
          alert("EditLine: invalid featureXpath in config: "+objRef.targetModel.nodeSelectXpath+objRef.featureXpath);
        }
      }
    }
  
    /**
     * Register for mouseUp events.
     * @param objRef  Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.targetModel.containerModel) {
        objRef.targetModel.containerModel.addListener('mouseup',objRef.doAction,objRef);
      }
    }
    config.addListener( "loadModel", this.setMouseListener, this );
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/EditPoint.js
  
  Index: EditPoint.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/EditButtonBase.js");
  
  /**
   * When this button is selected, clicks on the MapPane will add a
   * new point to a model.
   * Requires an enclosing GML model.
   * @constructor
   * @base EditButtonBase
   * @author Cameron Shorter cameronATshorter.net
   * @param widgetNode The node from the Config XML file.
   * @param model  The ButtonBar widget.
   */
  function EditPoint(widgetNode, model) {
    // Extend EditButtonBase
    EditButtonBase.apply(this, new Array(widgetNode, model));
  
    /**
     * Add a point to the enclosing GML model.
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        point=objRef.mouseHandler.model.extent.getXY(targetNode.evpl);
        sucess=objRef.targetModel.setXpathValue(
          objRef.targetModel,
          objRef.featureXpath,point[0]+","+point[1]);
        if(!sucess){
          alert("EditPoint: invalid featureXpath in config: "+objRef.featureXpath);
        }
      }
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/EditPoint_1.js
  
  Index: EditPoint_1.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is selected, clicks on the MapPane will add a
   * new point to a model.
   * Requires an enclosing GML model.
   * @constructor
   * @base EditButtonBase
   * @author Cameron Shorter cameronATshorter.net
   * @param widgetNode The node from the Config XML file.
   * @param model  The ButtonBar widget.
   */
  function EditPoint_1(widgetNode, model) {
    // Extend EditButtonBase
    var base = new ButtonBase(this, widgetNode, model);
  
    /**
     * Add a point to the enclosing GML model.
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        point=objRef.targetModel.containerModel.extent.getXY(targetNode.evpl);
        sucess=objRef.targetModel.setXpathValue(
          objRef.targetModel,
          objRef.targetModel.nodeSelectXpath,point[0]+","+point[1]);
        if(!sucess){
          alert("EditPoint: invalid featureXpath in config: "+objRef.targetModel.nodeSelectXpath);
        }
      }
    }
  
    /**
     * Register for mouseUp events.
     * @param objRef  Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.targetModel.containerModel) {
        objRef.targetModel.containerModel.addListener('mouseup',objRef.doAction,objRef);
      }
    }
    config.addListener( "loadModel", this.setMouseListener, this );
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/EditPolygon.js
  
  Index: EditPolygon.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/EditButtonBase.js");
  
  /**
   * When this button is selected, clicks on the MapPane will add a
   * new point to a polygon.
   * @constructor
   * @base EditButtonBase
   * @author Simon Flannery simonDOTflanneryATbigpondDOTcom
   * @sponser VPAC
   * @param widgetNode The node from the Config XML file.
   * @param model The ButtonBar widget.
   */
  function EditPolygon(widgetNode, model) {
    // Extend EditButtonBase
    EditButtonBase.apply(this, new Array(widgetNode, model));
  
    /**
     * If the number of exsisting points is less than 2, append the new point to the polygon.
     * If the number of exsisting points is equal to 2, append the new point AND the first point again.
     * If the number of exsisting points is greater than 2, remove the last point (the first point), and append the new point AND the first point again.
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef, targetNode) {
      if (objRef.enabled) {
        var point = objRef.mouseHandler.model.extent.getXY(targetNode.evpl);
        var old   = objRef.targetModel.getXpathValue(objRef.targetModel, objRef.featureXpath);
        var thePolygon = "";
  
        if (!old) {
           thePolygon = point[0] + "," + point[1];
        }
        else {
           var collect = old.split(" "); /* The string is already delimited by white space. */
  
           if (collect.length < 2) { /* Enforce the polygon rules. */
              thePolygon = old + " " + point[0] + "," + point[1];
           }
           else if (collect.length == 2) {
              thePolygon = old + " " + point[0] + "," + point[1] + " " + collect[0];
           }
           else if (collect.length > 2) {
              for (var i = 0; i < collect.length - 1; ++i) {
  
                 thePolygon = thePolygon + collect[i] + " ";
              }
  
              thePolygon = thePolygon + point[0] + "," + point[1] + " " + collect[0];
           }
        }
  
        sucess = objRef.targetModel.setXpathValue(objRef.targetModel, objRef.featureXpath, thePolygon);
  
        if (!sucess) {
          alert("EditPolygon: invalid featureXpath in config: " + objRef.featureXpath);
        }
      }
    }
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/EventLog.xsl
  
  Index: EventLog.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0"
  xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Show an event log, used for debugging.
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <xsl:param name="listenerFilter"></xsl:param>
    <xsl:param name="targetFilter"></xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/mb:Logger">
      <div style="height:300px;overflow:scroll">
      <table border="1">
        <tr>
          <td colspan="2">
            Event Log
          </td>
          <td>
            <a href="javascript:window.logger.clearLog();">Clear</a> - 
            <a href="javascript:window.logger.callListeners('refresh');">Refresh</a> - 
            <a href="javascript:window.logger.saveLog();">Save</a>
          </td>
        </tr>
        <tr>
          <th>
            Event
          </th>
          <th>
            Listener
          </th>
          <th>
            Target
          </th>
        </tr>
        <xsl:choose>
          <xsl:when test="string-length($listenerFilter)>0">              
            <xsl:choose>
              <xsl:when test="string-length($targetFilter)>0">              
                <xsl:apply-templates select="event[@listener=$listenerFilter and @target=$targetFilter]"/>
              </xsl:when>
              <xsl:otherwise>
                <xsl:apply-templates select="event[@listener=$listenerFilter]"/>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:when>
          <xsl:otherwise>
            <xsl:apply-templates select="event"/>
          </xsl:otherwise>
        </xsl:choose>
      </table>
      </div>
    </xsl:template>
    
    <xsl:template match="event">
      <tr>
        <td>
          <xsl:value-of select="."/>
        </td>
        <td>
          <xsl:value-of select="@listener"/>
        </td>
        <td>
          <xsl:value-of select="@target"/>
        </td>
      </tr>
    </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/FeatureInfo.js
  
  Index: FeatureInfo.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Functions to render and update a FeatureInfoResponse from GML.
   * @constructor
   * @base WidgetBase
   * @author Steven Ottens AT geodan nl
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function FeatureInfo(widgetNode, model) {
    WidgetBaseXSL.apply(this, new Array(widgetNode, model));
  
    /**
     * Set the value of an attribute from the FeatureInfoResponse.
     * @param objRef Reference to this object.
     * @param xpath Xpath reference to the attribute in the GML.
     * @param value New attribute value.
     */
    this.setAttr=function(objRef,xpath,value){
      objRef.model.setXpathValue(objRef.model,xpath,value);
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/FeatureInfo.xsl
  
  Index: FeatureInfo.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" version="1.0">
  
  <!--
  Description: Convert a GML Feature or FeatureCollection into a HTML form.
  Author:      Steven Ottens AT geodan nl
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  $Name$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- Common params for all widgets -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- Main html - It matches only non-empty results -->
    <xsl:template match="/*">
      <div class="featureLayer">
        <div class="layerTitle">Layer</div><br/><!--TBD: get the real layername-->
        <form>	
            <xsl:apply-templates/>
        </form>
      </div>
    </xsl:template>
  
  
    <!-- All nodes -->
    <xsl:template match="*">
      <xsl:variable name="xlink">
        <xsl:call-template name="getXpath">
          <xsl:with-param name="node" select="."/>
        </xsl:call-template>
      </xsl:variable>
        <xsl:if test="not(./*)">
          <div class="record">
            <div class="name">
              <xsl:value-of select="name(.)"/>
            </div>
            <div class="value">
              <input
                type="text"
                id="{$widgetId}{generate-id()}"
                value="{text()}"
          	    readonly="readonly"
                />
            </div>
          </div>
        </xsl:if>
        <xsl:if test="./*">
          <xsl:apply-templates>
          </xsl:apply-templates>
        </xsl:if>
      </xsl:template>
  
    <!-- Return xpath reference to a node. Calls itself recursively -->
    <xsl:template name="getXpath">
      <xsl:param name="node"/>
      <xsl:if test="name($node/..)">
        <xsl:call-template name="getXpath">
          <xsl:with-param name="node" select="$node/.."/>
        </xsl:call-template>
      </xsl:if>
      <xsl:text>/</xsl:text>
      <xsl:value-of select="name($node)"/>
    </xsl:template>
  
    <!-- Remove documentation, text, comments -->
    <xsl:template match="comment()|text()|processing-instruction()">
    </xsl:template>
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/FeatureList.js
  
  Index: FeatureList.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * Functions to render and update a FeatureList from GML.
   * @constructor
   * @base WidgetBase
   * @author Cameron Shorter
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function FeatureList(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Set the value of an attribute from the FeatureList.
     * @param objRef Reference to this object.
     * @param xpath Xpath reference to the attribute in the GML.
     * @param value New attribute value.
     */
    this.setAttr=function(objRef,xpath,value){
      objRef.model.setXpathValue(objRef.model,xpath,value);
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/FeatureList.xsl
  
  Index: FeatureList.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" version="1.0">
  
  <!--
  Description: Convert a GML Feature or FeatureCollection into a HTML form.
  Author:      Cameron Shorter cameron ATshorter.net
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  $Name$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- Common params for all widgets -->
    <!--xsl:param name="targetModelId"/-->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- Main html -->
    <xsl:template match="/">
      <div>
        <h3>Feature List</h3>
        <xsl:apply-templates/>
      </div>
    </xsl:template>
  
    <!-- don't print boundedBy -->
    <xsl:template match="gml:boundedBy"/>
  
    <!-- featureMember -->
    <xsl:template match="gml:featureMember">
      <div>
        <table border="1" cellpadding="0" cellspacing="0">
          <xsl:apply-templates/>
        </table>
        <br/>
      </div>
    </xsl:template>
  
    <!-- All nodes -->
    <xsl:template match="*">
      <xsl:variable name="xlink">
        <xsl:call-template name="getXpath">
          <xsl:with-param name="node" select="."/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:if test="not(./*)">
        <tr>
          <td>
            <xsl:value-of select="name(.)"/>
          </td>
          <td>
            <input
              type="text"
              id="{$widgetId}{generate-id()}"
              size="40"
              value="{text()}"
              onchange="config.objects.{$widgetId}.setAttr(config.objects.{$widgetId},'{$xlink}',document.getElementById('{$widgetId}{generate-id()}').value);"/>
          </td>
        </tr>
      </xsl:if>
      <xsl:if test="./*">
        <xsl:apply-templates>
        </xsl:apply-templates>
      </xsl:if>
    </xsl:template>
  
    <!-- Return xpath reference to a node. Calls itself recursively -->
    <xsl:template name="getXpath">
      <xsl:param name="node"/>
      <xsl:if test="name($node/..)">
        <xsl:call-template name="getXpath">
          <xsl:with-param name="node" select="$node/.."/>
        </xsl:call-template>
      </xsl:if>
      <xsl:text>/</xsl:text>
      <xsl:value-of select="name($node)"/>
    </xsl:template>
  
    <!-- Remove documentation, text, comments -->
    <xsl:template match="comment()|text()|processing-instruction()">
    </xsl:template>
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/FilterAttributes.js
  
  Index: FilterAttributes.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * Parses a WFS DescribeFeatureType response to and provides a form to specify
   * filter parameters.   TBD: not yet completed.
   * This generic widget requires the config file to specify a <stylesheet>.
   * @constructor
   * @base WidgetBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function xxFilterAttributes(widgetNode, model) {
    var base = new WidgetBase(this, widgetNode, model);
  
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/FilterAttributes.xsl
  
  Index: FilterAttributes.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parse DescribeFeatureType response to provide filter params
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  		xmlns:gml="http://www.opengis.net/gml">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    
    <xsl:param name="elementName">
      <xsl:value-of select="/xsd:schema/xsd:element/@name"/>
    </xsl:param>
    <xsl:param name="elementType">
      <xsl:value-of select="/xsd:schema/xsd:element/@type"/>
    </xsl:param>
    <xsl:param name="elementTypeNoNs">
      <xsl:value-of select="substring-after($elementType,':')"/>
    </xsl:param>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/xsd:schema">
      <table>
        <tr>
          <th colspan="3">
            Attributes for: <xsl:value-of select="$elementName"/> of type:<xsl:value-of select="$elementType"/>
          </th>
        </tr>
        <xsl:apply-templates select="xsd:complexType[@name=$elementTypeNoNs]"/>
      </table>
    </xsl:template>
  
    <!--
  <xsd:complexType name="Landuse__Lat_Lon__Type">
  <xsd:complexContent>
  <xsd:extension base="gml:AbstractFeatureType">
  <xsd:sequence>
  <xsd:element name="GML_Geometry" -->
  
    <!-- template rule matching source root element -->
    <xsl:template match="xsd:element">
      <xsl:variable name="name"><xsl:value-of select="@name"/></xsl:variable>
      <xsl:variable name="type"><xsl:value-of select="@type"/></xsl:variable>
      <tr>
        <td>
          <xsl:value-of select="$name"/>
        </td>
        <td>
          <xsl:value-of select="$type"/>
        </td>
        <td>
        </td>
      </tr>
    </xsl:template>
  
    <!--xsl:template match="text()|@*"/-->
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Forward.js
  
  Index: Forward.js
  ===================================================================
  /*
  Author:       Steven Ottens AT geodan.nl
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is pressed the map will reload with it's original extent
   * @constructor
   * @base ButtonBase
   * @author Steven Ottens AT Geodan.nl
   * @param widgetNode      The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function Forward(widgetNode, model) {
    ButtonBase.apply(this, new Array(widgetNode, model));
    
    /**
     * Replaces the current extent with the next one in history
     * @param objRef      Pointer to this object.
     */
    this.doSelect = function(selected,objRef) {
      if (selected){
  
  		this.targetModel.setParam("historyForward");
        var nextExtent = objRef.targetModel.nextExtent;
        if(nextExtent){
          this.targetModel.setParam("historyStop");
          objRef.targetModel.extent.zoomToBox( nextExtent[0], nextExtent[1] );
          this.targetModel.setParam("historyStart");
        }
      }
    }
  }
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GetFeatureInfo.js
  
  Index: GetFeatureInfo.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  Dependancies: Context
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ButtonBase.js");
  /**
   * Implements WMS GetFeatureInfo functionality, popping up a query result
   * window when user clicks on map.
   * @constructor
   * @base ButtonBase
   * @author Nedjo
   * @constructor
   * @param toolNode The XML node in the Config file referencing this object.
   * @param model The widget object which this tool is associated with.
   */
  function GetFeatureInfo(toolNode, model) {
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(toolNode, model));
  
    /** Xsl to build a GetFeatureInfo URL */
    this.xsl=new XslProcessor(baseDir+"/tool/GetFeatureInfo.xsl");
    
    /** Determine whether Query result is returned as HTML or GML */
    // TBD This should be stored in the Config file.
    //this.infoFormat="application/vnd.ogc.gml";
    //this.infoFormat="text/plain";
    this.infoFormat="text/html";
  
    /**
     * Open window with query info.
     * This function is called when user clicks map with Query tool.
     * @param objRef      Pointer to this GetFeatureInfo object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
  
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        objRef.targetModel.deleteTemplates();
        var selectedLayer=objRef.context.getParam("selectedLayer");
        if (selectedLayer==null) {
          var queryList=objRef.context.getQueryableLayers();
        	if (queryList.length==0) {
             alert("There are no queryable layers available, please add a queryable layer to the context.");
             return;
        	}
          else {
            for (var i=0; i<queryList.length; ++i) {
              var layerNode=queryList[i];
              var layerName=layerNode.firstChild.data;
              var hidden = objRef.context.getHidden(layerName);
              if (hidden == 0) { //query only visible layers
                objRef.xsl.setParameter("queryLayer", layerName);
                objRef.xsl.setParameter("xCoord", targetNode.evpl[0]);
                objRef.xsl.setParameter("yCoord", targetNode.evpl[1]);
                objRef.xsl.setParameter("infoFormat", objRef.infoFormat);
                objRef.xsl.setParameter("featureCount", "1");
  
                urlNode=objRef.xsl.transformNodeToObject(objRef.context.doc);
                url=urlNode.documentElement.firstChild.nodeValue;
                httpPayload = new Object();
    	          httpPayload.url = url;
                httpPayload.method="get";
                httpPayload.postData=null;
                objRef.targetModel.newRequest(objRef.targetModel,httpPayload);
                }
              }
            }
          }
          else {
            objRef.xsl.setParameter("queryLayer", selectedLayer);
            objRef.xsl.setParameter("xCoord", targetNode.evpl[0]);
            objRef.xsl.setParameter("yCoord", targetNode.evpl[1]);
            objRef.xsl.setParameter("infoFormat", objRef.infoFormat);
            objRef.xsl.setParameter("featureCount", "1");
  
            var urlNode=objRef.xsl.transformNodeToObject(objRef.context.doc);
            var url=urlNode.documentElement.firstChild.nodeValue;
  
            if (objRef.infoFormat=="text/html"){
              window.open(url,'queryWin','height=200,width=300,scrollbars=yes');
            } else {
              var httpPayload = new Object();
              httpPayload.url = url;
              httpPayload.method="get";
              httpPayload.postData=null;
              objRef.targetModel.newRequest(objRef.targetModel,httpPayload);
            }
          }
        }
      }
  
    /**
     * Register for mouseUp events.
     * @param objRef  Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.mouseHandler) {
        objRef.mouseHandler.model.addListener('mouseup',objRef.doAction,objRef);
      }
      objRef.context=objRef.widgetNode.selectSingleNode("mb:context");
      if (objRef.context){
        objRef.context=eval("config.objects."+objRef.context.firstChild.nodeValue);
      }
    }
    config.addListener( "loadModel", this.setMouseListener, this );
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Gml2ScreenCoords.xsl
  
  Index: Gml2ScreenCoords.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!--
  Description: Convert GML coords to Screen coords.
               This XSL does not process <coordinates> tags.  Refer to
               GmlCooordinates2Coord.xsl to convert <coordinates> to <coord> tags.
  Author:      Cameron Shorter cameron ATshorter.net
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gml="http://www.opengis.net/gml"
    version="1.0">
  
    <xsl:output method="xml" encoding="utf-8"/>
    
    <xsl:param name="width" select="400"/>
    <xsl:param name="height" select="200"/>
    <xsl:param name="bBoxMinX" select="-180"/>
    <xsl:param name="bBoxMinY" select="-90"/>
    <xsl:param name="bBoxMaxX" select="180"/>
    <xsl:param name="bBoxMaxY" select="90"/>
  
    <xsl:variable name="xRatio" select="$width div ( $bBoxMaxX - $bBoxMinX )"/>
    <xsl:variable name="yRatio" select="$height div ( $bBoxMaxY - $bBoxMinY )"/>
  
    <!-- X coord -->
    <xsl:template match="gml:coord/gml:X">
      <xsl:element name="gml:X">
        <xsl:value-of select="round((number(.)-$bBoxMinX)*$xRatio)"/>
      </xsl:element>
    </xsl:template>
  
    <!-- Y coord -->
    <xsl:template match="gml:coord/gml:Y">
      <xsl:element name="gml:Y">
        <xsl:value-of select="round($height - (number(.)-$bBoxMinY)*$yRatio)"/>
      </xsl:element>
    </xsl:template>
  
    <!-- All other nodes are copied -->
    <xsl:template match="*|@*|comment()|processing-instruction()|text()">
      <xsl:copy>
        <xsl:apply-templates
         select="*|@*|comment()|processing-instruction()|text()"/>
      </xsl:copy>
    </xsl:template>
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlCooordinates2Coord.xsl
  
  Index: GmlCooordinates2Coord.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: Convert <coordinates> to <coord x> <coord y>
  
  Author:      Cameron Shorter cameron ATshorterDOTnet
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet
  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  
    xmlns:gml="http://www.opengis.net/gml"
  
    version="1.0">
  
  
  
    <!-- Coordinates template -->
  
    <xsl:template match="gml:coordinates">
  
  
  
      <!-- Convert decimal, coord symbol, tuple symbol to defaults -->
  
      <xsl:variable name="str" select="translate(., at decimal,'.')"/>
  
      <xsl:variable name="str2" select="translate($str, at cs,',')"/>
  
      <xsl:variable name="str3" select="translate($str2, at ts,' ')"/>
  
      <xsl:if test="string-length(normalize-space($str3))!=0">
  
        <xsl:call-template name="parseTuples">
  
          <xsl:with-param name="str" select="normalize-space($str3)"/>
  
        </xsl:call-template>
  
      </xsl:if>
  
    </xsl:template>
  
  
  
    <!-- Print one tuple, then recursively call this template to print remaining tuples -->
  
    <xsl:template name="parseTuples">
  
      <xsl:param name="str"/>
  
      <xsl:param name="cs" select="','"/> <!--symbol to separate coords-->
  
      <xsl:param name="ts" select="' '"/> <!-- symbol to separate tuples-->
  
      <xsl:choose>
  
        <xsl:when test="not(contains($str,$ts))">
  
          <xsl:call-template name="parseCoords">
  
            <xsl:with-param name="str" select="$str"/>
  
            <xsl:with-param name="cs" select="$cs"/>
  
            <xsl:with-param name="ts" select="$ts"/>
  
          </xsl:call-template>
  
        </xsl:when>
  
        <xsl:otherwise>
  
          <xsl:call-template name="parseCoords">
  
            <xsl:with-param name="str" select="substring-before($str,$ts)"/>
  
            <xsl:with-param name="cs" select="$cs"/>
  
            <xsl:with-param name="ts" select="$ts"/>
  
          </xsl:call-template>
  
          <xsl:call-template name="parseTuples">
  
            <xsl:with-param name="str" select="substring-after($str,$ts)"/>
  
            <xsl:with-param name="cs" select="$cs"/>
  
            <xsl:with-param name="ts" select="$ts"/>
  
          </xsl:call-template>
  
        </xsl:otherwise>
  
      </xsl:choose>
  
    </xsl:template>
  
  
  
    <!-- Extract coords out of a tuple -->
  
    <xsl:template name="parseCoords">
  
      <xsl:param name="str"/>
  
      <xsl:param name="cs"/>
  
  
  
      <gml:coord>
  
        <!-- X coord -->
  
        <xsl:choose>
  
          <xsl:when test="not(contains($str,$cs))">
  
            <xsl:call-template name="printCoord">
  
              <xsl:with-param name="coord" select="'gml:X'"/>
  
              <xsl:with-param name="value" select="$str"/>
  
            </xsl:call-template>
  
          </xsl:when>
  
          <xsl:otherwise>
  
            <xsl:call-template name="printCoord">
  
              <xsl:with-param name="coord" select="'gml:X'"/>
  
              <xsl:with-param name="value" select="substring-before($str,$cs)"/>
  
            </xsl:call-template>
  
            <!-- Y coord -->
  
            <xsl:variable name="yz" select="substring-after($str,$cs)"/>
  
            <xsl:choose>
  
              <xsl:when test="not(contains($yz,$cs))">
  
                <xsl:call-template name="printCoord">
  
                  <xsl:with-param name="coord" select="'gml:Y'"/>
  
                  <xsl:with-param name="value" select="$yz"/>
  
                </xsl:call-template>
  
              </xsl:when>
  
              <xsl:otherwise>
  
                <xsl:call-template name="printCoord">
  
                  <xsl:with-param name="coord" select="'gml:Y'"/>
  
                  <xsl:with-param name="value" select="substring-before($yz,$cs)"/>
  
                </xsl:call-template>
  
                <!-- Z coord -->
  
                <xsl:call-template name="printCoord">
  
                  <xsl:with-param name="coord" select="'gml:Z'"/>
  
                  <xsl:with-param name="value" select="substring-after($yz,$cs)"/>
  
                </xsl:call-template>
  
              </xsl:otherwise>
  
            </xsl:choose>
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </gml:coord>
  
    </xsl:template>
  
  
  
    <!-- Print X, Y or Z coord: <X>123</X> -->
  
    <xsl:template name="printCoord">
  
      <xsl:param name="coord"/>
  
      <xsl:param name="value"/>
  
      <xsl:element name="{$coord}">
  
        <xsl:value-of select="$value"/>
  
      </xsl:element>
  
    </xsl:template>
  
  
  
    <!-- All other nodes are copied -->
  
    <xsl:template match="*|@*|comment()|processing-instruction()|text()">
  
      <xsl:copy>
  
        <xsl:apply-templates
  
         select="*|@*|comment()|processing-instruction()|text()"/>
  
      </xsl:copy>
  
    </xsl:template>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlPointRenderer.js
  
  Index: GmlPointRenderer.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  
  /**
   * Render GML point geometery into HTML.  This is a MapContainer widget.
   * Other Geometries could be handled if there was some way to get a point 
   * out of it (e.g. polygon centroid).
   * This widget places an image at the specified point on the map.
   * It also places a highlight image at the same spot and registers a 
   * hihglightFeature event on the model, where the featureId is set as the model param.
   * Models using this widget must implement getFeatureNodes(), 
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function GmlPointRenderer(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
    MapContainerBase.apply(this,new Array(widgetNode, model));
  
    this.normalImage = widgetNode.selectSingleNode("mb:normalImage").firstChild.nodeValue; 
    this.highlightImage = widgetNode.selectSingleNode("mb:highlightImage").firstChild.nodeValue; 
  
    this.model.addListener("refresh",this.paint, this); 
  
    /** highlights the selected feature by switching to the highlight image
      * @param objRef a pointer to this widget object
      */
    this.highlight = function(objRef, featureId) {
      var normalImageDiv = document.getElementById(featureId+"_normal");
      normalImageDiv.style.visibility = "hidden";
      var highlightImageDiv = document.getElementById(featureId+"_highlight");
      highlightImageDiv.style.visibility = "visible";
    }
    this.model.addListener("highlightFeature",this.highlight, this);
  
    /** highlights the selected feature by switching to the highlight image
      * @param objRef a pointer to this widget object
      */
    this.dehighlight = function(objRef, featureId) {
      var normalImageDiv = document.getElementById(featureId+"_normal");
      normalImageDiv.style.visibility = "visible";
      var highlightImageDiv = document.getElementById(featureId+"_highlight");
      highlightImageDiv.style.visibility = "hidden";
    }
    
    /** Clears all the divs
      *
      */
    this.clearFeatures = function() {
    
      var features = this.model.getFeatureNodes();
      for (var i=0; i<features.length; ++i) {
          var feature = features[i];
          var itemId = this.model.getFeatureId(feature);   //or feature id's for feature collections?
          var normalImageDiv = document.getElementById(itemId+"_normal");
          var highlightImageDiv = document.getElementById(itemId+"_highlight");
          
          if( normalImageDiv )
            this.node.removeChild( normalImageDiv );
            
          if( highlightImageDiv)
            this.node.removeChild( highlightImageDiv );
      }
      
    }
    
    this.model.addListener("dehighlightFeature",this.dehighlight, this);
  
  }
  
   
    
    /** draw the points by putting the image at the point
      * @param objRef a pointer to this widget object
      */
    GmlPointRenderer.prototype.paint = function(objRef) {
     
      if (objRef.model.doc && objRef.node && objRef.containerModel.doc ) {
        var containerProj = new Proj(objRef.containerModel.getSRS());
        
        // Does not work for some reason
        objRef.clearFeatures();
        
        var features = objRef.model.getFeatureNodes();
        for (var i=0; i<features.length; ++i) {
          var feature = features[i];
          var title = objRef.model.getFeatureName(feature);
          var itemId = objRef.model.getFeatureId(feature);   //or feature id's for feature collections?
          var point = objRef.model.getFeaturePoint(feature);
          point = containerProj.Forward(point);
          point = objRef.containerModel.extent.getPL(point);
  
          var normalImageDiv = document.getElementById(itemId+"_normal");
          var highlightImageDiv = document.getElementById(itemId+"_highlight");
          if (!normalImageDiv) {
            //add in the normalImage
            normalImageDiv = document.createElement("DIV");
            normalImageDiv.setAttribute("id",itemId+"_normal");
            normalImageDiv.style.position = "absolute";
            normalImageDiv.style.visibility = "visible";
            normalImageDiv.style.zIndex = 300;
            var newImage = document.createElement("IMG");
            newImage.src = config.skinDir+objRef.normalImage;
            newImage.title = title;
            normalImageDiv.appendChild(newImage);
            objRef.node.appendChild( normalImageDiv );
  
            //add in the highlightImage
            highlightImageDiv = document.createElement("DIV");
            highlightImageDiv.setAttribute("id",itemId+"_highlight");
            highlightImageDiv.style.position = "absolute";
            highlightImageDiv.style.visibility = "hidden";
            highlightImageDiv.style.zIndex = 301;   //all highlight images are on top of others
            var newImage = document.createElement("IMG");
            newImage.src = config.skinDir+objRef.highlightImage;
            newImage.title = title;
            highlightImageDiv.appendChild(newImage);
            objRef.node.appendChild( highlightImageDiv );
          }
  
          normalImageDiv.style.left = point[0];
          normalImageDiv.style.top = point[1];
          highlightImageDiv.style.left = point[0];
          highlightImageDiv.style.top = point[1];
        }
      }
    }
  
   
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRenderer.js
  
  Index: GmlRenderer.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  
  /**
   * Render GML into HTML.  this.targetModel references the context model with
   * width/height attributes.
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function GmlRenderer(widgetNode, model) {
    var base = new MapContainerBase(this,widgetNode,model)
  
    /** Xsl to convert Coordinates to Coords. */
    this.coordXsl=new XslProcessor(baseDir+"/widget/GmlCooordinates2Coord.xsl");
  
    /**
     * Set up XSL params and convert Gml Coordinate nodes to Gml Coords so that they
     * are easier to process by XSL.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      //alert("GmlRenderer prepaint on:" + objRef.model.id);
      objRef.stylesheet.setParameter("width", objRef.containerModel.getWindowWidth() );
      objRef.stylesheet.setParameter("height", objRef.containerModel.getWindowHeight() );
      bBox=objRef.containerModel.getBoundingBox();
      objRef.stylesheet.setParameter("bBoxMinX", bBox[0] );
      objRef.stylesheet.setParameter("bBoxMinY", bBox[1] );
      objRef.stylesheet.setParameter("bBoxMaxX", bBox[2] );
      objRef.stylesheet.setParameter("bBoxMaxY", bBox[3] );
      objRef.stylesheet.setParameter("color", "#FF0000" );
  
      objRef.resultDoc = objRef.coordXsl.transformNodeToObject(objRef.resultDoc);
    }
  
    // Call paint() when the context changes
  /*
    this.init = function(objRef) {
      objRef.targetModel.addListener("refresh",objRef.paint, objRef);
    }
    this.model.addListener("loadModel",this.init,this);
  */
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRenderer.xsl
  
  Index: GmlRenderer.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <xsl:stylesheet
  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  
    xmlns:gml="http://www.opengis.net/gml"
  
    version="1.0">
  
  <!--
  
  Description: Convert GML to HTML Graphics. 
  
  Author:      Cameron Shorter cameron ATshorter.net
  
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  
  
  $Id$
  
  $Name$
  
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    
  
    <xsl:param name="width" select="400"/>
  
    <xsl:param name="height" select="200"/>
  
    <xsl:param name="bBoxMinX" select="-180"/>
  
    <xsl:param name="bBoxMinY" select="-90"/>
  
    <xsl:param name="bBoxMaxX" select="180"/>
  
    <xsl:param name="bBoxMaxY" select="90"/>
  
    <xsl:param name="color" select="red"/>
  
    <xsl:param name="lineWidth" select="1"/>
  
    <xsl:param name="crossSize" select="0"/>
  
    <xsl:param name="skinDir"/>
  
    <xsl:param name="pointDiameter" select="10"/>
  
  
  
    <xsl:variable name="xRatio" select="$width div ( $bBoxMaxX - $bBoxMinX )"/>
  
    <xsl:variable name="yRatio" select="$height div ( $bBoxMaxY - $bBoxMinY )"/>
  
  
  
  
  
    <!-- Root node -->
  
    <xsl:template match="/">
  
      <div style="position:relative; width:{$width}; height:{$height}">
  
        <xsl:apply-templates/>
  
      </div>
  
    </xsl:template>
  
  
  
    <!-- Match and render a GML Point -->
  
    <xsl:template match="gml:pointMember/gml:Point">
  
      <xsl:variable name="x0" select="floor((number(gml:coord/gml:X)-$bBoxMinX)*$xRatio - number($pointDiameter) div 2)"/>
  
      <xsl:variable name="y0" select="floor($height - (number(gml:coord/gml:Y)-$bBoxMinY)*$yRatio - $pointDiameter div 2)"/>
  
  
  
      <div style="position:absolute; left:{$x0}px; top:{$y0}px; width:{$pointDiameter}px; height:{$pointDiameter}px">
  
        <img src="{$skinDir}/images/Dot.gif"/>
  
      </div>
  
    </xsl:template>
  
  
  
    <!-- Match and render a GML Envelope -->
  
    <xsl:template match="gml:Envelope">
  
      <xsl:variable name="x0" select="floor((number(gml:coord[position()=1]/gml:X)-$bBoxMinX)*$xRatio)"/>
  
      <xsl:variable name="y0" select="floor($height - (number(gml:coord[position()=1]/gml:Y) -$bBoxMinY)*$yRatio)"/>
  
      <xsl:variable name="x1" select="floor((number(gml:coord[position()=2]/gml:X)-$bBoxMinX)*$xRatio)"/>
  
      <xsl:variable name="y1" select="floor($height - (number(gml:coord[position()=2]/gml:Y)-$bBoxMinY)*$yRatio)"/>
  
  
  
      <xsl:choose>
  
        <!-- If envelope is small, draw a cross instead of a box -->
  
        <xsl:when test="($x0 - $x1 &lt; $crossSize) and ($x1 - $x0 &lt; $crossSize) and ($y0 - $y1 &lt; $crossSize) and ($y1 - $y0 &lt; $crossSize)">
  
          <debug drawCross="x"/>
  
          <xsl:variable name="xMid" select="floor(($x0 + $x1) div 2)"/>
  
          <xsl:variable name="yMid" select="floor(($y0 + $y1) div 2)"/>
  
          <xsl:variable name="crossHalf" select="floor($crossSize div 2)"/>
  
          <xsl:call-template name="drawLine">
  
            <xsl:with-param name="x0" select="$xMid"/>
  
            <xsl:with-param name="y0" select="$yMid - $crossHalf"/>
  
            <xsl:with-param name="x1" select="$xMid"/>
  
            <xsl:with-param name="y1" select="$yMid + $crossHalf"/>
  
          </xsl:call-template>
  
          <xsl:call-template name="drawLine">
  
            <xsl:with-param name="x0" select="$xMid - $crossHalf"/>
  
            <xsl:with-param name="y0" select="$yMid"/>
  
            <xsl:with-param name="x1" select="$xMid + $crossHalf"/>
  
            <xsl:with-param name="y1" select="$yMid"/>
  
          </xsl:call-template>
  
        </xsl:when>
  
  
  
        <!-- draw a box -->
  
        <xsl:otherwise>
  
          <debug drawBox="x"/>
  
          <xsl:call-template name="drawLine">
  
            <xsl:with-param name="x0" select="$x0"/>
  
            <xsl:with-param name="y0" select="$y0"/>
  
            <xsl:with-param name="x1" select="$x1"/>
  
            <xsl:with-param name="y1" select="$y0"/>
  
          </xsl:call-template>
  
          <xsl:call-template name="drawLine">
  
            <xsl:with-param name="x0" select="$x1"/>
  
            <xsl:with-param name="y0" select="$y0"/>
  
            <xsl:with-param name="x1" select="$x1"/>
  
            <xsl:with-param name="y1" select="$y1"/>
  
          </xsl:call-template>
  
          <xsl:call-template name="drawLine">
  
            <xsl:with-param name="x0" select="$x1"/>
  
            <xsl:with-param name="y0" select="$y1"/>
  
            <xsl:with-param name="x1" select="$x0"/>
  
            <xsl:with-param name="y1" select="$y1"/>
  
          </xsl:call-template>
  
          <xsl:call-template name="drawLine">
  
            <xsl:with-param name="x0" select="$x0"/>
  
            <xsl:with-param name="y0" select="$y1"/>
  
            <xsl:with-param name="x1" select="$x0"/>
  
            <xsl:with-param name="y1" select="$y0"/>
  
          </xsl:call-template>
  
  
  
        </xsl:otherwise>
  
      </xsl:choose>
  
    </xsl:template>
  
  
  
    <!-- Match and render a LineString -->
  
    <xsl:template match="gml:LineString">
  
      <xsl:for-each select="gml:coord">
  
        <debug lineString="x"
  
          x0="{floor((number(gml:X)-$bBoxMinX)*$xRatio)}"
  
          y0="{floor($height - (number(gml:Y) -$bBoxMinY)*$yRatio)}"
  
          x1="{floor((number(following-sibling::gml:coord[position()=1]/gml:X)-$bBoxMinX)*$xRatio)}"
  
          y1="{floor($height - (number(following-sibling::gml:coord[position()=1]/gml:Y)-$bBoxMinY)*$yRatio)}"/>
  
        <xsl:if test="following-sibling::gml:coord">
  
          <xsl:call-template name="drawLine">
  
            <xsl:with-param name="x0" select="floor((number(gml:X)-$bBoxMinX)*$xRatio)"/>
  
            <xsl:with-param name="y0" select="floor($height - (number(gml:Y) -$bBoxMinY)*$yRatio)"/>
  
            <xsl:with-param name="x1" select="floor((number(following-sibling::gml:coord[position()=1]/gml:X)-$bBoxMinX)*$xRatio)"/>
  
            <xsl:with-param name="y1" select="floor($height - (number(following-sibling::gml:coord[position()=1]/gml:Y)-$bBoxMinY)*$yRatio)"/>
  
          </xsl:call-template>
  
        </xsl:if>
  
      </xsl:for-each>
  
    </xsl:template>
  
  
  
    <!-- Draw a line.  -->
  
    <xsl:template name="drawLine">
  
      <xsl:param name="x0"/>
  
      <xsl:param name="y0"/>
  
      <xsl:param name="x1"/>
  
      <xsl:param name="y1"/>
  
      <xsl:variable name="slope">
  
        <xsl:choose>
  
          <xsl:when test="$x0 = $x1">0</xsl:when>
  
          <xsl:otherwise>
  
            <xsl:value-of select="($y1 - $y0) div ($x1 - $x0)"/>
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <debug select="drawLine{$x0},{$y0},{$x1},{$y1} slope={$slope}"/>
  
      <xsl:choose>
  
        <xsl:when test="$x0 = $x1">
  
          <xsl:call-template name="fillBox">
  
            <xsl:with-param name="x0" select="$x0 - floor($lineWidth div 2)"/>
  
            <xsl:with-param name="y0" select="$y0"/>
  
            <xsl:with-param name="x1" select="$x0 + floor($lineWidth div 2)"/>
  
            <xsl:with-param name="y1" select="$y1"/>
  
          </xsl:call-template>
  
        </xsl:when>
  
        <xsl:when test="$y0 = $y1">
  
          <xsl:call-template name="fillBox">
  
            <xsl:with-param name="x0" select="$x0"/>
  
            <xsl:with-param name="y0" select="$y0 - floor($lineWidth div 2)"/>
  
            <xsl:with-param name="x1" select="$x1"/>
  
            <xsl:with-param name="y1" select="$y1 + floor($lineWidth div 2)"/>
  
          </xsl:call-template>
  
        </xsl:when>
  
        <xsl:when test="$slope > 0.5 or $slope &lt; -0.5">
  
          <xsl:call-template name="drawSteepLine">
  
            <xsl:with-param name="slope" select="$slope"/>
  
            <xsl:with-param name="x0" select="$x0"/>
  
            <xsl:with-param name="y0" select="$y0"/>
  
            <xsl:with-param name="x1" select="$x1"/>
  
            <xsl:with-param name="y1" select="$y1"/>
  
          </xsl:call-template>
  
        </xsl:when>
  
        <xsl:otherwise>
  
          <xsl:call-template name="drawFlatLine">
  
            <xsl:with-param name="slope" select="$slope"/>
  
            <xsl:with-param name="x0" select="$x0"/>
  
            <xsl:with-param name="y0" select="$y0"/>
  
            <xsl:with-param name="x1" select="$x1"/>
  
            <xsl:with-param name="y1" select="$y1"/>
  
          </xsl:call-template>
  
        </xsl:otherwise>
  
      </xsl:choose>
  
    </xsl:template>
  
    
  
    <!-- Draw Line with height > width.  Recursively calls itself drawing a series
  
    of vertical lines with each recursion. -->
  
    <xsl:template name="drawSteepLine">
  
      <xsl:param name="slope"/> <!-- height/width -->
  
      <xsl:param name="x0"/>
  
      <xsl:param name="y0"/>
  
      <xsl:param name="x1"/>
  
      <xsl:param name="y1"/>
  
      
  
      <xsl:variable name="inc">
  
        <xsl:choose>
  
          <xsl:when test="$x0 &lt; $x1">1</xsl:when>
  
          <xsl:otherwise>-1</xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <debug select="drawSteepLine {$x0},{$y0},{$x1},{$y1} slope={$slope} inc={$inc}"/>
  
  
  
      <xsl:call-template name="fillBox">
  
        <xsl:with-param name="x0" select="$x0 - floor(($lineWidth - 1) div 2)"/>
  
  
  
        <xsl:with-param name="y0">
  
          <xsl:choose>
  
            <xsl:when test="$y0"> <!-- Start of line -->
  
              <xsl:value-of select="$y0"/>
  
            </xsl:when>
  
            <xsl:otherwise>
  
              <xsl:value-of select="$y1 + floor($slope * ($x0 - $x1 + 0.5 * $inc))"/>
  
            </xsl:otherwise>
  
          </xsl:choose>
  
        </xsl:with-param>
  
  
  
        <xsl:with-param name="x1" select="$x0 + floor(($lineWidth - 1) div 2)"/>
  
  
  
        <xsl:with-param name="y1">
  
          <xsl:choose>
  
            <xsl:when test="$x0 = $x1"> <!-- End of line -->
  
              <xsl:value-of select="$y1"/>
  
            </xsl:when>
  
            <xsl:otherwise>
  
              <xsl:value-of select="$y1 + floor($slope * ($x0 - $x1 - 0.5 * $inc))"/>
  
            </xsl:otherwise>
  
          </xsl:choose>
  
        </xsl:with-param>
  
      </xsl:call-template>
  
      
  
      <xsl:if test="$x0 != $x1">
  
        <xsl:call-template name="drawSteepLine">
  
          <xsl:with-param name="x0" select="$x0 + $inc"/>
  
          <xsl:with-param name="x1" select="$x1"/>
  
          <xsl:with-param name="y1" select="$y1"/>
  
          <xsl:with-param name="slope" select="$slope"/>
  
        </xsl:call-template>
  
      </xsl:if>
  
    </xsl:template>
  
  
  
    <!--
  
    Draw Line with width > height.  Recursively calls itself drawing a series
  
    of horizontal lines with each recursion.
  
    -->
  
    <xsl:template name="drawFlatLine">
  
      <xsl:param name="slope"/> <!-- height/width -->
  
      <xsl:param name="x0"/> <!-- Only defined on first call -->
  
      <xsl:param name="y0"/>
  
      <xsl:param name="x1"/>
  
      <xsl:param name="y1"/>
  
      
  
      <xsl:variable name="inc">
  
        <xsl:choose>
  
          <xsl:when test="$y0 &lt; $y1">1</xsl:when>
  
          <xsl:otherwise>-1</xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <debug select="drawFlatLine {$x0},{$y0},{$x1},{$y1} slope={$slope} inc={$inc}"/>
  
  
  
      <xsl:call-template name="fillBox">
  
  
  
        <xsl:with-param name="x0">
  
          <xsl:choose>
  
            <xsl:when test="$x0"> <!-- Start of line -->
  
              <xsl:value-of select="$x0"/>
  
            </xsl:when>
  
            <xsl:otherwise>
  
              <xsl:value-of select="$x1 - floor(($y1 - $y0 + 0.5 * $inc) div $slope)"/>
  
            </xsl:otherwise>
  
          </xsl:choose>
  
        </xsl:with-param>
  
  
  
        <xsl:with-param name="y0" select="$y0 - floor(($lineWidth - 1) div 2)"/>
  
  
  
        <xsl:with-param name="x1">
  
          <xsl:choose>
  
            <xsl:when test="$y0 = $y1"> <!-- End of line -->
  
              <xsl:value-of select="$x1"/>
  
            </xsl:when>
  
            <xsl:otherwise>
  
              <xsl:value-of select="$x1 - floor(($y1 - $y0 - 0.5 * $inc) div $slope)"/>
  
            </xsl:otherwise>
  
          </xsl:choose>
  
        </xsl:with-param>
  
  
  
        <xsl:with-param name="y1" select="$y0 + floor(($lineWidth - 1) div 2)"/>
  
      </xsl:call-template>
  
      
  
      <xsl:if test="$y0 != $y1">
  
        <xsl:call-template name="drawFlatLine">
  
          <xsl:with-param name="y0" select="$y0 + $inc"/>
  
          <xsl:with-param name="x1" select="$x1"/>
  
          <xsl:with-param name="y1" select="$y1"/>
  
          <xsl:with-param name="slope" select="$slope"/>
  
        </xsl:call-template>
  
      </xsl:if>
  
    </xsl:template>
  
  
  
    <!-- Render a solid box -->
  
    <xsl:template name="fillBox">
  
      <xsl:param name="x0"/>
  
      <xsl:param name="y0"/>
  
      <xsl:param name="x1"/>
  
      <xsl:param name="y1"/>
  
  
  
      <debug select="fillBox {$x0},{$y0},{$x1},{$y1}"/>
  
      <xsl:variable name="xMax">
  
        <xsl:choose>
  
          <xsl:when test="$x1 > $x0">
  
            <xsl:value-of select="$x1"/>
  
          </xsl:when>
  
          <xsl:otherwise>
  
            <xsl:value-of select="$x0"/>
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <xsl:variable name="xMin">
  
        <xsl:choose>
  
          <xsl:when test="$x1 > $x0">
  
            <xsl:value-of select="$x0"/>
  
          </xsl:when>
  
          <xsl:otherwise>
  
            <xsl:value-of select="$x1"/>
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <xsl:variable name="yMin">
  
        <xsl:choose>
  
          <xsl:when test="$y1 > $y0">
  
            <xsl:value-of select="$y0"/>
  
          </xsl:when>
  
          <xsl:otherwise>
  
            <xsl:value-of select="$y1"/>
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <xsl:variable name="yMax">
  
        <xsl:choose>
  
          <xsl:when test="$y1 > $y0">
  
            <xsl:value-of select="$y1"/>
  
          </xsl:when>
  
          <xsl:otherwise>
  
            <xsl:value-of select="$y0"/>
  
          </xsl:otherwise>
  
        </xsl:choose>
  
      </xsl:variable>
  
  
  
      <div style="position:absolute; left:{$xMin}px; top:{$yMin}px; width:{$xMax - $xMin +1}px; height:{$yMax -$yMin +1}px; background-color:{$color}"><i/></div>
  
    </xsl:template>
  
  
  
    <!-- Render a <div> box -->
  
    <xsl:template name="mkDiv">
  
      <xsl:param name="x"/>
  
      <xsl:param name="y"/>
  
      <xsl:param name="w"/>
  
      <xsl:param name="h"/>
  
  
  
      <div style="position:absolute; left:{$x}px; top:{$y}px; width:{$w}px; height:{$h}px; background-color:{$color}"><i/></div>
  
    </xsl:template>
  
  
  
    <xsl:template match="text()|@*"/>
  
    
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRendererSVG.js
  
  Index: GmlRendererSVG.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net, Mike Adair, Nedjo Rogers
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id:
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  
  /**
   * Render GML into SVG.
   * Calls GmlCoordinates2Coord.xsl to convert GML to a simpler form.
   * Calls GmlRendererSVG.xsl to convert GML to SVG.
   * this.targetModel references the context model with
   * width/height attributes.
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function GmlRendererSVG(widgetNode, model) {
    var base = new MapContainerBase(this,widgetNode,model);
  
    /** Output of XSL will be xhtml which will be appended to document.*/
    this.paintMethod="xsl2html";
  
    /** Xsl to convert GML Coordinates to Coords. */
    this.coordXsl=new XslProcessor(baseDir+"/widget/GmlCooordinates2Coord.xsl");
  
    /**
     * Set up XSL params and convert Gml Coordinate nodes to Gml Coords so
     * that they are easier to process by XSL.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      objRef.model.setParam("modelStatus","preparing coordinates");
      objRef.stylesheet.setParameter("width", objRef.containerModel.getWindowWidth() );
      objRef.stylesheet.setParameter("height", objRef.containerModel.getWindowHeight() );
      bBox=objRef.containerModel.getBoundingBox();
      objRef.stylesheet.setParameter("bBoxMinX", bBox[0] );
      objRef.stylesheet.setParameter("bBoxMinY", bBox[1] );
      objRef.stylesheet.setParameter("bBoxMaxX", bBox[2] );
      objRef.stylesheet.setParameter("bBoxMaxY", bBox[3] );
      objRef.stylesheet.setParameter("color", "#FF0000" );
  
      objRef.resultDoc = objRef.coordXsl.transformNodeToObject(objRef.resultDoc);
  
    }
  
    /**
     * Called when the context's hidden attribute changes.
     * @param objRef This object.
     * @param layerName  The name of the layer that was toggled.
     */
    this.hiddenListener=function(objRef, layerName){
      var vis="visible";
      if(objRef.model.getHidden(layerName)) {
        vis="hidden";
      }
      var outputNode = document.getElementById(objRef.outputNodeId)
      for (var i=0; i< outputNode.childNodes.length; ++i) {
        outputNode.childNodes[i].style.visibility=vis;
      }
    }
    this.model.addListener("hidden",this.hiddenListener,this);
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRendererSVG.xsl
  
  Index: GmlRendererSVG.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns:gml="http://www.opengis.net/gml"
    version="1.0">
  <!--
  Description:  Convert GML to wz_jsgraphics function calls.
  Precondition: <coordinates> have been converted to <coords> (using
      GmlCoordinates2Coord.xsl).
  Author:       Nedjo Rogers nedjo ATgworks.ca, Cameron Shorter cameron ATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
    <xsl:output method="xml" encoding="utf-8"/>
    
    <xsl:param name="width" select="400"/>
    <xsl:param name="height" select="200"/>
    <xsl:param name="bBoxMinX" select="-180"/>
    <xsl:param name="bBoxMinY" select="-90"/>
    <xsl:param name="bBoxMaxX" select="180"/>
    <xsl:param name="bBoxMaxY" select="90"/>
    <xsl:param name="lineColor" select="'red'"/>
    <xsl:param name="lineWidth" select="1"/>
    <xsl:param name="crossSize" select="0"/>
    <xsl:param name="skinDir"/>
    <xsl:param name="pointWidth" select="5"/>
  
    <xsl:variable name="xRatio" select="$width div ( $bBoxMaxX - $bBoxMinX )"/>
    <xsl:variable name="yRatio" select="$height div ( $bBoxMaxY - $bBoxMinY )"/>
  
    <!-- Root node -->
    <xsl:template match="/">
      <xsl:param name="geoWidth" select="$bBoxMaxX - $bBoxMinX"/>
      <xsl:param name="geoHeight" select="$bBoxMaxY - $bBoxMinY"/>
      <xsl:element name="svg">
        <xsl:attribute name="width"><xsl:value-of select="$width"/><xsl:text>px</xsl:text></xsl:attribute>
        <xsl:attribute name="height"><xsl:value-of select="$height"/><xsl:text>px</xsl:text></xsl:attribute>
          <xsl:attribute name="viewBox">
            <xsl:value-of select="$bBoxMinX"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="$bBoxMinY"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="$geoWidth"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="$geoHeight"/>
  	</xsl:attribute>
          <xsl:element name="g">
            <xsl:attribute name="style"><xsl:text>fill-rule:evenodd; fill:none; stroke:none; stroke-antialiasing:true;</xsl:text></xsl:attribute>
            <xsl:attribute name="transform"><xsl:text>matrix(1 0 0 -1 0 0)</xsl:text></xsl:attribute>
            <xsl:apply-templates/>
          </xsl:element>
      </xsl:element>
    </xsl:template>
  
    <!-- Match and render a GML Point -->
    <xsl:template match="gml:pointMember/gml:Point | gml:pointProperty/gml:Point">
      <xsl:variable name="x0" select="gml:coord/gml:X"/>
      <xsl:variable name="y0" select="gml:coord/gml:Y"/>
        <xsl:element name="circle">
          <xsl:attribute name="cx"><xsl:value-of select="$x0"/></xsl:attribute>
          <xsl:attribute name="cy"><xsl:value-of select="$y0"/></xsl:attribute>
          <xsl:attribute name="r"><xsl:value-of select="$pointWidth"/></xsl:attribute>
        </xsl:element>
    </xsl:template>
  
    <!-- Match and render a LineString -->
    <xsl:template match="gml:LineString">
      <xsl:choose>
        <!-- Draw a line -->
        <xsl:when test="count(gml:coord)!=1">
          <xsl:element name="polyline">
            <xsl:attribute name="points">
              <xsl:for-each select="gml:coord">
                <xsl:value-of select="gml:X"/>
                <xsl:text> </xsl:text>
                <xsl:value-of select="floor($height - (number(gml:Y) -$bBoxMinY)*$yRatio)"/>
                <xsl:if test="following-sibling::gml:coord">
                  <xsl:text>,</xsl:text>
                </xsl:if>
              </xsl:for-each>
            </xsl:attribute>
          </xsl:element>
        </xsl:when>
        <!-- When one coord, draw point -->
        <xsl:otherwise>
          <xsl:variable name="x0" select="gml:coord/gml:X"/>
          <xsl:variable name="y0" select="gml:coord/gml:Y"/>
          <xsl:element name="circle">
            <xsl:attribute name="cx"><xsl:value-of select="$x0"/></xsl:attribute>
            <xsl:attribute name="cy"><xsl:value-of select="$y0"/></xsl:attribute>
            <xsl:attribute name="r"><xsl:value-of select="$pointWidth"/></xsl:attribute>
          </xsl:element>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRendererTest.js
  
  Index: GmlRendererTest.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  
  /**
   * This is a GML rendering widget that does all the pre-processing but doesn't
   * actually render to the page.  It is used for debugging purposes.
   * @constructor
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function GmlRendererTest(widgetNode, model) {
  
    /**
     * Override of the widget paint method to just pop up an alert with the 
     * transformed GML document.
     * @param objRef Pointer to this object.
     */
    this.paint = function(objRef) {
      //var response = postLoad("/mapbuilder/writeXml", objRef.model.doc);
      var features = objRef.model.doc.selectNodes("//gml:featureMember");
      alert("pretending to paint:"+features.length+" features"+Sarissa.serialize(objRef.model.doc));
    }
  
    var base = new MapContainerBase(this,widgetNode,model)
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRendererTest.xsl
  
  Index: GmlRendererTest.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <xsl:stylesheet
  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  
    xmlns:gml="http://www.opengis.net/gml"
  
    version="1.0">
  
  <!--
  
  Description: Empty template as a placeholder
  
  Author:      Mike Adair
  
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  
  
  $Id$
  
  $Name$
  
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    
  
    <!-- Root node -->
  
    <xsl:template match="/">
  
    </xsl:template>
  
  
  
  </xsl:stylesheet>
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRendererWKT.js
  
  Index: GmlRendererWKT.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  
  /**
   * Render GML into the WKT defined in the OGC .
   * Calls GmlCoordinates2Coord.xsl to convert GML to a simpler form.
   * Calls GmlRendererWKT.xsl to convert GML to WKT format.
   * this.targetModel references the context model with
   * width/height attributes.
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function GmlRendererWKT(widgetNode, model) {
    var base = new MapContainerBase(this,widgetNode,model);
  
    /** Output of XSL will be javascript which will be executed when painting.*/
    this.paintMethod="xsl2js";
  
    /** Xsl to convert GML Coordinates to Coords. */
    this.coordXsl=new XslProcessor(baseDir+"/widget/GmlCooordinates2Coord.xsl");
  
    /**
     * Set up XSL params and convert Gml Coordinate nodes to Gml Coords so
     * that they are easier to process by XSL.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      objRef.model.setParam("modelStatus","preparing coordinates");
      objRef.stylesheet.setParameter("targetElement", objRef.containerModel.getWindowWidth() );
      objRef.resultDoc = objRef.coordXsl.transformNodeToObject(objRef.resultDoc);
  
    }
  
    /**
     * Called when the context's hidden attribute changes.
     * @param objRef This object.
     * @param layerName  The name of the layer that was toggled.
     */
    this.hiddenListener=function(objRef, layerName){
      var vis="visible";
      if(objRef.model.getHidden(layerName)) {
        vis="hidden";
      }
      var outputNode = document.getElementById(objRef.outputNodeId)
      for (var i=0; i< outputNode.childNodes.length; ++i) {
        outputNode.childNodes[i].style.visibility=vis;
      }
    }
    this.model.addListener("hidden",this.hiddenListener,this);
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRendererWKT.xsl
  
  Index: GmlRendererWKT.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gml="http://www.opengis.net/gml"
    version="1.0">
  <!--
  Description:  Convert GML to WKT.
  Precondition: <coordinates> have been converted to <coords> (using
      GmlCoordinates2Coord.xsl).
  Author:       Cameron Shorter cameron ATshorter.net, Nedjo Rogers nedjo ATgworks.ca
  Licence:      GPL as per: http://www.gnu.org/copyleft/gpl.html
  
  $Id: 
  $Name$
  -->
    <xsl:output method="xml" encoding="utf-8"/>
    
    <!-- Root node -->
    <xsl:template match="/">
      <js>
      <xsl:apply-templates/>
      </js>
    </xsl:template>
  
    <!-- Match and render a GML Point -->
    <xsl:template match="gml:pointMember/gml:Point | gml:pointProperty/gml:Point">
      <xsl:variable name="x0" select="gml:coord/gml:X"/>
      <xsl:variable name="y0" select="gml:coord/gml:Y"/>
      // Point
      objRef.setValue('POINT(<xsl:value-of select="$x0"/> <xsl:value-of select="$y0"/>)');
    </xsl:template>
  
  
    <!-- Match and render a LineString -->
    <xsl:template match="gml:LineString">
      <xsl:text>  objRef.setValue('LINESTRING(</xsl:text>
      <xsl:for-each select="gml:coord">
        <xsl:value-of select="gml:X"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="gml:Y"/>
        <xsl:if test="following-sibling::gml:coord">
          <xsl:text>,</xsl:text>
        </xsl:if>
      </xsl:for-each>
      <xsl:text>)');</xsl:text>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRendererWZ.js
  
  Index: GmlRendererWZ.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronATshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/model/Proj.js");
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  mapbuilder.loadScript(baseDir+"/util/wz_jsgraphics/wz_jsgraphics.js");
  
  /**
   * Render GML into HTML.
   * Calls GmlCoordinates2Coord.xsl to convert GML to a simpler form.
   * Calls GmlRendererWZ.xsl to convert GML to wz_jsgraphics graphic function
   * calls.
   * this.targetModel references the context model with
   * width/height attributes.
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function GmlRendererWZ(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
  
    // Set this.stylesheet
    // Defaults to "widget/<widgetName>.xsl" if not defined in config file.
    var styleNode = widgetNode.selectSingleNode("mb:stylesheet");
    if (styleNode ) {
      this.stylesheet = new XslProcessor(styleNode.firstChild.nodeValue,model.namespace);
    } else {
      this.stylesheet = new XslProcessor(baseDir+"/widget/"+widgetNode.nodeName+".xsl",model.namespace);
    }
  
    this.paint = function(objRef) {
      if (objRef.model.doc && objRef.node && objRef.containerModel && objRef.containerModel.doc) {
        objRef.stylesheet.setParameter("modelUrl", objRef.model.url);
  
        //if (objRef.debug) alert("source:"+Sarissa.serialize(objRef.model.doc));
        objRef.resultDoc = objRef.model.doc; // resultDoc sometimes modified by prePaint()
        objRef.prePaint(objRef);
  
        //confirm inputs
        if (objRef.debug) alert("prepaint:"+Sarissa.serialize(objRef.resultDoc));
        if (objRef.debug) alert("stylesheet:"+Sarissa.serialize(objRef.stylesheet.xslDom));
  
        //set to output to a temporary node
        //hack to get by doc parsing problem in IE
        //the firstChild of tempNode will be the root element output by the stylesheet
        var outputNode = document.getElementById( objRef.outputNodeId );
        var tempNode = document.createElement("DIV");
  
        tempNode.style.position="absolute";
        tempNode.style.top=0;
        tempNode.style.left=0;
        tempNode.style.zindex=300;
        tempNode.setAttribute("id", objRef.outputNodeId);
        //look for this widgets output and replace if found,
        //otherwise append it
        if (outputNode) {
          objRef.node.replaceChild(tempNode,outputNode);
        } else {
          objRef.node.appendChild(tempNode);
        }
        jsNode = objRef.stylesheet.transformNodeToObject(objRef.resultDoc);
        js=jsNode.selectSingleNode("js").firstChild.nodeValue;
        if (objRef.debug) alert("javascript eval:"+js);
        objRef.model.setParam("modelStatus","rendering");
        eval(js);
  
        objRef.postPaint(objRef);
      }
    }
    this.model.addListener("refresh",this.paint, this);
  
    MapContainerBase.apply(this,new Array(widgetNode, model));
  
    // Set stylesheet parameters for all the child nodes from the config file
    for (var j=0;j<widgetNode.childNodes.length;j++) {
      if (widgetNode.childNodes[j].firstChild
        && widgetNode.childNodes[j].firstChild.nodeValue)
      {
        this.stylesheet.setParameter(
          widgetNode.childNodes[j].nodeName,
          widgetNode.childNodes[j].firstChild.nodeValue);
      }
    }
  
    // Set widget text values as parameters 
    if (config.widgetText) {
      var textNodeXpath = "/mb:WidgetText/mb:widgets/mb:" + widgetNode.nodeName;
      var textParams = config.widgetText.selectNodes(textNodeXpath+"/*");
      for (var j=0;j<textParams.length;j++) {
        this.stylesheet.setParameter(textParams[j].nodeName,textParams[j].firstChild.nodeValue);
      }
    }
  
    //all stylesheets will have these properties available
    this.stylesheet.setParameter("modelId", this.model.id );
    this.stylesheet.setParameter("modelTitle", this.model.title );
    this.stylesheet.setParameter("widgetId", this.id );
    this.stylesheet.setParameter("skinDir", config.skinDir );
    this.stylesheet.setParameter("lang", config.lang );
  
    /** Xsl to convert GML Coordinates to Coords. */
    this.coordXsl=new XslProcessor(baseDir+"/widget/GmlCooordinates2Coord.xsl");
  
    /**
     * Set up XSL params and convert Gml Coordinate nodes to Gml Coords so
     * that they are easier to process by XSL.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      objRef.model.setParam("modelStatus","preparing coordinates");
      objRef.stylesheet.setParameter("width", objRef.containerModel.getWindowWidth() );
      objRef.stylesheet.setParameter("height", objRef.containerModel.getWindowHeight() );
      bBox=objRef.containerModel.getBoundingBox();
      objRef.stylesheet.setParameter("bBoxMinX", bBox[0] );
      objRef.stylesheet.setParameter("bBoxMinY", bBox[1] );
      objRef.stylesheet.setParameter("bBoxMaxX", bBox[2] );
      objRef.stylesheet.setParameter("bBoxMaxY", bBox[3] );
      objRef.stylesheet.setParameter("color", "#FF0000" );
  
      objRef.resultDoc = objRef.coordXsl.transformNodeToObject(objRef.resultDoc);
  
      // Force refresh of the wz_jsgraphics handle when the widget's node
      // has been refreshed.
      if (!document.getElementById(objRef.outputNodeId)){
        //objRef.jg=null;
      }
    }
  
    /**
     * Called when the context's hidden attribute changes.
     * @param objRef This object.
     * @param layerName  The name of the layer that was toggled.
     */
    this.hiddenListener=function(objRef, layerName){
      var vis="visible";
      if(objRef.model.getHidden(layerName)) {
        vis="hidden";
      }
      var outputNode = document.getElementById(objRef.outputNodeId)
      for (var i=0; i< outputNode.childNodes.length; ++i) {
        outputNode.childNodes[i].style.visibility=vis;
      }
    }
    this.model.addListener("hidden",this.hiddenListener,this);
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/GmlRendererWZ.xsl
  
  Index: GmlRendererWZ.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <xsl:stylesheet
  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  
    xmlns:gml="http://www.opengis.net/gml"
  
    version="1.0">
  
  <!--
  
  Description:  Convert GML to wz_jsgraphics function calls.
  
  Precondition: <coordinates> have been converted to <coords> (using
  
      GmlCoordinates2Coord.xsl).
  
  Author:       Cameron Shorter cameron ATshorter.net
  
  Licence:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  
  
  $Id$
  
  $Name$
  
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    
  
    <xsl:param name="width" select="400"/>
  
    <xsl:param name="height" select="200"/>
  
    <xsl:param name="bBoxMinX" select="-180"/>
  
    <xsl:param name="bBoxMinY" select="-90"/>
  
    <xsl:param name="bBoxMaxX" select="180"/>
  
    <xsl:param name="bBoxMaxY" select="90"/>
  
    <xsl:param name="lineColor" select="'red'"/>
  
    <xsl:param name="lineWidth" select="1"/>
  
    <xsl:param name="fill" select="'grey'"/>
  
    <xsl:param name="crossSize" select="0"/>
  
    <xsl:param name="skinDir"/>
  
    <xsl:param name="pointWidth" select="5"/>
  
  
  
    <xsl:variable name="xRatio" select="$width div ( $bBoxMaxX - $bBoxMinX )"/>
  
    <xsl:variable name="yRatio" select="$height div ( $bBoxMaxY - $bBoxMinY )"/>
  
  
  
    <!-- Root node -->
  
    <xsl:template match="/">
  
      <js>
  
        //if (!objRef.jg){
  
          objRef.jg=new jsGraphics(objRef.outputNodeId);
  
        //}
  
        objRef.jg.clear();
  
        objRef.jg.setColor("<xsl:value-of select="$lineColor"/>");
  
        objRef.jg.setStroke(parseInt(<xsl:value-of select="$lineWidth"/>));
  
        <xsl:apply-templates/>
  
        objRef.jg.paint();
  
      </js>
  
    </xsl:template>
  
  
  
    <!-- Match and render a GML Point -->
  
    <xsl:template match="gml:Point">
  
      <xsl:choose>
  
        <xsl:when test="count(gml:coord)=1">
  
          <xsl:variable name="x0" select="floor((number(gml:coord/gml:X)-$bBoxMinX)*$xRatio - number($pointWidth) div 2)"/>
  
          <xsl:variable name="y0" select="floor($height - (number(gml:coord/gml:Y)-$bBoxMinY)*$yRatio - $pointWidth div 2)"/>
  
          // Point
  
          objRef.jg.fillRect(<xsl:value-of select="$x0"/>,<xsl:value-of select="$y0"/>,<xsl:value-of select="$pointWidth"/>,<xsl:value-of select="$pointWidth"/>);
  
        </xsl:when>
  
  
  
        <!-- When no coord do nothing -->
  
        <xsl:otherwise>
  
          // Do nothing (0 vertices )
  
        </xsl:otherwise>
  
      </xsl:choose>
  
    </xsl:template>
  
  
  
    <!-- Match and render a GML Envelope -->
  
    <xsl:template match="gml:Envelope">
  
      <xsl:variable name="x0" select="floor((number(gml:coord[position()=1]/gml:X)-$bBoxMinX)*$xRatio)"/>
  
      <xsl:variable name="y0" select="floor($height - (number(gml:coord[position()=1]/gml:Y) -$bBoxMinY)*$yRatio)"/>
  
      <xsl:variable name="x1" select="floor((number(gml:coord[position()=2]/gml:X)-$bBoxMinX)*$xRatio)"/>
  
      <xsl:variable name="y1" select="floor($height - (number(gml:coord[position()=2]/gml:Y)-$bBoxMinY)*$yRatio)"/>
  
  
  
      <xsl:choose>
  
        <!-- If envelope is small, draw a cross instead of a box -->
  
        <xsl:when test="($x0 - $x1 &lt; $crossSize) and ($x1 - $x0 &lt; $crossSize) and ($y0 - $y1 &lt; $crossSize) and ($y1 - $y0 &lt; $crossSize)">
  
          <xsl:variable name="xMid" select="floor(($x0 + $x1) div 2)"/>
  
          <xsl:variable name="yMid" select="floor(($y0 + $y1) div 2)"/>
  
          <xsl:variable name="crossHalf" select="floor($crossSize div 2)"/>
  
          // Envelope - cross
  
          objRef.jg.drawLine(
  
            <xsl:value-of select="$xMid"/>,
  
            <xsl:value-of select="$yMid - $crossHalf"/>,
  
            <xsl:value-of select="$xMid"/>,
  
            <xsl:value-of select="$yMid + $crossHalf"/>);
  
          objRef.jg.drawLine(
  
            <xsl:value-of select="$xMid - $crossHalf"/>,
  
            <xsl:value-of select="$yMid"/>,
  
            <xsl:value-of select="$xMid + $crossHalf"/>,
  
            <xsl:value-of select="$yMid"/>);
  
        </xsl:when>
  
  
  
        <!-- draw a box -->
  
        <xsl:otherwise>
  
          // Envelope - box
  
          x0=<xsl:value-of select="$x0"/>;
  
          y0=<xsl:value-of select="$y0"/>;
  
          x1=<xsl:value-of select="$x1"/>;
  
          y1=<xsl:value-of select="$y1"/>;
  
          objRef.jg.drawRect(
  
            Math.min(x0,x1),
  
            Math.min(y0,y1),
  
            Math.abs(x1-x0),
  
            Math.abs(y1-y0));
  
        </xsl:otherwise>
  
      </xsl:choose>
  
    </xsl:template>
  
  
  
    <!-- Match and render a LineString -->
  
    <xsl:template match="gml:LineString">
  
      <xsl:choose>
  
        <!-- Draw a line -->
  
        <xsl:when test="count(gml:coord)>1">
  
          <xsl:for-each select="gml:coord">
  
            <xsl:if test="following-sibling::gml:coord">
  
              // LineString
  
              objRef.jg.drawLine(
  
                <xsl:value-of select="floor((number(gml:X)-$bBoxMinX)*$xRatio)"/>,
  
                <xsl:value-of select="floor($height - (number(gml:Y) -$bBoxMinY)*$yRatio)"/>,
  
                <xsl:value-of select="floor((number(following-sibling::gml:coord[position()=1]/gml:X)-$bBoxMinX)*$xRatio)"/>,
  
                <xsl:value-of select="floor($height - (number(following-sibling::gml:coord[position()=1]/gml:Y)-$bBoxMinY)*$yRatio)"/>);
  
            </xsl:if>
  
          </xsl:for-each>
  
        </xsl:when>
  
  
  
        <!-- When one coord, draw point -->
  
        <xsl:when test="count(gml:coord)=1">
  
          <xsl:variable name="x0" select="floor((number(gml:coord/gml:X)-$bBoxMinX)*$xRatio - number($pointWidth) div 2)"/>
  
          <xsl:variable name="y0" select="floor($height - (number(gml:coord/gml:Y)-$bBoxMinY)*$yRatio - $pointWidth div 2)"/>
  
  
  
          // LineString - One point
  
          objRef.jg.fillRect(<xsl:value-of select="$x0"/>,<xsl:value-of select="$y0"/>,<xsl:value-of select="$pointWidth"/>,<xsl:value-of select="$pointWidth"/>);
  
        </xsl:when>
  
  
  
        <!-- When no coord do nothing -->
  
        <xsl:otherwise>
  
          // Do nothing (0 vertices )
  
        </xsl:otherwise>
  
      </xsl:choose>
  
    </xsl:template>
  
  
  
    <!-- Match and render a Polygon -->
  
    <xsl:template match="gml:LinearRing">
  
      <xsl:choose>
  
        <xsl:when test="count(gml:coord)>1">
  
        	<!-- Fill Polygon -->
  
          objRef.jg.setColor("<xsl:value-of select="$fill"/>");
  
          objRef.jg.fillPolygon(new Array( 
  
          <xsl:for-each select="gml:coord">
  
            <xsl:value-of select="floor((number(gml:X)-$bBoxMinX)*$xRatio)"/>
  
  	  <xsl:if test="following-sibling::gml:coord">,</xsl:if>
  
          </xsl:for-each>
  
  	),new Array(
  
          <xsl:for-each select="gml:coord">
  
            <xsl:value-of select="floor($height - (number(gml:Y) -$bBoxMinY)*$yRatio)"/>
  
  	  <xsl:if test="following-sibling::gml:coord">,</xsl:if>
  
          </xsl:for-each>
  
  	));
  
  
  
          <!-- Outline Polygon -->
  
          objRef.jg.setColor("<xsl:value-of select="$lineColor"/>");
  
          objRef.jg.drawPolygon(new Array( 
  
          <xsl:for-each select="gml:coord">
  
            <xsl:value-of select="floor((number(gml:X)-$bBoxMinX)*$xRatio)"/>
  
  	  <xsl:if test="following-sibling::gml:coord">,</xsl:if>
  
          </xsl:for-each>
  
  	),new Array(
  
          <xsl:for-each select="gml:coord">
  
            <xsl:value-of select="floor($height - (number(gml:Y) -$bBoxMinY)*$yRatio)"/>
  
  	  <xsl:if test="following-sibling::gml:coord">,</xsl:if>
  
          </xsl:for-each>
  
  	));
  
        </xsl:when>
  
  
  
        <!-- When one coord, draw point -->
  
        <xsl:when test="count(gml:coord)=1">
  
          <xsl:variable name="x0" select="floor((number(gml:coord/gml:X)-$bBoxMinX)*$xRatio - number($pointWidth) div 2)"/>
  
          <xsl:variable name="y0" select="floor($height - (number(gml:coord/gml:Y)-$bBoxMinY)*$yRatio - $pointWidth div 2)"/>
  
  
  
          // LineString - One point
  
          objRef.jg.fillRect(<xsl:value-of select="$x0"/>,<xsl:value-of select="$y0"/>,<xsl:value-of select="$pointWidth"/>,<xsl:value-of select="$pointWidth"/>);
  
        </xsl:when>
  
  
  
        <!-- When no coord do nothing -->
  
        <xsl:otherwise>
  
          // Do nothing (0 vertices )
  
        </xsl:otherwise>
  
      </xsl:choose>
  
    </xsl:template>
  
  
  
    <xsl:template match="text()|@*"/>
  
    
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/InsertFeature.js
  
  Index: InsertFeature.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is pressed a WFS-T InsertFeature transaction will be started.
   * @constructor
   * @base ButtonBase
   * @author Cameron Shorter
   * @param widgetNode The widget node from the Config XML file.
   * @param model The model for this widget
   */
  function InsertFeature(widgetNode, model) {
  
    // override default cursor by user
    // cursor can be changed by spefying a new cursor in config file
    this.cursor = "default"; 
  
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    this.trm=widgetNode.selectSingleNode("mb:transactionResponseModel").firstChild.nodeValue;
    this.tm=widgetNode.selectSingleNode("mb:targetModel").firstChild.nodeValue;
    this.tc=widgetNode.selectSingleNode("mb:targetContext").firstChild.nodeValue;
  
    this.httpPayload=new Object();
    this.httpPayload.url=widgetNode.selectSingleNode("mb:webServiceUrl").firstChild.nodeValue;
    this.httpPayload.method="post";
  
    /** Xsl to convert Feature into a WFS Transaction Insert. */
    this.insertXsl=new XslProcessor(baseDir+"/tool/xsl/wfs_Insert.xsl");
  
    /** Xsl to convert Feature into a WFS Transaction Update. */
    this.updateXsl=new XslProcessor(baseDir+"/tool/xsl/wfs_Update.xsl");
  
    /**
     * Start a WFS-T InsertFeature transaction.
     * @param objRef Pointer to this object.
     */
    this.doSelect = function(selected,objRef) {
      if (selected){
        // Model that will be populated with the WFS response.
        if (!objRef.transactionResponseModel){
          objRef.transactionResponseModel=eval("config.objects."+objRef.trm);
          objRef.transactionResponseModel.addListener("loadModel",objRef.handleResponse, objRef);
        }
        if (!objRef.targetModel){
          objRef.targetModel=eval("config.objects."+objRef.tm);
        }
        if (!objRef.targetContext){
          objRef.targetContext=eval("config.objects."+objRef.tc);
        }
        fid=objRef.targetModel.getXpathValue(objRef.targetModel,"//@fid");
        if (objRef.targetModel.doc){
          //if fid exists, then we are modifying an existing feature,
          // otherwise we are adding a new feature
          if(fid){
            s=objRef.updateXsl.transformNodeToObject(objRef.targetModel.doc);
          }else{
            s=objRef.insertXsl.transformNodeToObject(objRef.targetModel.doc);
          }
          objRef.httpPayload.postData=s;
          objRef.transactionResponseModel.newRequest(objRef.transactionResponseModel,objRef.httpPayload);
        }else alert("No feature available to insert");
      }
    }
  
    /**
     * If transaction was sucessful, refresh the map and remove contents of
     * FeatureList.  This function is called after the TransactionResponseModel
     * has been updated.
     * @param objRef Pointer to this object.
     */
    this.handleResponse=function(objRef){
      sucess=objRef.transactionResponseModel.doc.selectSingleNode("//wfs:TransactionResult/wfs:Status/wfs:SUCCESS");
      if (sucess){
        // Remove FeatureList
        objRef.targetModel.setModel(objRef.targetModel,null);
  
        // Repaint the WMS layers
        objRef.targetContext.callListeners("refreshWmsLayers");
      }
    }
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/LayerControl.js
  
  Index: LayerControl.js
  ===================================================================
  /*
  License: GPL as per: http://www.gnu.org/copyleft/gpl.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to allow control of layer odering, visibility, deletion
   * @constructor
   * @base WidgetBaseXSL
   * @author adair
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function LayerControl(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Override of widget prepaint to set some stylesheet parameters including 
     * featureName (for OWS Context) and hidden attribute.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      if (objRef.model.featureName) {
        objRef.stylesheet.setParameter("featureName", objRef.model.featureName );
        objRef.stylesheet.setParameter("hidden", objRef.model.getHidden(objRef.model.featureName).toString() );
      }
    }
  
    /**
     * Displays a layer in a preview pane when mouse is over the table row
     * @param layerName  the name of the layer to highlight
     */
    this.highlightLayer = function(layerName) {
      var layerId = this.model.id + "_" + "mainMapWidget" + "_" + layerName;
      var previewImage = document.getElementById("previewImage");
      var layer = document.getElementById(layerId);
      if (previewImage) previewImage.src = layer.firstChild.src;
    }
  
    /**
     * not working yet
     * @param layerName  the name of the layer to highlight
     */
    this.showLayerMetadata = function(layerName) {
      var metadataWidget = config.objects.layerMetadata;
      metadataWidget.stylesheet.setParameter("featureName",layerName);
      metadataWidget.node = document.getElementById(metadataWidget.htmlTagId);
      metadataWidget.paint(metadataWidget);
    }
  
    this.model.addListener("deleteLayer",this.paint, this);
    this.model.addListener("moveLayerUp",this.paint, this);
    this.model.addListener("moveLayerDown",this.paint, this);
    //this.model.addListener("addLayer",this.paint, this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/LayerControl.xsl
  
  Index: LayerControl.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:gml='http://www.opengis.net/gml' 
      xmlns:wfs='http://www.opengis.net/wfs'
      xmlns:xlink='http://www.w3.org/1999/xlink'
      version="1.0">
  <!--
  Description: provides a list of layers and controls for them (delete/visibility/move up/move down/show metadata
  Author:      Mike Adair
  Licence:     GPL as per: http://www.gnu.org/copyleft/gpl.html
  
  $Id$
  $Name$
  -->
    <xsl:output method="xml" encoding="utf-8"/>
    
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="skinDir"/>
    <xsl:param name="moveUpImage"/>
    <xsl:param name="moveDownImage"/>
    <xsl:param name="deleteImage"/>
    
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
    <xsl:param name="toggleVisTip"/>
    <xsl:param name="moveLayerUpTip"/>
    <xsl:param name="moveLayerDownTip"/>
    <xsl:param name="deleteLayerTip"/>
    
  <!-- The name of the javascript context object to call -->
    <xsl:param name="featureName"/>
    <xsl:param name="hidden"/>
    <xsl:param name="context">config.objects.<xsl:value-of select="$modelId"/></xsl:param>
    
  <!-- Main html -->
    <xsl:template match="/wmc:ViewContext">
      <div>
        <table class="layerControl" cellspacing="0" width="340px">
          <!--tr>
            <td colspan="5">Layer Control | Layer metadata | Map metadata</td>
          </tr-->
          <xsl:apply-templates select="wmc:LayerList/wmc:Layer">
            <xsl:sort select="position()" order="descending" data-type="number"/>
          </xsl:apply-templates>
        </table>
      </div>
    </xsl:template>
    
  <!-- Layer -->
    <xsl:template match="wmc:Layer">
      <xsl:variable name="layerName" select="wmc:Name"/>
      <xsl:variable name="rowClass">altRow_<xsl:value-of select="position() mod 2"/></xsl:variable>
      <tr class="{$rowClass}" onmouseover="config.objects.{$widgetId}.highlightLayer('{$layerName}')">
  <!-- Visiblity -->
        <td>
          <input type="checkbox" id="vis_{$layerName}" title="{$toggleVisTip}" onclick="{$context}.setHidden('{$layerName}',!document.getElementById('vis_{$layerName}').checked)">
            <xsl:if test="@hidden='0'"><xsl:attribute name="checked"/></xsl:if>
          </input>
        </td>
        <td>
         <a href="javascript:{$context}.setParam('moveLayerUp','{$layerName}')" class="mbButton">
          <img title="{$moveLayerUpTip}" src="{$skinDir}{$moveUpImage}" />
         </a>
        </td>
        <td>
         <a href="javascript:{$context}.setParam('moveLayerDown','{$layerName}')" class="mbButton">
          <img title="{$moveLayerDownTip}" src="{$skinDir}{$moveDownImage}" />
         </a>
        </td>
        <td>
         <a href="javascript:{$context}.setParam('deleteLayer','{$layerName}')" class="mbButton">
          <img title="{$deleteLayerTip}" src="{$skinDir}{$deleteImage}" />
         </a>
        </td>
        <td onclick="config.objects.{$widgetId}.showLayerMetadata('{$layerName}')">
          <xsl:choose>
            <xsl:when test="wmc:Title/@xml:lang">              
              <xsl:value-of select="wmc:Title[@xml:lang=$lang]"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="wmc:Title"/>
            </xsl:otherwise>
          </xsl:choose>
        </td>
      </tr>
      <tr class="{$rowClass}" onmouseover="config.objects.{$widgetId}.highlightLayer('{$layerName}')">
       <td colspan="5">
         <xsl:if test="wmc:StyleList/wmc:Style[@current='1']/wmc:LegendURL"> 
            <xsl:element name="IMG">
                <xsl:attribute name="SRC">
                  <xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:LegendURL/wmc:OnlineResource/@xlink:href"/> 
                </xsl:attribute>
            </xsl:element>
           </xsl:if>
       </td>
      </tr>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Legend.js
  
  Index: Legend.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Functions to render and update a Legend from a Web Map Context.
   * @constructor
   * @base WidgetBaseXSL
   * @author Cameron Shorter cameronATshorter.net
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function Legend(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Override of widget prepaint to set some stylesheet parameters including 
     * featureName (for OWS Context) and hidden attribute.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      if (objRef.model.featureName) {
        objRef.stylesheet.setParameter("featureName", objRef.model.featureName );
        objRef.stylesheet.setParameter("hidden", objRef.model.getHidden(objRef.model.featureName).toString() );
      }
    }
  
    /**
     * @param objRef Pointer to this object.
     * @param layer The selected layer.
     */
    this.selectLayer = function(objRef,layer) {
      objRef.model.setParam('selectedLayer',layer);
    }
  
    this.model.addListener("deleteLayer",this.paint, this);
    this.model.addListener("moveLayerUp",this.paint, this);
    this.model.addListener("moveLayerDown",this.paint, this);
    this.model.addListener("addLayer",this.paint, this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Legend.xsl
  
  Index: Legend.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:gml='http://www.opengis.net/gml' 
      xmlns:wfs='http://www.opengis.net/wfs'
      xmlns:xlink='http://www.w3.org/1999/xlink'
      version="1.0">
  <!--
  Description: Convert a Web Map Context into a HTML Legend
  Author:      Cameron Shorter cameron ATshorter.net
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
    <xsl:output method="xml" encoding="utf-8"/>
    
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <xsl:param name="skinDir"/>
    <xsl:param name="selectIcon">/images/id.gif</xsl:param>
    
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
    
  <!-- The name of the javascript context object to call -->
    <xsl:param name="featureName"/>
    <xsl:param name="hidden"/>
    <xsl:param name="context">config.objects.<xsl:value-of select="$modelId"/></xsl:param>
  
  <!-- Main html -->
    <xsl:template match="/wmc:ViewContext">
      <table border="0" cellpadding="1" cellspacing="0">
        <tr>
          <th colspan="3"><xsl:value-of select="$title"/></th>
        </tr>
        <xsl:apply-templates select="wmc:LayerList/*">
          <xsl:sort select="position()" order="descending" data-type="number"/>
        </xsl:apply-templates>
  
      </table>
    </xsl:template>
    
    <xsl:template match="/wmc:OWSContext">
      <table border="0" cellpadding="1" cellspacing="0">
        <tr>
          <th colspan="3">WMS <xsl:value-of select="$title"/></th>
        </tr>
        <xsl:apply-templates select="wmc:ResourceList/wmc:Layer">
          <xsl:sort select="position()" order="descending" data-type="number"/>
        </xsl:apply-templates>
      </table>
    </xsl:template>
    
    <xsl:template match="/wfs:FeatureCollection">
      <table border="0" cellpadding="1" cellspacing="0">
        <tr>
          <th colspan="3">WFS Features</th>
        </tr>
        <tr>
    <!-- Visiblity -->
          <td>
            <xsl:if test="$hidden='false'">
              <input type="checkbox" checked="true" id="legend_{$featureName}" onclick="{$context}.setHidden('{$featureName}',!document.getElementById('legend_{$featureName}').checked)"/>
            </xsl:if>
            <xsl:if test="$hidden='true'">
              <input type="checkbox" id="legend_{$featureName}" onclick="{$context}.setHidden('{$featureName}',! document.getElementById('legend_{$featureName}').checked)"/>
            </xsl:if>
          </td>
    <!-- No query capability yet -->
          <td>
          </td>
          <td>
            <xsl:value-of select="$featureName"/>
          </td>
        </tr>
      </table>
    </xsl:template>
    
  <!-- Layer -->
    <xsl:template match="wmc:Layer">
      <tr>
    <!-- Visiblity -->
        <td>
          <xsl:if test="@hidden='0'">
            <input type="checkbox" checked="true" id="legend_{wmc:Name}" onclick="{$context}.setHidden('{wmc:Name}',!document.getElementById('legend_{wmc:Name}').checked)"/>
          </xsl:if>
          <xsl:if test="@hidden='1'">
            <input type="checkbox" id="legend_{wmc:Name}" onclick="{$context}.setHidden('{wmc:Name}',! document.getElementById('legend_{wmc:Name}').checked)"/>
          </xsl:if>
        </td>
    <!-- Query Image -->
        <td>
          <xsl:if test="@queryable='1'">
            <img
              id="query_{wmc:Name}"
              title="Click to set {wmc:Title} as the query layer"
              onclick="config.objects.{$widgetId}.selectLayer(config.objects.{$widgetId},'{wmc:Name}')"
              src="{$skinDir}{$selectIcon}" />
          </xsl:if>
        </td>
    <!-- Title -->
        <td>
          <xsl:choose>
            <xsl:when test="wmc:Title/@xml:lang">              
              <xsl:value-of select="wmc:Title[@xml:lang=$lang]"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="wmc:Title"/>
            </xsl:otherwise>
          </xsl:choose>
        </td>
      </tr>
    <!-- StyleList -->
      <tr>
        <td></td>
        <td></td>
        <td>
        <xsl:if test="wmc:StyleList/wmc:Style[@current='1']/wmc:LegendURL"> 
            <xsl:element name="IMG">
                <xsl:attribute name="SRC">
                  <xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:LegendURL/wmc:OnlineResource/@xlink:href"/> 
                </xsl:attribute>
            </xsl:element>
           </xsl:if>
        </td>
      </tr>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Loading.js
  
  Index: Loading.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * This widget can be used to insert a message while the Mapbuilder
   * javascript is loading.  The message is removed once Mapbuilder
   * javascript is loaded.  In the main HTML file, insert something like:<br/>
   * &lt;div id="loading"&gt;&lt;p&gt;Loading Program&lt;/p&gt;&lt;/div&gt;.
   * @constructor
   * @base WidgetBase
   * @author Cameron Shorter
   * @param widgetNode The widget's XML object node from the configuration document.
   * @param model The model object that this widget belongs to.
   */
  function Loading(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
  
    /**
     * Remove the contents of the HTML tag for this widget.
     * @param objRef Reference to this object.
     */
    this.paint= function(objRef) {
      while (objRef.node.childNodes.length>0) {
        objRef.node.removeChild(objRef.node.childNodes[0]);
      }
    }
    this.model.addListener("refresh",this.paint, this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Loading.xsl
  
  Index: Loading.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0"
  xmlns:wmc="http://www.opengis.net/context"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Produce an empty output.
  Author:      Cameron Shorter cameron ATshorter.net
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <xsl:param name="lang">en</xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/">
      <i/>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Loading2.js
  
  Index: Loading2.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * This widget is used to display ModelStatus messages.  This widget is used
   * like any other except that it is clreaed on the loadModel event and painted
   * on the "newModel" and "modelStatus" events.
   * Optional config parameters are an image source (usually an animated GIF) in 
   * the imageSource property, an optional static text message to be displayed as 
   * the textMessage property and if the widget is to be displayed over top of a 
   * map you can also specify the mapContainerId property.
   * Dynamic message can be displayed by listening on the "modelStatus" event which
   * sends a message as the parameter.  Send a null message param to clear the widget.
   * @constructor
   * @base WidgetBase
   * @author Mike Adair
   * @param widgetNode The widget's XML object node from the configuration document.
   * @param model The model object that this widget belongs to.
   */
  function Loading2(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
  
    //loading img to be displayed  while models load
    var imageSrc = widgetNode.selectSingleNode("mb:imageSrc");
    if (imageSrc) {
      this.imageSrc = config.skinDir + imageSrc.firstChild.nodeValue;
    } else {
      this.imageSrc = config.skinDir + "/images/Loading.gif";
    }
  
    //a text message to be displayed while models load
    var textMessage = widgetNode.selectSingleNode("mb:textMessage");
    if (textMessage) {
      this.textMessage = textMessage.firstChild.nodeValue;
    } else {
      this.textMessage = "Document loading, please wait...";
    }
    this.updateMessage = this.textMessage;
  
    //check to see if this is to be put over a map if there isa mapContainerID supplied
    var mapContainerNode = widgetNode.selectSingleNode("mb:mapContainerId");
    if (mapContainerNode) {
      this.containerNodeId = mapContainerNode.firstChild.nodeValue;
      this.node = document.getElementById(this.containerNodeId);
    }
  
    //paint it on the "newModel" event, clear it on "loadModel" event
    this.model.addListener("newModel",this.paint, this);
    this.model.addListener("loadModel",this.clear, this);
    this.model.addListener("bbox", this.paint, this );
    this.model.addListener("refresh",this.paint, this);
    this.model.addListener("modelStatus",this.update, this);
  }
  
  /**
   * Render the widget.
   * @param objRef Pointer to widget object.
   */
  Loading2.prototype.paint = function(objRef) {
    if (objRef.node) {
      //create the output node the first time this is called
      var outputNode = document.getElementById( objRef.outputNodeId+"_loading" );
      if (!outputNode) {
        outputNode = document.createElement("div");
        outputNode.setAttribute("id",objRef.outputNodeId+"_loading");
        objRef.node.appendChild(outputNode);
      }
      outputNode.className = "loadingIndicator";
      outputNode.style.zindex = 1000;
      outputNode.style.position="absolute";
      outputNode.style.left='0px';
      outputNode.style.top='0px';
      if (objRef.imageSrc) {
        var imageNode = document.getElementById( objRef.outputNodeId+"_imageNode" );
        if (!imageNode) {
          imageNode = document.createElement("img");
          imageNode.setAttribute("id",objRef.outputNodeId+"_imageNode");
          outputNode.appendChild(imageNode);
          imageNode.style.zindex = 1000;
        }
        imageNode.src = objRef.imageSrc;
      }
      if (objRef.updateMessage) {
        var messageNode = document.getElementById( objRef.outputNodeId+"_messageNode" );
        if (!messageNode) {
          messageNode = document.createElement("p");
          messageNode.setAttribute("id",objRef.outputNodeId+"_messageNode");
          outputNode.appendChild(messageNode);
        }
        messageNode.innerHTML = objRef.updateMessage;
      }
    }
  }
  
  /**
   * Remove the contents of the HTML tag for this widget.
   * @param objRef Reference to this object.
   */
  Loading2.prototype.clear= function(objRef) {
    var outputNode = document.getElementById( objRef.outputNodeId+"_loading" );
    if (outputNode) objRef.node.removeChild(outputNode);
  }
  
  /**
   * Updates the loading indicator with a new message as a "updateStatus" listener.
   * Send an null message to clear the loading indicator.
   * @param objRef Reference to this object.
   */
  Loading2.prototype.update= function(objRef, message) {
    if (message) {
      objRef.updateMessage = message;
      objRef.paint(objRef);
    } else {
      objRef.clear(objRef);
    }
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Locations.js
  
  Index: Locations.js
  ===================================================================
  /*
  Author:       Tom Kralidis
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display predefined locations (as per schema at lib/model/schemas/locations.xsd)
   * into a HTML select box. Changing a location will set the AOI of the targetModel.
   * TBD: projection coordinate conversion still to be implemented.
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  
  function Locations(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    //TBD: implement this in a Locations model
    this.model.getSRS = function(){return "EPSG:4326";}
  
  /**
   * Change the AOI coordinates from select box choice of prefined locations
   * @param bbox the bbox value of the location keyword chosen
   * @param targetModel the model on which to set the AOI
   */
    this.setAoi = function(bbox, targetModel) {
      var bboxArray = new Array();
      bboxArray     = bbox.split(",");
      var ul = new Array(parseFloat(bboxArray[0]),parseFloat(bboxArray[3]));
      var lr = new Array(parseFloat(bboxArray[2]),parseFloat(bboxArray[1]));
      this.model.setParam("aoi",new Array(ul,lr));
  
      //convert this.model XY to latlong
      //convert latlong to targetmodel XY
      this.targetModel.extent.zoomToBox( ul, lr );
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Locations.xsl
  
  Index: Locations.xsl
  ===================================================================
  <?xml version="1.0" encoding="utf-8" standalone="yes"?>
  
  <!--
  
  Description: Convert a Locations XML document (as per schema at lib/model/schemas/locations.xsd)
  
               into a HTML select box
  
  Author:      Tom Kralidis
  
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  
  
  $Id: Locations.xsl,v 1.3 2004/02/27 14:05:36 tomkralidis Exp 
  
  $Name$Name$
  
  -->
  
  
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder">
  
    <xsl:output method="xml" omit-xml-declaration="yes"/>
  
    <xsl:preserve-space elements="gml:name option"/>
  
    
  
    <!-- The common params set for all widgets -->
  
    <xsl:param name="modelId"/>
  
    <xsl:param name="widgetId"/>
  
    <xsl:param name="targetModel"/>
  
    
  
    <xsl:param name="selectSize" select="1"/>
  
    <xsl:param name="selectedOption"/>
  
      
  
    
  
    <xsl:template match="/mb:QuickviewPresetResultSet">
  
    <xsl:variable name="srsName" select="gml:featureMember/mb:locationDef/mb:spatialKeyword/gml:location/gml:Envelope/@srsName"/>
  
      <DIV>
  
      <form>
  
        <select name="locations" onchange="javascript:config.objects.{$widgetId}.setAoi(this.options[this.selectedIndex].value,'{$targetModel}');" size="{$selectSize}">
  
          <xsl:apply-templates select="gml:featureMember/mb:locationDef"/>
  
        </select>
  
      </form>
  
      </DIV>
  
    </xsl:template>
  
  
  
    <xsl:template match="mb:locationDef">
  
      <xsl:variable name="bbox" select="translate(mb:spatialKeyword/gml:location/gml:Envelope/gml:coordinates,' ',',')"/>
  
      <option value="{$bbox}"><xsl:value-of select="gml:name"/></option>
  
    </xsl:template>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapContainerBase.js
  
  Index: MapContainerBase.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/Extent.js");
  
  /**
   * Base class for a MapContainer.  Widgets extending this class will have their
   * output appended to the document in a shared container. 
   * The container instance is specified by the mapContainerId property in config. 
   * Only one instance of the container can be created and it should have only 
   * one model which defines it and set as the widget.containerModel property.  
   * Therefore only the first instance of this class with the given id will actually 
   * create the container div and containerModel property.  
   * Subsequent instances of this class with same mapContainerId will have their
   * widget.node value set to the container node and will have access to a 
   * widget.containerModel property.
   * If the widget has the fixedWidth property set to true, then the width of the
   * MapPane will be taken from the width of the HTML element.  Height will be set
   * to maintain a constant aspect ratio.
   * This widget implements listeners for all mouse event types so that tools can
   * define mouse event callbacks.
   *
   * @constructor
   * @author Mike Adair 
   * @param widget      Pointer to the widget instance being created
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function MapContainerBase(widgetNode,model) {
  
    //make sure that the containerNodeId is set in config
    var mapContainerNode = widgetNode.selectSingleNode("mb:mapContainerId");
    if (mapContainerNode) {
      this.containerNodeId = mapContainerNode.firstChild.nodeValue;
    } else {
      alert("MapContainerBase: required property mapContainerId missing in config:"+this.id);
    }
  
  /**
   * Initialize the container.  Only the first widget to attach to this container
   * configures the container, all others carry out a much simpler initialization.
   * All widgets share the same widget.containerModel, widget.containerModel.extent
   * and HTML containerNode.
   */
    var containerNode = document.getElementById(this.containerNodeId);
    if (containerNode) {
      this.containerModel = containerNode.containerModel;
      model.containerModel = containerNode.containerModel;
      //this.containerModel.addListener("bbox",this.paint,this);
  
      this.setContainerWidth = function(objRef) {
        objRef.node.style.width=objRef.containerModel.getWindowWidth()+'px';
        objRef.node.style.height=objRef.containerModel.getWindowHeight()+'px';
        if (this.stylesheet) {
          this.stylesheet.setParameter("width", objRef.containerModel.getWindowWidth() );
          this.stylesheet.setParameter("height", objRef.containerModel.getWindowHeight() );
        }
      }
  
  /**
   * the containerModel is initialized here
   */
    } else {
      //create the container node and set it's properties
      containerNode = document.createElement("DIV");
      containerNode.setAttribute("id",this.containerNodeId);
      containerNode.id=this.containerNodeId;
      containerNode.style.position="relative";
      containerNode.style.overflow="hidden";
  
      containerNode.containerModel = this.model;
      this.containerModel = this.model;
      model.containerModel = containerNode.containerModel;   
  
      /**
       * method to adjust the width of the container DIV on startup.  If the 
       * <fixedWidth> property is set in config, width and height of the context
       * doc will be adjusted.
       * @param objRef pointer to this object.
       */
      this.setContainerWidth = function(objRef) {
        //adjust the context width and height if required.
        var fixedWidth = widgetNode.selectSingleNode("mb:fixedWidth");
        if ( fixedWidth ) {
          fixedWidth = fixedWidth.firstChild.nodeValue;
          var aspectRatio = objRef.containerModel.getWindowHeight()/objRef.containerModel.getWindowWidth();
          var newHeight = Math.round(aspectRatio*fixedWidth);
          objRef.containerModel.setWindowWidth( fixedWidth );
          objRef.containerModel.setWindowHeight( newHeight );
        }
        objRef.node.style.width=objRef.containerModel.getWindowWidth() +'px';
        objRef.node.style.height=objRef.containerModel.getWindowHeight()+'px';
        if (this.stylesheet) {
          this.stylesheet.setParameter("width", objRef.containerModel.getWindowWidth() );
          this.stylesheet.setParameter("height", objRef.containerModel.getWindowHeight() );
        }
      }
  
      //add the extent tool
      this.containerModel.extent = new Extent( this.containerModel );
      this.containerModel.addListener( "contextLoaded", this.containerModel.extent.firstInit, this.containerModel.extent );
      this.containerModel.addListener( "bbox", this.containerModel.extent.init, this.containerModel.extent );
      this.containerModel.addListener( "resize", this.containerModel.extent.init, this.containerModel.extent );
      //TBD: do an extent history by storing extents every time the aoi changes
  
      /**
       * Called just before paint to set a help message for when the cursor is 
       * over the map container.
        //TBD: implement some sort of map pane hover mechanism to show the tooltip
       * @param objRef pointer to this object.
       */
      this.setTooltip = function(objRef, tooltip) {
        //alert("setting mappane tooltip to:"+tooltip);
      }
      this.containerModel.addListener( "tooltip", this.setTooltip, this);
  
    /** Cross-browser mouse event handling.
      * This function is the event handler for all MapContainer mouse events.
      * Listeners are defined for all the mouse actions.  This includes:
      * "mouseup", "mousedown", "mousemove", "mouseover", "mouseout".
      * This function executes in the context of the MapContainer node, 
      * ie. this = MapContainer node
      * It will set some properties on this node, which is passed on for further 
      * use by any regsitered listeners:
      * * evpl      pixel/line of the event relative to the upper left corner of the DIV.
      * * evxy      projection x and y of the event calculated via the context.extent.
      * * evTarget  projection x and y of the event calculated via the context.extent.
      * * evType    projection x and y of the event calculated via the context.extent.
      * * keypress state for ALT CTL and SHIFT keys.
      *
      * @param ev the mouse event oject passed in from the browser (will be null for IE)
      */
      this.eventHandler=function(ev) {
        if (window.event) {
          //IE events
          var p = window.event.clientX - this.offsetLeft + document.documentElement.scrollLeft + document.body.scrollLeft;
          var l = window.event.clientY - this.offsetTop + document.documentElement.scrollTop + document.body.scrollTop;
          this.evpl = new Array(p,l);
          this.eventTarget = window.event.srcElement;
          this.eventType = window.event.type;
          this.altKey = window.event.altKey;
          this.ctrlKey = window.event.ctrlKey;
          this.shiftKey = window.event.shiftKey;
          window.event.returnValue = false;
          window.event.cancelBubble = true;
        } else {
          //mozilla browsers
          var p = ev.clientX + window.scrollX - this.offsetLeft;
          var l = ev.clientY + window.scrollY - this.offsetTop;
          this.evpl = new Array(p,l);
          this.eventTarget = ev.target;
          this.eventType = ev.type;
          this.altKey = ev.altKey;
          this.ctrlKey = ev.ctrlKey;
          this.shiftKey = ev.shiftKey;
          ev.stopPropagation();
        }
  
        this.containerModel.setParam(this.eventType,this);
        return false;
      }
      this.eventHandler = this.eventHandler;
  
      containerNode.onmousemove = this.eventHandler;
      containerNode.onmouseout = this.eventHandler;
      containerNode.onmouseover = this.eventHandler;
      containerNode.onmousedown = this.eventHandler;
      containerNode.onmouseup = this.eventHandler;
      this.node.appendChild(containerNode);
    }
    this.node = document.getElementById(this.containerNodeId);
  
    this.setContainerWidth = this.setContainerWidth;
    this.containerModel.addFirstListener( "loadModel", this.setContainerWidth, this );
    this.containerModel.addListener( "bbox", this.paint, this );
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapImage.js
  
  Index: MapImage.js
  ===================================================================
  /*
  Author:       Mike Adair
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  
  /**
   * Widget to render a single map layer from an OGC context document.
   * TBD: not yet completed.
   * @constructor
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function MapImage(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
  
    this.paint = function(objRef) {
     if (objRef.model.doc && objRef.node) {
  
        objRef.prePaint(objRef);
  
        //confirm inputs
  
        //set to output to a temporary node
        //hack to get by doc parsing problem in IE
        //the firstChild of tempNode will be the root element output by the stylesheet
        var outputNode = document.getElementById( objRef.outputNodeId );
        var tempNode = document.createElement("DIV");
  
        //here the model document is an image
        tempNode.style.position="absolute";
        tempNode.style.top=0;
        tempNode.style.left=0;
        tempNode.appendChild(objRef.model.doc);   //!!doc is an IMG object
        tempNode.setAttribute("id", objRef.outputNodeId);
  
        //look for this widgets output and replace if found,
        //otherwise append it
        if (outputNode) {
          objRef.node.replaceChild(tempNode,outputNode);
        } else {
          objRef.node.appendChild(tempNode);
        }
  
        objRef.postPaint(objRef);
      }
    }
    this.model.addListener("refresh",this.paint, this);
  
    MapContainerBase.apply(this,new Array(widgetNode, model));
  
    /**
     * Override of widget prepaint to set the width and height of the Map layer
     * document.
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      objRef.model.doc.width = objRef.containerModel.getWindowWidth();
      objRef.model.doc.height = objRef.containerModel.getWindowHeight();
    }
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapImage.xsl
  
  Index: MapImage.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0"
  xmlns:wmc="http://www.opengis.net/context"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Widget to render a single map layer from an OGC context document.
  Author:      Cameron Shorter cameron ATshorter.net
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapPane.js
  
  Index: MapPane.js
  ===================================================================
  /*
  Author:       Cameron Shorter cameronAtshorter.net
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  
  /**
   * Widget to render a map from an OGC context document.  The layers are rendered
   * as an array of DHTML layers that contain an <IMG> tag with src attribute set 
   * to the GetMap request.
   * @constructor
   * @base WidgetBaseXSL
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function MapPane(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
    MapContainerBase.apply(this,new Array(widgetNode, model));
  
    // Set this.stylesheet
    // Defaults to "widget/<widgetName>.xsl" if not defined in config file.
    if ( !this.stylesheet ) {
      var styleNode = widgetNode.selectSingleNode("mb:stylesheet");
      if (styleNode ) {
        this.stylesheet = new XslProcessor(styleNode.firstChild.nodeValue,model.namespace);
      } else {
        this.stylesheet = new XslProcessor(baseDir+"/widget/"+widgetNode.nodeName+".xsl",model.namespace);
      }
    }
  
    //loading img to be displayed while models load
    var loadingSrc = widgetNode.selectSingleNode("mb:loadingSrc");
    if (loadingSrc) {
      this.loadingSrc = config.skinDir + loadingSrc.firstChild.nodeValue;
    } else {
      this.loadingSrc = config.skinDir + "/images/Loading.gif";
    }
  
    // Set stylesheet parameters for all the child nodes from the config file
    for (var j=0;j<widgetNode.childNodes.length;j++) {
      if (widgetNode.childNodes[j].firstChild
        && widgetNode.childNodes[j].firstChild.nodeValue)
      {
        this.stylesheet.setParameter(
          widgetNode.childNodes[j].nodeName,
          widgetNode.childNodes[j].firstChild.nodeValue);
      }
    }
  
    //all stylesheets will have these properties available
    this.stylesheet.setParameter("modelId", this.model.id );
    this.stylesheet.setParameter("modelTitle", this.model.title );
    this.stylesheet.setParameter("widgetId", this.id );
    this.stylesheet.setParameter("skinDir", config.skinDir );
    this.stylesheet.setParameter("lang", config.lang );
  
  
    /**
     * Called when the context's hidden attribute changes.
     * @param objRef This object.
     * @param layerName  The name of the layer that was toggled.
     */
    this.hiddenListener=function(objRef, layerName){
      var vis="visible";
      if(objRef.model.getHidden(layerName)=="1") {
        vis="hidden";
      }
      var layerId = objRef.model.id + "_" + objRef.id + "_" + layerName;
      var layer = document.getElementById(layerId);
      if (layer) {
        layer.style.visibility=vis;
        imgId = "real"+layer.imgId;
        img = document.getElementById(imgId); // Hack to make sure that the child element is toggled in IE
        if(img) img.style.visibility=vis;
      }
    }
    this.model.addListener("hidden",this.hiddenListener,this);
  
    /**
     * Called after a feature has been added to a WFS.  This function triggers
     * the WMS basemaps to be redrawn.  A timestamp param is added to the URL
     * to ensure the basemap image is not cached.
     */
    this.refreshWmsLayers=function(objRef){
      objRef.d=new Date();
      objRef.stylesheet.setParameter("uniqueId",objRef.d.getTime());
      objRef.paint(objRef);
    }
    this.model.addListener("refreshWmsLayers",this.refreshWmsLayers,this);
  
    this.model.addListener("refresh",this.paint, this);
    this.model.addListener("addLayer",this.addLayer, this);
    this.model.addListener("deleteLayer",this.deleteLayer, this);
    this.model.addListener("moveLayerUp",this.moveLayerUp, this);
    this.model.addListener("moveLayerDown",this.moveLayerDown, this);
  }
  
  /**
   * Render the widget.
   * @param objRef Pointer to widget object.
   */
  MapPane.prototype.paint = function(objRef, refresh) {
  
    if (objRef.model.doc && objRef.node && (objRef.autoRefresh||refresh) ) {
      //if (objRef.debug) alert("source:"+Sarissa.serialize(objRef.model.doc));
  
      objRef.stylesheet.setParameter("width", objRef.model.getWindowWidth());
      objRef.stylesheet.setParameter("height", objRef.model.getWindowHeight());
      objRef.stylesheet.setParameter("bbox", objRef.model.getBoundingBox().join(","));
      objRef.stylesheet.setParameter("srs", objRef.model.getSRS());
  
      //confirm inputs
      if (objRef.debug) alert("painting:"+Sarissa.serialize(objRef.model.doc));
      if (objRef.debug) alert("stylesheet:"+Sarissa.serialize(objRef.stylesheet.xslDom));
  
      //process the doc with the stylesheet
      var tempDom = objRef.stylesheet.transformNodeToObject(objRef.model.doc);
      var tempNodeList = tempDom.selectNodes("//img");
  
      //debug output
      if (objRef.debug) {
        alert("painting:"+objRef.id+":"+s);
        if (config.serializeUrl) postLoad(config.serializeUrl, s);
      }
  
      //create a DIV to hold all the individual image DIVs
      var outputNode = document.getElementById( objRef.outputNodeId );
      if (!outputNode) {
        outputNode = document.createElement("div");
        outputNode.setAttribute("id", objRef.outputNodeId);
        outputNode.style.position = "absolute"; 
        objRef.node.appendChild(outputNode);
        outputNode.style.left='0px';
        outputNode.style.top='0px';
      } 
  
      //loop through all layers and create an array of IMG objects for preloading 
      // the WMS getMap calls
      var layers = objRef.model.getAllLayers();
      if (!objRef.imageStack) objRef.imageStack = new Array(layers.length);
      objRef.firstImageLoaded = false;
  
      objRef.layerCount = layers.length;
  
      for (var i=0;i<layers.length;i++){
        if (!objRef.imageStack[i]) {
          objRef.imageStack[i] = new Image();
          objRef.imageStack[i].objRef = objRef;
        }
        //var newSrc = tempNode.firstChild.childNodes[i].firstChild.getAttribute("src"); 
        var newSrc = tempNodeList[i].getAttribute("src");
        objRef.loadImgDiv(layers[i],newSrc,objRef.imageStack[i]);
      }
      var message = "loading " + objRef.layerCount + " map layer" + ((objRef.layerCount>1)?"s":"");
      objRef.model.setParam("modelStatus", message);
    }
  }
  
  /**
   * Returns an ID for the image DIV given a layer name
   * @param layerName the name of the WMS layer
   */
  MapPane.prototype.getLayerDivId = function(layerName) {
    return this.model.id +"_"+ this.id +"_"+ layerName; //TBD: add in timestamps
  }
  
  /**
   * Adds a layer into the output
   * @param layerName the WMS anme for the layer to be removed
   */
  MapPane.prototype.addLayer = function(objRef, layerNode) {
  
    ++objRef.layerCount;
    var message = "loading " + objRef.layerCount + " map layer" + ((objRef.layerCount>1)?"s":"");
    objRef.model.setParam("modelStatus", message);
  
    //process the doc with the stylesheet
    objRef.stylesheet.setParameter("width", objRef.model.getWindowWidth());
    objRef.stylesheet.setParameter("height", objRef.model.getWindowHeight());
    objRef.stylesheet.setParameter("bbox", objRef.model.getBoundingBox().join(","));
    objRef.stylesheet.setParameter("srs", objRef.model.getSRS());
    var s = objRef.stylesheet.transformNodeToString(layerNode);
    var tempNode = document.createElement("div");
    tempNode.innerHTML = s;
    var newSrc = tempNode.firstChild.firstChild.getAttribute("src"); 
  
    objRef.imageStack.push(new Image());
    objRef.imageStack[objRef.imageStack.length-1].objRef = objRef;
    objRef.firstImageLoaded = true;
    objRef.loadImgDiv(layerNode,newSrc,objRef.imageStack[objRef.imageStack.length-1]);
  }
  
  /**
   * Removes a layer from the output
   * @param layerName the WMS anme for the layer to be removed
   */
  MapPane.prototype.deleteLayer = function(objRef, layerName) {
    var imgDivId = objRef.getLayerDivId(layerName); 
    var imgDiv = document.getElementById(imgDivId);
    var outputNode = document.getElementById( objRef.outputNodeId );
    outputNode.removeChild(imgDiv);
  }
  
  /**
   * Moves a layer up in the stack of map layers
   * @param layerName the WMS anme for the layer to be removed
   */
  MapPane.prototype.moveLayerUp = function(objRef, layerName) {
    var outputNode = document.getElementById( objRef.outputNodeId );
    var imgDivId = objRef.getLayerDivId(layerName); 
    var movedNode = document.getElementById(imgDivId);
    var sibNode = movedNode.nextSibling;
    if (!sibNode) {
      alert("can't move node past beginning of list:"+layerName);
      return;
    }
    outputNode.insertBefore(sibNode,movedNode);
  }
  
  /**
   * Moves a layer up in the stack of map layers
   * @param layerName the WMS anme for the layer to be removed
   */
  MapPane.prototype.moveLayerDown = function(objRef, layerName) {
    var outputNode = document.getElementById( objRef.outputNodeId );
    var imgDivId = objRef.getLayerDivId(layerName); 
    var movedNode = document.getElementById(imgDivId);
    var sibNode = movedNode.previousSibling;
    if (!sibNode) {
      alert("can't move node past end of list:"+layerName);
      return;
    }
    outputNode.insertBefore(movedNode,sibNode);
  }
  
  /**
   * sets up the image div to be loaded.  Images are preloaded in the imageStack
   * array and replaced in the document DOM in the onload handler
   * @param layerNode the context layer to be loaded
   * @param newSrc the new URL to be used for the image
   * @param newImg an HTML IMG object to pre-load the image in
   */
  MapPane.prototype.loadImgDiv = function(layerNode,newSrc,newImg) {
    var outputNode = document.getElementById( this.outputNodeId );
    var layerName = layerNode.selectSingleNode("wmc:Name").firstChild.nodeValue;  
    var layerHidden = (layerNode.getAttribute("hidden")==1)?true:false;  
    var imageFormat = "image/gif";
    var imageFormatNode = layerNode.selectSingleNode("wmc:FormatList/wmc:Format[@current='1']");  
    if (imageFormatNode) imageFormat = imageFormatNode.firstChild.nodeValue;  
  
    //make sure there is an image DIV in the output node for this layer
    var imgDivId = this.getLayerDivId(layerName); 
    var imgDiv = document.getElementById(imgDivId);
    if (!imgDiv) {
      imgDiv = document.createElement("div");
      imgDiv.setAttribute("id", imgDivId);
      imgDiv.style.position = "absolute"; 
      imgDiv.style.visibility = (layerHidden)?"hidden":"visible";
      imgDiv.style.top = '0px'; 
      imgDiv.style.left = '0px';
      imgDiv.imgId = Math.random().toString(); 
      var domImg = document.createElement("img");
      domImg.id = "real"+imgDiv.imgId;
      //domImg.src = this.loadingSrc;
      domImg.src = config.skinDir+"/images/Spacer.gif";
      domImg.layerHidden = layerHidden;
      imgDiv.appendChild(domImg);
      outputNode.appendChild(imgDiv);
    }
  
    // preload image
    newImg.id = imgDiv.imgId;
    newImg.hidden = layerHidden;
    newImg.fixPng = false;
    if (_SARISSA_IS_IE && imageFormat=="image/png") newImg.fixPng = true;
    newImg.onload = MapImgLoadHandler;
    newImg.src = newSrc;
  }
  
  /**
  * image onload handler function.
  * Replaces the source with the new one and fixes the displacement to 
  * compensate the container main div displacement to result in in a zero displacement.
  * The first image to be returned will hide all other layers and re-position them
  * and they are made visible when their onload event fires.
  */
  function MapImgLoadHandler() {
    var oldImg = document.getElementById("real"+this.id );
  
    if (!this.objRef.firstImageLoaded) {
      this.objRef.firstImageLoaded = true;
      var outputNode = document.getElementById( this.objRef.outputNodeId );
      var siblingImageDivs = outputNode.childNodes;
      for (var i=0; i<siblingImageDivs.length ;++i) {
        var sibImg = siblingImageDivs[i].firstChild;
        sibImg.parentNode.style.visibility = "hidden";
        sibImg.style.visibility = "hidden";//Make sure for IE that the child node is hidden as well
        if (_SARISSA_IS_IE) sibImg.src = config.skinDir+"/images/Spacer.gif";
      }
      if (_SARISSA_IS_IE) siblingImageDivs[0].firstChild.parentNode.parentNode.style.visibility = "hidden";
      outputNode.style.left='0px';
      outputNode.style.top='0px';
    }
  
    --this.objRef.layerCount;
    if (this.objRef.layerCount > 0) {
      var message = "loading " + this.objRef.layerCount + " map layers"
      this.objRef.model.setParam("modelStatus", message);
    } else {
      this.objRef.model.setParam("modelStatus");
    }
  
    if (_SARISSA_IS_IE) oldImg.parentNode.parentNode.style.visibility = "visible";
    if (this.fixPng) {
      var vis = oldImg.layerHidden?"hidden":"visible";
      oldImg.outerHTML = fixPNG(this,"real"+this.id);
      if (!this.hidden) {
        fixImg = document.getElementById("real"+this.id); // The result of fixPng is a span, so we need to set that particular element visible
        fixImg.style.visibility = "visible"
      }
    } else {
      oldImg.src = this.src;
      oldImg.width = this.objRef.model.getWindowWidth();
      oldImg.height = this.objRef.model.getWindowHeight();
      if (!this.hidden) {
        oldImg.parentNode.style.visibility = "visible";
        oldImg.style.visibility = "visible"; //Make sure for IE that the child node is visible as well
      }
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapPane.xsl
  
  Index: MapPane.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!--
  Description: parses an OGC context document to generate an array of DHTML layers
              that contain an <IMG> tag with src attribute set to the GetMap request.
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" xmlns:wmc="http://www.opengis.net/context" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
    <!--
    <xsl:include href="ogcMapImgObjects.xsl" />
    -->
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="context">config['<xsl:value-of select="$modelId"/>']</xsl:param>
    <xsl:param name="extraAttributes">true</xsl:param>
    <xsl:param name="isIE">false</xsl:param>
    <xsl:param name="outputNodeId"/>
  
    <xsl:param name="bbox">
      <xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@minx"/>,<xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@miny"/>,
      <xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@maxx"/>,<xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@maxy"/>
    </xsl:param>
    <xsl:param name="width">
      <xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:Window/@width"/>
    </xsl:param>
    <xsl:param name="height">
      <xsl:value-of select="/wmc:ViewContext/wmc:General/wmc:Window/@height"/>
    </xsl:param>
    <xsl:param name="srs" select="/wmc:ViewContext/wmc:General/wmc:BoundingBox/@SRS"/>
    <xsl:param name="timeList"/>
    <xsl:param name="timeListName"/>
    <xsl:param name="uniqueId"/>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/wmc:ViewContext">
        <div STYLE="position:absolute; width:{$width}px; height:{$height}px" ID="{$outputNodeId}">
          <xsl:apply-templates select="wmc:LayerList/wmc:Layer"/>
        </div>
    </xsl:template>
    
    <xsl:template match="wmc:Layer">
    
      <xsl:choose>
        <xsl:when test="$timeList and wmc:DimensionList/wmc:Dimension[@name='time']">
            <xsl:call-template name="tokenize">
              <xsl:with-param name="str" select="$timeList"/>
              <xsl:with-param name="sep" select="','"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:call-template name="layerOutput"/>
        </xsl:otherwise>
      </xsl:choose>
      
    </xsl:template>
  
    <xsl:template match="wmc:StyledLayerDescriptor">
      <xsl:apply-templates mode="serialize" select="."/>
    </xsl:template>
  
    <xsl:template name="layerOutput">
      <xsl:param name="version">
          <xsl:value-of select="wmc:Server/@version"/>    
      </xsl:param>
      <xsl:param name="baseUrl">
          <xsl:value-of select="wmc:Server/wmc:OnlineResource/@xlink:href"/>    
      </xsl:param>
      <xsl:param name="timestamp"><xsl:value-of select="wmc:DimensionList/wmc:Dimension[@name='time']/@default"/></xsl:param>
      <xsl:param name="metadataUrl">
          <xsl:value-of select="wmc:MetadataURL/wmc:OnlineResource/@xlink:href"/>    
      </xsl:param>
      <xsl:param name="format">
        <xsl:choose>
          <xsl:when test="wmc:FormatList"><xsl:value-of select="wmc:FormatList/wmc:Format[@current='1']"/></xsl:when>
          <xsl:otherwise>image/gif</xsl:otherwise>
        </xsl:choose>
      </xsl:param>
      <xsl:param name="visibility">
        <xsl:choose>
          <xsl:when test="starts-with($isIE,'true') and $format='image/png'">hidden</xsl:when>
          <xsl:when test="@hidden='1'">hidden</xsl:when>
          <xsl:otherwise>visible</xsl:otherwise>
        </xsl:choose>
      </xsl:param>
      <xsl:param name="layerName">
        <xsl:call-template name="replace-string">
          <xsl:with-param name="text"><xsl:value-of select="wmc:Name"/></xsl:with-param>
          <xsl:with-param name="replace"><xsl:value-of select="' '"/></xsl:with-param>
          <xsl:with-param name="with"><xsl:value-of select="'+'"/></xsl:with-param>
        </xsl:call-template>
      </xsl:param>
      <xsl:variable name="styleParam">
        <xsl:choose>
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:OnlineResource">
            SLD=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:OnlineResource/@xlink:href"/>
          </xsl:when>
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:StyledLayerDescriptor">
            SLD_BODY=<xsl:apply-templates select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:StyledLayerDescriptor" />
          </xsl:when>
          <xsl:when test="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:FeatureTypeStyle">
            SLD=<xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:SLD/wmc:FeatureTypeStyle"/>
          </xsl:when>
          <xsl:otherwise>
            STYLES=<xsl:call-template name="replace-string">
              <xsl:with-param name="text"><xsl:value-of select="wmc:StyleList/wmc:Style[@current='1']/wmc:Name"/></xsl:with-param>
              <xsl:with-param name="replace"><xsl:value-of select="' '"/></xsl:with-param>
              <xsl:with-param name="with"><xsl:value-of select="'+'"/></xsl:with-param>
            </xsl:call-template>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="firstJoin">
        <xsl:choose>
          <xsl:when test="substring($baseUrl,string-length($baseUrl))='?'"></xsl:when>
          <xsl:when test="contains($baseUrl, '?')">&amp;</xsl:when> 
          <xsl:otherwise>?</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="mapRequest">
        <xsl:choose>
          <xsl:when test="starts-with($version, '1.0')">
              WMTVER=<xsl:value-of select="$version"/>&amp;REQUEST=map
          </xsl:when>            
          <xsl:otherwise>
              VERSION=<xsl:value-of select="$version"/>&amp;REQUEST=GetMap&amp;SERVICE=WMS
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
  
      <div>    
        <xsl:attribute name="style">position:absolute; visibility:<xsl:value-of select="$visibility"/>; top:0px; left:0px;</xsl:attribute>
        <xsl:attribute name="id">
          <xsl:value-of select="$modelId"/>_<xsl:value-of select="$widgetId"/>_<xsl:value-of select="$layerName"/><xsl:if test="$timestamp and wmc:DimensionList/wmc:Dimension[@name='time']">_<xsl:value-of select="$timestamp"/></xsl:if>
        </xsl:attribute>
        <xsl:if test="$timestamp and wmc:DimensionList/wmc:Dimension[@name='time']">
          <xsl:attribute name="time"><xsl:value-of select="$timestamp"/></xsl:attribute>
        </xsl:if>
      
      <xsl:element name="img">    
          <xsl:variable name="src">    
              <xsl:value-of select="$baseUrl"/>
              <xsl:value-of select="$firstJoin"/>
              <xsl:value-of select="$mapRequest"/>
  &amp;LAYERS=<xsl:value-of select="$layerName"/>
     &amp;SRS=<xsl:value-of select="$srs"/>
    &amp;BBOX=<xsl:value-of select="$bbox"/>
   &amp;WIDTH=<xsl:value-of select="$width"/>
  &amp;HEIGHT=<xsl:value-of select="$height"/>
  &amp;FORMAT=<xsl:value-of select="$format"/>
         &amp;<xsl:value-of select="$styleParam"/>
  &amp;TRANSPARENT=TRUE
          <xsl:if test="string-length($timestamp)>0"> 
         &amp;TIME=<xsl:value-of select="$timestamp"/>
          </xsl:if>
          &amp;UNIQUEID=<xsl:value-of select="$uniqueId"/>
  <!--	
    //TBD: these still to be properly handled 
    //if (this.exceptions) src += '&' + 'EXCEPTIONS=' + this.exceptions;
    //if (this.vendorstr) src += '&' + this.vendorstr;
    // -->
          </xsl:variable>
          <xsl:attribute name="src">    
              <xsl:value-of select="translate(normalize-space($src),' ', '' )" disable-output-escaping="no"/>
          </xsl:attribute>
          <xsl:attribute name="width">
              <xsl:value-of select="$width"/>
          </xsl:attribute>
          <xsl:attribute name="height">
              <xsl:value-of select="$height"/>
          </xsl:attribute>
          <xsl:if test="starts-with($extraAttributes,'true')">
            <xsl:attribute name="alt">
                <xsl:value-of select="wmc:Title"/>
            </xsl:attribute>
            <xsl:attribute name="title">
                <xsl:value-of select="wmc:Title"/>
            </xsl:attribute>
            <xsl:if test="string-length($metadataUrl)>0">
              <xsl:attribute name="longdesc"><xsl:value-of select="$metadataUrl"/></xsl:attribute>
            </xsl:if>
          </xsl:if>
      </xsl:element>    
      </div>    
    </xsl:template>
  
    
    <xsl:template name="tokenize"> <!-- tokenize a string -->
     <xsl:param name="str"/> <!-- String to process -->
     <xsl:param name="sep"/> <!-- Legal separator character -->
     <xsl:choose>
      <xsl:when test="contains($str,$sep)"> <!-- Only tokenize if there is a separator present in the string -->
        <xsl:call-template name="process-token"> <!-- Process the token before the separator -->
          <xsl:with-param name="token" select="substring-before($str,$sep)"/>
        </xsl:call-template>
        <xsl:call-template name="tokenize">  <!-- Re-tokenize the new string which is contained after the separator -->
          <xsl:with-param name="str" select="substring-after($str,$sep)"/>
          <xsl:with-param name="sep" select="$sep"/> <!-- carriage return -->
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>  <!-- If there is nothing else to tokenize, just treat the last part of the str as a regular token -->
        <xsl:call-template name="process-token">
          <xsl:with-param name="token" select="$str"/>
        </xsl:call-template>
      </xsl:otherwise>
     </xsl:choose>
    </xsl:template>
  
    <xsl:template name="process-token">  <!-- process - separate with <br> -->
      <xsl:param name="token"/> <!-- token to process -->
      <xsl:call-template name="layerOutput">
        <xsl:with-param name="timestamp" select="$token"/>
        <xsl:with-param name="visibility">hidden</xsl:with-param>
      </xsl:call-template>
    </xsl:template>
    
  <!-- String replacemnent -->
  <xsl:template name="replace-string">
    <xsl:param name="text"/>
    <xsl:param name="replace"/>
    <xsl:param name="with"/>
    <xsl:choose>
      <xsl:when test="contains($text,$replace)">
        <xsl:value-of select="substring-before($text,$replace)"/>
        <xsl:value-of select="$with"/>
        <xsl:call-template name="replace-string">
          <xsl:with-param name="text" select="substring-after($text,$replace)"/>
          <xsl:with-param name="replace" select="$replace"/>
          <xsl:with-param name="with" select="$with"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  
  <!-- escape URI -->
  <xsl:template name="escape-uri">
    <xsl:param name="text"/>
  
    <xsl:param name="tmp">
    <xsl:call-template name="replace-string">
      <xsl:with-param name="text" select="$text"/>
      <xsl:with-param name="replace" select="' '"/>
      <xsl:with-param name="with" select="'%20'"/>
    </xsl:call-template>
    </xsl:param>
  
    <xsl:call-template name="replace-string">
      <xsl:with-param name="text" select="$tmp"/>
      <xsl:with-param name="replace" select="'#'"/>
      <xsl:with-param name="with" select="'%23'"/>
    </xsl:call-template>
  
  </xsl:template>
  
  <!-- Serialize node using escape URI -->
  <xsl:template match="*" mode="serialize">
    <xsl:param name="count"><xsl:value-of select="count(*)"/></xsl:param>
    <xsl:param name="value"><xsl:apply-templates mode="serialize"/></xsl:param>
  
    <xsl:text/>%3C<xsl:value-of select="name()"/>
    <xsl:apply-templates select="@*" mode="serialize"/>%3E<xsl:text/>
    <xsl:choose>
      <xsl:when test="$count=0"> 
        <xsl:call-template name="escape-uri">
          <xsl:with-param name="text" select="$value"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$value"/>    
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text/>%3C/<xsl:value-of select="name()"/>%3E<xsl:text/>
  </xsl:template>
  
  <xsl:template match="@*" mode="serialize">
    <xsl:param name="value"><xsl:value-of select="."/></xsl:param>
    <!-- Attention: double quotes (%22) around parametr break it somewhere -->
    %20<xsl:value-of select="name()"/>=%22
    <xsl:call-template name="escape-uri">
      <xsl:with-param name="text" select="$value"/>
    </xsl:call-template>%22
  </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapScaleBar.js
  
  Index: MapScaleBar.js
  ===================================================================
  /*
  JavaScript Scalebar for MapServer (scalebar.js)
  
  Copyright (c) 2005 Tim Schaub of CommEn Space (http://www.commenspace.org)
  
  This is free software; you can redistribute it and/or modify it under
  the terms of the GNU Lesser General Public License as published by the
  Free Software Foundation; either version 2.1 of the License, or (at
  your option) any later version.
  
  This software is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  License for more details.
  
  You should have received a copy of the GNU Lesser General Public License
  along with this software; if not, write to the Free Software Foundation,
  Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  
  v1.3 - scalebar is now centered on .sbWrapper div by default, more css control
       - reduced likelihood of displaying very large numbers
       - added condition to deal with @import styles (thanks dokai)
  
  */
  /*
  adapted from http://mapserver.commenspace.org/tools/scalebar/
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * Widget to display the scale of a map as a graphical bar.  The model of this widget
   * must have an extent object associated with it which is the case when the 
   * model has a MapContanier widget.
   *
   * @constructor
   * @base WidgetBase
   * @param widgetNode  This widget's object node from the configuration document.
   * @param model       The model that this widget is a view of.
   */
  
  function MapScaleBar(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
  
  	// default properties
  	// may be modified after construction
  	// if modified after ScaleBar.place(), use ScaleBar.update()
  	this.scaleDenominator = 1;    //this will get updated on the first paint
  
  	this.displaySystem = 'metric'; // metric or english supported
    var displaySystem = widgetNode.selectSingleNode("mb:displaySystem");
    if (displaySystem) this.displaySystem = displaySystem.firstChild.nodeValue;
  
  	this.minWidth = 100; // pixels
    var minWidth = widgetNode.selectSingleNode("mb:minWidth");
    if (minWidth) this.minWidth = minWidth.firstChild.nodeValue;
  
  	this.maxWidth = 200; // pixels
    var maxWidth = widgetNode.selectSingleNode("mb:maxWidth");
    if (maxWidth) this.maxWidth = maxWidth.firstChild.nodeValue;
  
  	this.divisions = 2;
    var divisions = widgetNode.selectSingleNode("mb:divisions");
    if (divisions) this.divisions = divisions.firstChild.nodeValue;
  
  	this.subdivisions = 2;
    var subdivisions = widgetNode.selectSingleNode("mb:subdivisions");
    if (subdivisions) this.subdivisions = subdivisions.firstChild.nodeValue;
  
  	this.showMinorMeasures = false;
    var showMinorMeasures = widgetNode.selectSingleNode("mb:showMinorMeasures");
    if (showMinorMeasures && showMinorMeasures.firstChild.nodeValue=="true") this.showMinorMeasures = true;
  
  	this.abbreviateLabel = false;
    var abbreviateLabel = widgetNode.selectSingleNode("mb:abbreviateLabel");
    if (abbreviateLabel && abbreviateLabel.firstChild.nodeValue=="true") this.abbreviateLabel = true;
  
  	this.singleLine = false;
    var singleLine = widgetNode.selectSingleNode("mb:singleLine");
    if (singleLine && singleLine.firstChild.nodeValue=="true") this.singleLine = true;
  
  	this.align = 'center'; // left, center, or right supported
    var align = widgetNode.selectSingleNode("mb:align");
    if (align) this.align = align.firstChild.nodeValue;
  
  	this.resolution = 72; // dpi
  
  	// create scalebar elements
  	this.container = document.createElement('div');
  	this.container.className = 'sbWrapper';
  	this.container.style.position = 'relative';
  	this.container.setAttribute("id",this.outputNodeId);
  	this.labelContainer = document.createElement('div');
  	this.labelContainer.className = 'sbUnitsContainer';
  	this.labelContainer.style.position = 'absolute';
  	this.graphicsContainer = document.createElement('div');
  	this.graphicsContainer.style.position = 'absolute';
  	this.graphicsContainer.className = 'sbGraphicsContainer';
  	this.numbersContainer = document.createElement('div');
  	this.numbersContainer.style.position = 'absolute';
  	this.numbersContainer.className = 'sbNumbersContainer';
  
  	// private functions
  	// put in some markers and bar pieces so style attributes can be grabbed
  	// this is a solution for Safari support
  	var markerMajor = document.createElement('div');
  	markerMajor.className = 'sbMarkerMajor';
  	this.graphicsContainer.appendChild(markerMajor);
  	var markerMinor = document.createElement('div');
  	markerMinor.className = 'sbMarkerMinor';
  	this.graphicsContainer.appendChild(markerMinor);
  	var barPiece = document.createElement('div');
  	barPiece.className = 'sbBar';
  	this.graphicsContainer.appendChild(barPiece);
  	var barPieceAlt = document.createElement('div');
  	barPieceAlt.className = 'sbBarAlt';
  	this.graphicsContainer.appendChild(barPieceAlt);
  
    /**
     * adds a bbox listener on the model 
     */
    this.model.addListener("bbox", this.update, this);
    this.model.addListener("refresh", this.update, this);
  }
  
  /**
   * Render the widget.
   * @param objRef Pointer to widget object.
   */
  MapScaleBar.prototype.update = function(objRef) {
  
    //create the output node the first time this is called
    var outputNode = document.getElementById( objRef.outputNodeId );
    if (!outputNode) objRef.node.appendChild(objRef.container);
  
    var scaleDenominator = objRef.model.extent.getScale()
  	if(scaleDenominator != null) {
  		objRef.scaleDenominator = scaleDenominator;
  	}
  	// local functions (and object constructors)
  	function HandsomeNumber(smallUglyNumber, bigUglyNumber, sigFigs) {
  		var sigFigs = (sigFigs == null) ? 10 : sigFigs;
  		var bestScore = Number.POSITIVE_INFINITY;
  		var bestTieBreaker = Number.POSITIVE_INFINITY;
  		// if all else fails, return a small ugly number
  		var handsomeValue = smallUglyNumber;
  		var handsomeNumDec = 3;
  		// try the first three comely multiplicands (in order of comliness)
  		for(var halvingExp = 0; halvingExp < 3; ++halvingExp) {
  			var comelyMultiplicand = Math.pow(2, (-1 * halvingExp));
  			var maxTensExp = Math.floor(Math.log(bigUglyNumber / comelyMultiplicand) / Math.LN10)
  			for(var tensExp = maxTensExp; tensExp > (maxTensExp - sigFigs + 1); --tensExp) {
  				var numDec = Math.max(halvingExp - tensExp, 0);
  				var testMultiplicand = comelyMultiplicand * Math.pow(10, tensExp);
  				// check if there is an integer multiple of testMultiplicand between smallUglyNumber and bigUglyNumber
  				if((testMultiplicand * Math.floor(bigUglyNumber / testMultiplicand)) >= smallUglyNumber) {
  					// check if smallUglyNumber is an integer multiple of testMultiplicand
  					if(smallUglyNumber % testMultiplicand == 0) {
  						var testMultiplier = smallUglyNumber / testMultiplicand;
  					}
  					// otherwise go for the smallest integer multiple between small and big
  					else {
  						var testMultiplier = Math.floor(smallUglyNumber / testMultiplicand) + 1;
  					}
  					// test against the best (lower == better)
  					var testScore = testMultiplier + (2 * halvingExp);
  					var testTieBreaker = (tensExp < 0) ? (Math.abs(tensExp) + 1) : tensExp;
  					if((testScore < bestScore) || ((testScore == bestScore) && (testTieBreaker < bestTieBreaker))) {
  						bestScore = testScore;
  						bestTieBreaker = testTieBreaker;
  						handsomeValue = (testMultiplicand * testMultiplier).toFixed(numDec);
  						handsomeNumDec = numDec;
  					}
  				}
  			}
  		}
  		this.value = handsomeValue;
  		this.score = bestScore;
  		this.tieBreaker = bestTieBreaker;
  		this.numDec = handsomeNumDec;
  	}
  	HandsomeNumber.prototype.toString = function() {
  		return this.value.toString();
  	}
  	HandsomeNumber.prototype.valueOf = function() {
  		return this.value;
  	}
  	function styleValue(aSelector, styleKey) {
  		// returns an integer value associated with a particular selector and key
  		// given a stylesheet with .someSelector {border: 2px solid red}
  		// styleValue('.someSelector', 'borderWidth') returns 2
  		var aValue = 0;
  		if(document.styleSheets) {
  			for(var sheetIndex = document.styleSheets.length - 1; sheetIndex >= 0; --sheetIndex) {
  				var aSheet = document.styleSheets[sheetIndex];
  				if(!aSheet.disabled) {
  					var allRules;
  					if(typeof(aSheet.cssRules) == 'undefined') {
  						if(typeof(aSheet.rules) == 'undefined') {
  							// can't get rules, assume zero
  							return 0;
  						}
  						else {
  							allRules = aSheet.rules;
  						}
  					}
  					else {
  						allRules = aSheet.cssRules;
  					}
  					for(var ruleIndex = 0; ruleIndex < allRules.length; ++ruleIndex) {
  						var aRule = allRules[ruleIndex];
  						if(aRule.selectorText && (aRule.selectorText.toLowerCase() == aSelector.toLowerCase())) {
  							if(aRule.style[styleKey] != '') {
  								aValue = parseInt(aRule.style[styleKey]);
  							}
  						}
  					}
  				}
  			}
  		}
  		// if the styleKey was not found, the equivalent value is zero
  		return aValue ? aValue : 0;
  	}
  	function formatNumber(aNumber, numDecimals) {
  		numDecimals = (numDecimals) ? numDecimals : 0;
  		var formattedInteger = '' + Math.round(aNumber);
  		var thousandsPattern = /(-?[0-9]+)([0-9]{3})/;
  		while(thousandsPattern.test(formattedInteger)) {
  			formattedInteger = formattedInteger.replace(thousandsPattern, '$1,$2');
  		}
  		if(numDecimals > 0) {
  			var formattedDecimal = Math.floor(Math.pow(10, numDecimals) * (aNumber - Math.round(aNumber)));
  			if(formattedDecimal == 0) {
  				return formattedInteger;
  			}
  			else {
  				return formattedInteger + '.' + formattedDecimal;
  			}
  		}
  		else {
  			return formattedInteger;
  		}
  	}
  	// update the container title (for displaying scale as a tooltip)
  	objRef.container.title = 'scale 1:' + formatNumber(objRef.scaleDenominator);
  	// measurementProperties holds display units, abbreviations,
  	// and conversion to inches (since we're using dpi) - per measurement sytem
  	var measurementProperties = new Object();
  	measurementProperties.english = {
  		units: ['miles', 'feet', 'inches'],
  		abbr: ['mi', 'ft', 'in'],
  		inches: [63360, 12, 1]
  	}
  	measurementProperties.metric = {
  		units: ['kilometers', 'meters', 'centimeters'],
  		abbr: ['km', 'm', 'cm'],
  		inches: [39370.07874, 39.370079, 0.393701]
  	}
  	// check each measurement unit in the display system
  	var comparisonArray = new Array();
  	for(var unitIndex = 0; unitIndex < measurementProperties[objRef.displaySystem].units.length; ++unitIndex) {
  		comparisonArray[unitIndex] = new Object();
  		var pixelsPerDisplayUnit = objRef.resolution * measurementProperties[objRef.displaySystem].inches[unitIndex] / objRef.scaleDenominator;
  		var minSDDisplayLength = (objRef.minWidth / pixelsPerDisplayUnit) / (objRef.divisions * objRef.subdivisions);
  		var maxSDDisplayLength = (objRef.maxWidth / pixelsPerDisplayUnit) / (objRef.divisions * objRef.subdivisions);
  		// add up scores for each marker (even if numbers aren't displayed)
  		for(var valueIndex = 0; valueIndex < (objRef.divisions * objRef.subdivisions); ++valueIndex) {
  			var minNumber = minSDDisplayLength * (valueIndex + 1);
  			var maxNumber = maxSDDisplayLength * (valueIndex + 1);
  			var niceNumber = new HandsomeNumber(minNumber, maxNumber);
  			comparisonArray[unitIndex][valueIndex] = {value: (niceNumber.value / (valueIndex + 1)), score: 0, tieBreaker: 0, numDec: 0, displayed: 0};
  			// now tally up scores for all values given this subdivision length
  			for(var valueIndex2 = 0; valueIndex2 < (objRef.divisions * objRef.subdivisions); ++valueIndex2) {
  				displayedValuePosition = niceNumber.value * (valueIndex2 + 1) / (valueIndex + 1);
  				niceNumber2 = new HandsomeNumber(displayedValuePosition, displayedValuePosition);
  				var isMajorMeasurement = ((valueIndex2 + 1) % objRef.subdivisions == 0);
  				var isLastMeasurement = ((valueIndex2 + 1) == (objRef.divisions * objRef.subdivisions));
  				if((objRef.singleLine && isLastMeasurement) || (!objRef.singleLine && (isMajorMeasurement || objRef.showMinorMeasures))) {
  					// count scores for displayed marker measurements
  					comparisonArray[unitIndex][valueIndex].score += niceNumber2.score;
  					comparisonArray[unitIndex][valueIndex].tieBreaker += niceNumber2.tieBreaker;
  					comparisonArray[unitIndex][valueIndex].numDec = Math.max(comparisonArray[unitIndex][valueIndex].numDec, niceNumber2.numDec);
  					comparisonArray[unitIndex][valueIndex].displayed += 1;
  				}
  				else {
  					// count scores for non-displayed marker measurements
  					comparisonArray[unitIndex][valueIndex].score += niceNumber2.score / objRef.subdivisions;
  					comparisonArray[unitIndex][valueIndex].tieBreaker += niceNumber2.tieBreaker / objRef.subdivisions;
  				}
  			}
  			// adjust scores so numbers closer to 1 are preferred for display
  			var scoreAdjustment = (unitIndex + 1) * comparisonArray[unitIndex][valueIndex].tieBreaker / comparisonArray[unitIndex][valueIndex].displayed;
  			comparisonArray[unitIndex][valueIndex].score *= scoreAdjustment;
  		}
  	}
  	// get the value (subdivision length) with the lowest cumulative score
  	var subdivisionDisplayLength = null;
  	var displayUnits = null;
  	var displayUnitsAbbr = null;
  	var subdivisionPixelLength = null;
  	var bestScore = Number.POSITIVE_INFINITY;
  	var bestTieBreaker = Number.POSITIVE_INFINITY;
  	var numDec = 0;
  	for(var unitIndex = 0; unitIndex < comparisonArray.length; ++unitIndex) {
  		for(valueIndex in comparisonArray[unitIndex]) {
  			if((comparisonArray[unitIndex][valueIndex].score < bestScore) || ((comparisonArray[unitIndex][valueIndex].score == bestScore) && (comparisonArray[unitIndex][valueIndex].tieBreaker < bestTieBreaker))) {
  				bestScore = comparisonArray[unitIndex][valueIndex].score;
  				bestTieBreaker = comparisonArray[unitIndex][valueIndex].tieBreaker;
  				subdivisionDisplayLength = comparisonArray[unitIndex][valueIndex].value;
  				numDec = comparisonArray[unitIndex][valueIndex].numDec;
  				displayUnits = measurementProperties[objRef.displaySystem].units[unitIndex];
  				displayUnitsAbbr = measurementProperties[objRef.displaySystem].abbr[unitIndex];
  				pixelsPerDisplayUnit = objRef.resolution * measurementProperties[objRef.displaySystem].inches[unitIndex] / objRef.scaleDenominator;
  				subdivisionPixelLength = pixelsPerDisplayUnit * subdivisionDisplayLength; // round before use in style
  			}
  		}
  	}
  	// determine offsets for graphic elements
  	var xOffsetMarkerMajor = (styleValue('.sbMarkerMajor', 'borderLeftWidth') + styleValue('.sbMarkerMajor', 'width') + styleValue('.sbMarkerMajor', 'borderRightWidth')) / 2;
  	var xOffsetMarkerMinor = (styleValue('.sbMarkerMinor', 'borderLeftWidth') + styleValue('.sbMarkerMinor', 'width') + styleValue('.sbMarkerMinor', 'borderRightWidth')) / 2;
  	var xOffsetBar = (styleValue('.sbBar', 'borderLeftWidth') + styleValue('.sbBar', 'border-right-width')) / 2;
  	var xOffsetBarAlt = (styleValue('.sbBarAlt', 'borderLeftWidth') + styleValue('.sbBarAlt', 'borderRightWidth')) / 2;
  	// support for browsers without the Document.styleSheets property (Opera)
  	if(!document.styleSheets) {
  		// this is a two part hack, one for the offsets here and one for the css below
  		xOffsetMarkerMajor = 0.5;
  		xOffsetMarkerMinor = 0.5;
  	}
  	// clean out any old content from containers
  	while(objRef.labelContainer.hasChildNodes()) {
  		objRef.labelContainer.removeChild(objRef.labelContainer.firstChild);
  	}
  	while(objRef.graphicsContainer.hasChildNodes()) {
  		objRef.graphicsContainer.removeChild(objRef.graphicsContainer.firstChild);
  	}
  	while(objRef.numbersContainer.hasChildNodes()) {
  		objRef.numbersContainer.removeChild(objRef.numbersContainer.firstChild);
  	}
  	// create all divisions
  	var aMarker, aBarPiece, numbersBox, xOffset;
  	var alignmentOffset = {
  		left: 0,
  		center: (-1 * objRef.divisions * objRef.subdivisions * subdivisionPixelLength / 2),
  		right: (-1 * objRef.divisions * objRef.subdivisions * subdivisionPixelLength)
  	}
  	var xPosition = 0 + alignmentOffset[objRef.align];
  	var markerMeasure = 0;
  	for(var divisionIndex = 0; divisionIndex < objRef.divisions; ++divisionIndex) {
  		// set xPosition and markerMeasure to start of division
  		xPosition = divisionIndex * objRef.subdivisions * subdivisionPixelLength;
  		xPosition += alignmentOffset[objRef.align];
  		markerMeasure = (divisionIndex == 0) ? 0 : ((divisionIndex * objRef.subdivisions) * subdivisionDisplayLength).toFixed(numDec);
  		// add major marker
  		aMarker = document.createElement('div');
  		aMarker.className = 'sbMarkerMajor';
  		aMarker.style.position = 'absolute';
  		aMarker.style.overflow = 'hidden';
  		aMarker.style.left = Math.round(xPosition - xOffsetMarkerMajor) + 'px';
  		aMarker.appendChild(document.createTextNode(' '));
  		objRef.graphicsContainer.appendChild(aMarker);
  		// add initial measure
  		if(!objRef.singleLine) {
  			numbersBox = document.createElement('div');
  			numbersBox.className = 'sbNumbersBox';
  			numbersBox.style.position = 'absolute';
  			numbersBox.style.overflow = 'hidden';
  			numbersBox.style.textAlign = 'center';
  			if(objRef.showMinorMeasures) {
  				numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + 'px';
  				numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + 'px';
  			}
  			else {
  				numbersBox.style.width = Math.round(objRef.subdivisions * subdivisionPixelLength * 2) + 'px';
  				numbersBox.style.left = Math.round(xPosition - (objRef.subdivisions * subdivisionPixelLength)) + 'px';
  			}
  			numbersBox.appendChild(document.createTextNode(markerMeasure));
  			objRef.numbersContainer.appendChild(numbersBox);
  		}
  		// create all subdivisions
  		for(var subdivisionIndex = 0; subdivisionIndex < objRef.subdivisions; ++subdivisionIndex) {
  			aBarPiece = document.createElement('div');
  			aBarPiece.style.position = 'absolute';
  			aBarPiece.style.overflow = 'hidden';
  			aBarPiece.style.width = Math.round(subdivisionPixelLength) + 'px';
  			if((subdivisionIndex % 2) == 0) {
  				aBarPiece.className = 'sbBar';
  				aBarPiece.style.left = Math.round(xPosition - xOffsetBar) + 'px';
  			}
  			else {
  				aBarPiece.className = 'sbBarAlt';
  				aBarPiece.style.left = Math.round(xPosition - xOffsetBarAlt) + 'px';
  			}
  			aBarPiece.appendChild(document.createTextNode(' '));
  			objRef.graphicsContainer.appendChild(aBarPiece);
  			// add minor marker if not the last subdivision
  			if(subdivisionIndex < (objRef.subdivisions - 1)) {
  				// set xPosition and markerMeasure to end of subdivision
  				xPosition = ((divisionIndex * objRef.subdivisions) + (subdivisionIndex + 1)) * subdivisionPixelLength;
  				xPosition += alignmentOffset[objRef.align];
  				markerMeasure = (divisionIndex * objRef.subdivisions + subdivisionIndex + 1) * subdivisionDisplayLength;
  				aMarker = document.createElement('div');
  				aMarker.className = 'sbMarkerMinor';
  				aMarker.style.position = 'absolute';
  				aMarker.style.overflow = 'hidden';
  				aMarker.style.left = Math.round(xPosition - xOffsetMarkerMinor) + 'px';
  				aMarker.appendChild(document.createTextNode(' '));
  				objRef.graphicsContainer.appendChild(aMarker);
  				if(objRef.showMinorMeasures && !objRef.singleLine) {
  					// add corresponding measure
  					numbersBox = document.createElement('div');
  					numbersBox.className = 'sbNumbersBox';
  					numbersBox.style.position = 'absolute';
  					numbersBox.style.overflow = 'hidden';
  					numbersBox.style.textAlign = 'center';
  					numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + 'px';
  					numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + 'px';
  					numbersBox.appendChild(document.createTextNode(markerMeasure));
  					objRef.numbersContainer.appendChild(numbersBox);
  				}
  			}
  		}
  	}
  	// set xPosition and markerMeasure to end of divisions
  	xPosition = (objRef.divisions * objRef.subdivisions) * subdivisionPixelLength;
  	xPosition += alignmentOffset[objRef.align];
  	markerMeasure = ((objRef.divisions * objRef.subdivisions) * subdivisionDisplayLength).toFixed(numDec);
  	// add the final major marker
  	aMarker = document.createElement('div');
  	aMarker.className = 'sbMarkerMajor';
  	aMarker.style.position = 'absolute';
  	aMarker.style.overflow = 'hidden';
  	aMarker.style.left = Math.round(xPosition - xOffsetMarkerMajor) + 'px';
  	aMarker.appendChild(document.createTextNode(' '));
  	objRef.graphicsContainer.appendChild(aMarker);
  	// add final measure
  	if(!objRef.singleLine) {
  		numbersBox = document.createElement('div');
  		numbersBox.className = 'sbNumbersBox';
  		numbersBox.style.position = 'absolute';
  		numbersBox.style.overflow = 'hidden';
  		numbersBox.style.textAlign = 'center';
  		if(objRef.showMinorMeasures) {
  			numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + 'px';
  			numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + 'px';
  		}
  		else {
  			numbersBox.style.width = Math.round(objRef.subdivisions * subdivisionPixelLength * 2) + 'px';
  			numbersBox.style.left = Math.round(xPosition - (objRef.subdivisions * subdivisionPixelLength)) + 'px';
  		}
  		numbersBox.appendChild(document.createTextNode(markerMeasure));
  		objRef.numbersContainer.appendChild(numbersBox);
  	}
  	// add content to the label container
  	var labelBox = document.createElement('div');
  	labelBox.style.position = 'absolute';
  	var labelText;
  	if(objRef.singleLine) {
  		labelText = markerMeasure;
  		labelBox.className = 'sbLabelBoxSingleLine';
  		labelBox.style.top = '-0.6em';
  		labelBox.style.left = (xPosition + 10) + 'px';
  	}
  	else {
  		labelText = '';
  		labelBox.className = 'sbLabelBox';
  		labelBox.style.textAlign = 'center';
  		labelBox.style.width = Math.round(objRef.divisions * objRef.subdivisions * subdivisionPixelLength) + 'px'
  		labelBox.style.left = Math.round(alignmentOffset[objRef.align]) + 'px';
  		labelBox.style.overflow = 'hidden';
  	}
  	if(objRef.abbreviateLabel) {
  		labelText += ' ' + displayUnitsAbbr;
  	}
  	else {
  		labelText += ' ' + displayUnits;
  	}
  	labelBox.appendChild(document.createTextNode(labelText));
  	objRef.labelContainer.appendChild(labelBox);
  	// support for browsers without the Document.styleSheets property (Opera)
  	if(!document.styleSheets) {
  		// override custom css with default
  		var defaultStyle = document.createElement('style');
  		defaultStyle.type = 'text/css';
  		var styleText = '.sbBar {top: 0px; background: #666666; height: 1px; border: 0;}';
  		styleText += '.sbBarAlt {top: 0px; background: #666666; height: 1px; border: 0;}';
  		styleText += '.sbMarkerMajor {height: 7px; width: 1px; background: #666666; border: 0;}';
  		styleText += '.sbMarkerMinor {height: 5px; width: 1px; background: #666666; border: 0;}';
  		styleText += '.sbLabelBox {top: -16px;}';
  		styleText += '.sbNumbersBox {top: 7px;}';
  		defaultStyle.appendChild(document.createTextNode(styleText));
  		document.getElementsByTagName('head').item(0).appendChild(defaultStyle);
  	}
  	// append the child containers to the parent container
  	objRef.container.appendChild(objRef.graphicsContainer);
  	objRef.container.appendChild(objRef.labelContainer);
  	objRef.container.appendChild(objRef.numbersContainer);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapScaleText.js
  
  Index: MapScaleText.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display the scale of a map.  The model of this widget
   * must have an extent object associated with it which is the case when the 
   * model has a MapContanier widget.
   *
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode  This widget's object node from the configuration document.
   * @param model       The model that this widget is a view of.
   */
  
  function MapScaleText(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Handles submission of the form (via javascript in an <a> tag or onsubmit handler)
     */
    this.submitForm = function() {
      var newScale = this.mapScaleTextForm.mapScale.value;
      this.model.extent.setScale(newScale.split(",").join(""));
      return false;   //prevent the form from actually being submitted
    }
  
    /**
     * handles keypress events to filter out everything except "enter".  
     * Pressing the "enter" key will trigger a form submit
     * @param event  the event object passed in for Mozilla; IE uses window.event
     */
    this.handleKeyPress = function(event) {
      var keycode;
      var target;
      if (event){
        //Mozilla
        keycode=event.which;
        target=event.currentTarget;
      }else{
        //IE
        keycode=window.event.keyCode;
        target=window.event.srcElement.form;
      }
  
      if (keycode == 13) {    //enter key
        target.parentWidget.submitForm();
        return false
      }
    }
  
    /**
     * outputs the scale value to the form element
     * @param objRef Pointer to this widget object.
     */
    this.showScale = function(objRef) {
      if (objRef.mapScaleTextForm) {
        var newScale = Math.round(objRef.model.extent.getScale());
        var parts = new Array();
        while (newScale>=1000.0) {
          var newPart = newScale/1000.0;
          newScale = Math.floor(newPart);
          var strPart = leadingZeros(Math.round((newPart-newScale)*1000).toString(),3);
          parts.unshift(strPart);
        }
        parts.unshift(newScale);
        objRef.mapScaleTextForm.mapScale.value = parts.join(",");
      }
    }
  
    /**
     * adds a bbox listener on the model 
     */
    this.model.addListener("bbox", this.showScale, this);
    this.model.addListener("refresh", this.showScale, this);
  
    /**
     * Called just before paint to set the map scale as stylesheet param
     * @param objRef pointer to this object.
     */
    this.prePaint = function(objRef) {
      var mapScale = objRef.model.extent.getScale();
      this.stylesheet.setParameter("mapScale", mapScale );
    }
  
    /**
     * Refreshes the form and event handlers when this widget is painted.
     * @param objRef Pointer to this CurorTrack object.
     */
    this.postPaint = function(objRef) {
      objRef.mapScaleTextForm = document.getElementById(objRef.formName);
      objRef.mapScaleTextForm.parentWidget = objRef;
      objRef.mapScaleTextForm.onkeypress = objRef.handleKeyPress;
      objRef.showScale(objRef);
    }
  
    //set some properties for the form output
    this.formName = "MapScaleText_" + mbIds.getId();
    this.stylesheet.setParameter("formName", this.formName);
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapScaleText.xsl
  
  Index: MapScaleText.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Output a form for displaying and setting the map scale denominator
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- The name of the form for coordinate output -->
    <xsl:param name="mapScale"/>
    <xsl:param name="mapScaleLabel">scale 1:</xsl:param>
    <xsl:param name="formName">MapScaleTextForm</xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/">
      <div>
        <form name="{$formName}" id="{$formName}" onsubmit="return config.objects.{$widgetId}.submitForm()">
          <xsl:value-of select="$mapScaleLabel"/><input name="mapScale" type="text" size="10" value="{$mapScale}"/>
          <!--input type="submit" value="set scale"/-->
          <!--a href="javascript:config.{$modelId}.{$widgetId}.submitForm();">set new scale</a-->
        </form>
      </div>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/MapTitle.xsl
  
  Index: MapTitle.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0"
  xmlns:wmc="http://www.opengis.net/context"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Displays the Title value from a Web Map Context document
  Author:      Cameron Shorter cameron ATshorter.net
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <xsl:param name="lang">en</xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/wmc:ViewContext/wmc:General | /wmc:OWSContext/wmc:General ">
      <span>
        <xsl:choose>
          <xsl:when test="wmc:Title/@xml:lang">              
            <xsl:value-of select="wmc:Title[@xml:lang=$lang]"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="wmc:Title"/>
          </xsl:otherwise>
        </xsl:choose>
      </span>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ModelStatus.js
  
  Index: ModelStatus.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display the status of a model, repainted whenever the model status
   * param is set.
   * TBD: not yet completed
   *
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode  This widget's object node from the configuration document.
   * @param model       The model that this widget is a view of.
   */
  
  function ModelStatus(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * initializes stylesheet parameters for the widget
     * @param objRef Pointer to this widget object.
     */
    this.prePaint = function(objRef) {
      objRef.stylesheet.setParameter("statusMessage", objRef.targetModel.getParam("modelStatus"));
    }
    this.model.addListener("modelStatus",this.paint,this);
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ModelStatus.xsl
  
  Index: ModelStatus.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Widget to display the status of a model
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="modelTitle"/>
    <xsl:param name="widgetId"/>
  
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
    
    <!-- The name of the form for coordinate output -->
    <xsl:param name="statusMessage"/>
  
    <!-- Main html -->
    <xsl:template match="/">
      <DIV>
        <xsl:value-of select="$title"/><xsl:value-of select="$modelTitle"/><xsl:value-of select="$statusMessage"/>
      </DIV>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ModelSwitcher.js
  
  Index: ModelSwitcher.js
  ===================================================================
  /*
  Author:       Patrice G Cappelaere patATcappelaere.com
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to switch maps while preserving the current user view 
   *
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode  This widget's object node from the configuration document.
   * @param model       The model that this widget is a view of.
   */
  function ModelSwitcher(widgetNode, model) {
    WidgetBase.apply(this,new Array(widgetNode, model));
    
    
    // Switch maps.
    // Called from html buttons
    this.switchMap = function(targetModel, modelUrl) {
      // get the context and bbox
      this.bbox = config.objects.mainMap.getBoundingBox();
     
      this.targetModel.addListener( "contextLoaded", this.setExtent, this );
      window.cgiArgs["bbox"]  = ""+this.bbox[0]+","+ this.bbox[1]+"," +this.bbox[2]+"," +this.bbox[3];
      config.loadModel( targetModel, modelUrl );
    }
    
    // called when the map is reloaded
    this.setExtent = function (objRef) {
      //var extent = config.objects.mainMap.extent;
      //alert( "Setting extent:"+objRef.bbox[0]+" "+objRef.bbox[1]+" "+objRef.bbox[2]+" "+objRef.bbox[3]);
      //extent.zoomToBox( new Array(objRef.bbox[0], objRef.bbox[1]), new Array(objRef.bbox[2], objRef.bbox[3]) );
      //objRef.targetModel.removeListener( "loadModel", objRef.setExtent, objRef );
    }
  }
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ModelUrlInput.js
  
  Index: ModelUrlInput.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * Widget to display the a form to input any model's URL and load the new URL 
   * as the model's document
   *
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode  This widget's object node from the configuration document.
   * @param model       The model that this widget is a view of.
   */
  
  function ModelUrlInput(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Handles submission of the form (via javascript in an <a> tag)
     */
    this.submitForm = function() {
      var httpPayload = new Object();
      httpPayload.url = this.urlInputForm.defaultUrl.value;
      httpPayload.method = this.targetModel.method;
  /*
      for (var i=0; i<httpMethod.length; ++i) {   //loop through radio buttons
        if (httpMethod[i].checked) {
          httpPayload.method = httpMethod[i].value;
          if (httpPayload.method.toLowerCase() == "post") {
            httpPayload.postData = null; //TBD get this from somewhere? or not allow post?
            if (this.debug) alert("postData:"+httpPayload.postData.xml);
          } else {
            httpPayload.postData = null;
          }
          break;
        }
      }
  */    
      this.targetModel.newRequest(this.targetModel,httpPayload);
    }
  
    /**
     * handles keypress events to filter out everything except "enter".  
     * Pressing the "enter" key will trigger a form submit
     * @param event  the event object passed in for Mozilla; IE uses window.event
     */
    this.handleKeyPress = function(event) {
      var keycode;
      var target;
      if (event){
        //Mozilla
        keycode=event.which;
        target=event.currentTarget;
      }else{
        //IE
        keycode=window.event.keyCode;
        target=window.event.srcElement.form;
      }
  
      if (keycode == 13) {    //enter key
        target.parentWidget.submitForm();
      return false;   //prevent the form from actually being submitted
      }
    }
  
    /**
     * initializes stylesheet parameters for the form
     * @param objRef Pointer to this widget object.
     */
    this.prePaint = function(objRef) {
      objRef.stylesheet.setParameter("modelTitle", objRef.targetModel.title);
    }
  
    /**
     * Refreshes the form and event handlers when this widget is painted.
     * @param objRef Pointer to this CurorTrack object.
     */
    this.postPaint = function(objRef) {
      objRef.urlInputForm = document.getElementById(objRef.formName);
      objRef.urlInputForm.parentWidget = objRef;
      objRef.urlInputForm.onkeypress = objRef.handleKeyPress;
      //objRef.WebServiceForm.onsubmit = objRef.submitForm;
      //objRef.WebServiceForm.mapsheet.onblur = objRef.setMapsheet;
    }
  
    //set some properties for the form output
    this.formName = "urlInputForm_" + mbIds.getId();
    this.stylesheet.setParameter("formName", this.formName);
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ModelUrlInput.xsl
  
  Index: ModelUrlInput.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Output a form for setting any model's url and method values
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="modelTitle"/>
    <xsl:param name="targetModel"/>
    <xsl:param name="widgetId"/>
  
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
    <xsl:param name="load"/>
  
      <!-- The name of the form for coordinate output -->
    <xsl:param name="defaultUrl"/>
    <xsl:param name="formName">ModelUrlInputForm</xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/">
      <div>
        <form name="{$formName}" id="{$formName}" onsubmit="return config.objects.{$widgetId}.submitForm()">
          <xsl:value-of select="$title"/><input name="defaultUrl" type="text" size="30" value="{$defaultUrl}"/>
          <a href="javascript:config.objects.{$widgetId}.submitForm();"><xsl:value-of select="$load"/></a>
        </form>
      </div>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/NtsForm.xsl
  
  Index: NtsForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Outputs a form for use as a WebServiceForm widget that connects to
               the CGDI NTS lookup service (returns outline of NTS Mapsheet indexes).
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- Text params for this widget -->
    <xsl:param name="ntsTitle"/>
    <xsl:param name="mapsheet"/>
  
    <!-- The name of the form for coordinate output -->
    <xsl:param name="webServiceUrl">http://geoservices.cgdi.ca/NTS/NTSLookup</xsl:param>
    <xsl:param name="formName">NTSForm</xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/">
      <DIV>
      <form name="{$formName}" id="{$formName}" method="get" action="{$webServiceUrl}">
        <input name="request" type="hidden" value="GetMapsheet"/>
        <input name="version" type="hidden" value="1.1.2"/>
      
        <table>
          <tr>
            <th align="left" colspan="3">
              <xsl:value-of select="$ntsTitle"/>
            </th>
          </tr>
          <tr>
            <td>
              <xsl:value-of select="$mapsheet"/>
            </td>
            <td>
              <input name="mapsheet" type="text" size="10" value="31G05"/>
            </td>
            <td>
              <!--input type="submit"/-->
              <a href="javascript:config.objects.{$widgetId}.submitForm();">load web service data</a>
            </td>
          </tr>
        </table>
      </form>
      </DIV>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Null.xsl
  
  Index: Null.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
  
  <!--
  
  Description: An empty stylesheet for widgets which don't use XSL to render.
  
  Author:      Cameron Shorter cameron ATshorter.net
  
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Reset.js
  
  Index: Reset.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is pressed the map will reload with it's original extent
   * @constructor
   * @base ButtonBase
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param widgetNode      The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function Reset(widgetNode, model) {
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    // override default cursor by user
    // cursor can be changed by spefying a new cursor in config file
    this.cursor = "default"; 
  
    /**
     * Store a copy of the original extent locally as a loadModel event listener.
     * @param objRef Pointer to this object.
     */
    this.initExtent = function(objRef) {
      objRef.originalExtent = new Extent( objRef.targetModel );   
      objRef.originalExtent.init( objRef.originalExtent );
      objRef.originalExtent.setResolution( new Array(objRef.targetModel.getWindowWidth(), objRef.targetModel.getWindowHeight()) );
    }
  
    /**
     * Set the loadModel listener in response to init event
     * @param objRef Pointer to this object.
     */
    this.initReset = function(objRef) {
      objRef.targetModel.addListener("loadModel",objRef.initExtent, objRef);
    }
    this.model.addListener("init",this.initReset, this);
  
  
    /**
     * Calls the reset() method of the context doc to reload at with the original extent
     * @param objRef      Pointer to this AoiMouseHandler object.
     */
    this.doSelect = function(selected,objRef) {
      if (selected){
        var originalExtent = objRef.originalExtent;
        objRef.targetModel.extent.centerAt( originalExtent.getCenter(), originalExtent.res[0] );
      }
    }
  }
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Save.js
  
  Index: Save.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is pressed the targetModel is posted to the serializeUrl.
   * Also defines a listener function for the "modelSaved" event which opens 
   * the serialized document in a new browser window but only
   * if the a popupWindowName property is defined for the button in config.
   *
   * @constructor
   * @base ButtonBase
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param widgetNode  The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function Save(widgetNode, model) {
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    /**
     * Calls the targetModel's saveModel() method to serialize the model document.
     * @param objRef      Pointer to this AoiMouseHandler object.
     */
    this.doSelect = function(selected,objRef) {
      if (selected) {
        objRef.targetModel.saveModel(objRef.targetModel);
      }
    }
  
    /**
     * opens a saved model in a popup window
     * @param objRef Pointer to this SaveModel object.
     */
    this.savedModelPopup = function(objRef, fileUrl) {
      window.open(fileUrl, this.popupWindowName);
    }
  
    /**
     * set a "modelSaved" listener to call the opoup window opener
     * @param objRef Pointer to this SaveModel object.
     */
    this.initReset = function(objRef) {
      objRef.targetModel.addListener("modelSaved",objRef.savedModelPopup, objRef);
    }
  
    //if popupWindowName is specified in config, then add a modelSaved listener 
    var popupWindowName = widgetNode.selectSingleNode("mb:popupWindowName");
    if (popupWindowName) {
      this.popupWindowName = popupWindowName.firstChild.nodeValue;
      this.model.addListener("init",this.initReset, this);
    }
  
  }
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SaveModel.js
  
  Index: SaveModel.js
  ===================================================================
  /*
  
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  
  
  $Id$
  
  */
  
  
  
  // Ensure this object's dependancies are loaded.
  
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  
  
  /**
  
   * Widget which will display some anchor tags for accessing model URLs.  
  
   * TBD: which is the prefered method to use here, 
  
   *
  
   * @constructor
  
   * @base WidgetBaseXSL
  
   * @param widgetNode This widget's object node from the configuration document.
  
   * @param model The model that this widget is a view of.
  
   */
  
  
  
  function SaveModel(widgetNode, model) {
  
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
  
  
    /**
  
     * a listenet to set the saved model URL as the href attribute in an anchor link 
  
     * @param objRef Pointer to this SaveModel object.
  
     */
  
    this.saveLink = function(objRef, fileUrl) {
  
      var modelAnchor = document.getElementById(objRef.model.id+"."+objRef.id+".modelUrl");
  
      modelAnchor.href = fileUrl;
  
    }
  
    this.model.addListener("modelSaved", this.saveLink, this);
  
  
  
  }
  
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SaveModel.xsl
  
  Index: SaveModel.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  
  
  <!--
  
  Description: Outputs model URL and a link to save the current version of it
  
  Author:      Mike Adair
  
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  
  
  AoiForm.xsl,v 1.2 2004/06/25 17:59:38 madair1 Exp
  
  -->
  
  
  
    <xsl:output method="xml" encoding="utf-8"/>
  
  
  
    <!-- The common params set for all widgets -->
  
    <xsl:param name="lang">en</xsl:param>
  
    <xsl:param name="modelId"/>
  
    <xsl:param name="widgetId"/>
  
  
  
    <!-- The name of the form for coordinate output -->
  
    <xsl:param name="modelUrl"/>
  
    <xsl:param name="serializeUrl">/mapbuilder/writeXml</xsl:param>
  
    <xsl:param name="echoUrl">/mapbuilder/echoXml</xsl:param>
  
  
  
    <!-- Main html -->
  
    <xsl:template match="/">
  
      <div>
  
        <h3>Model URLs: <xsl:value-of select="$modelId"/></h3>
  
        <a href="{$modelUrl}" target="modelWin">original model URL</a><br/>
  
        <a href="javascript:config.objects.{$modelId}.saveModel(config.objects.{$modelId})">save current model to disk</a><br/>
  
        <a target="modelXML" id="{$modelId}.{$widgetId}.modelUrl">pick it up here</a><br/>
  
      </div>
  
    </xsl:template>
  
    
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SearchForm.xsl
  
  Index: SearchForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Output a form for display of the context doc AOI
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- Text params for this widget -->
    <xsl:param name="searchFormTitle"/>
    <xsl:param name="north"/>
    <xsl:param name="south"/>
    <xsl:param name="east"/>
    <xsl:param name="west"/>
    
    <!-- The name of the form for coordinate output -->
    <xsl:param name="formName">AOIForm</xsl:param>
  
    <!-- Main html -->
    <xsl:template match="/">
      <form name="{$formName}" id="{$formName}" method="get" action="defaultUrl">
        <table>
          <tr>
            <th align="left" colspan="3">
              <xsl:value-of select="$searchFormTitle"/>
            </th>
          </tr>
          <tr>
            <td>
              keyword:
            </td>
            <td>
              <input name="keyword" type="text" size="10"/>
            </td>
            <td>
              <input type="submit"/>
            </td>
          </tr>
          <tr>
            <td>
            </td>
            <td>
              <xsl:value-of select="$north"/>
              <input NAME="northCoord" TYPE="text" SIZE="10" STYLE="font: 8pt Verdana, geneva, arial, sans-serif;"/>
            </td>
            <td>
            </td>
          </tr>
          <tr>
            <td>
              <xsl:value-of select="$west"/>
              <input NAME="westCoord" TYPE="text" SIZE="10" STYLE="font: 8pt Verdana, geneva, arial, sans-serif;"/>
            </td>
            <td>
            </td>
            <td>
              <xsl:value-of select="$east"/>
              <input NAME="eastCoord" TYPE="text" SIZE="10" STYLE="font: 8pt Verdana, geneva, arial, sans-serif;"/>
            </td>
          </tr>
          <tr>
            <td>
            </td>
            <td>
              <xsl:value-of select="$south"/>
              <input NAME="southCoord" TYPE="text" SIZE="10" STYLE="font: 8pt Verdana, geneva, arial, sans-serif;"/>
            </td>
            <td>
            </td>
          </tr>
        </table>
      </form>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SelectAllMapLayers.xsl
  
  Index: SelectAllMapLayers.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: link to load the WMS Capabilities doc as a context document.  
              This works with the Caps2Context tool which implements the listener
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:wms="http://www.opengis.net/wms"
  		xmlns:ogc="http://www.opengis.net/ogc"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/WMT_MS_Capabilities | /wms:WMS_Capabilities">
      <p>
        <a href="javascript:config.objects.{$modelId}.setParam('mapAllLayers')">map all layers</a>
      </p>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SelectFeatureType.xsl
  
  Index: SelectFeatureType.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  
  
  <!--
  
  Description: presents the list of FeatureTypes from a WFS capabilities doc.
  
              Links provided to filter and load the selected FeatureType.
  
  Author:      adair
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet version="1.0" 
  
      xmlns:wfs="http://www.opengis.net/wfs"
  
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  
  		xmlns:ogc="http://www.opengis.net/ogc"
  
  		xmlns:gml="http://www.opengis.net/gml"
  
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
  
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
  
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
  
    <xsl:param name="modelId"/>
  
    <xsl:param name="widgetId"/>
  
    <xsl:param name="toolId"/>
  
    
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="/wfs:WFS_Capabilities">
  
      <table>
  
        <tr>
  
          <th>
  
            Feature types from: <xsl:value-of select="wfs:Service/wfs:Title"/>
  
          </th>
  
          <td colspan="2">
  
            <a href="javascript:config.paintWidget(config.objects.wfsServerList)">Back to list</a>
  
          </td>
  
        </tr>
  
        <xsl:apply-templates select="wfs:FeatureTypeList/wfs:FeatureType"/>
  
      </table>
  
    </xsl:template>
  
  
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="wfs:FeatureType">
  
      <xsl:variable name="name"><xsl:value-of select="wfs:Name"/></xsl:variable>
  
      <xsl:variable name="title"><xsl:value-of select="wfs:Title"/></xsl:variable>
  
      <xsl:variable name="id"><xsl:value-of select="@id"/></xsl:variable>
  
      <tr>
  
        <td>
  
          <xsl:value-of select="$title"/> (<xsl:value-of select="$name"/>) <xsl:value-of select="wfs:SRS"/>
  
        </td>
  
        <td>
  
          <a href="javascript:config.objects.{$modelId}.setParam('wfs_GetFeature','{$name}')">load</a>
  
        </td>
  
        <td>
  
          <a href="javascript:config.objects.{$modelId}.setParam('wfs_DescribeFeatureType','{$name}')">filter</a>
  
        </td>
  
      </tr>
  
    </xsl:template>
  
  
  
    <xsl:template match="text()|@*"/>
  
  
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SelectMapLayers.xsl
  
  Index: SelectMapLayers.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: presents the list of Layers from a WMS capabilities doc.
              Links provided to preview and add a layer to a Context doc.
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:wms="http://www.opengis.net/wms"
  		xmlns:ogc="http://www.opengis.net/ogc"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/WMT_MS_Capabilities | /wms:WMS_Capabilities">
      <table>
        <tr>
          <th colspan="2" align="left">
            Map Layers from: <xsl:value-of select="wms:Service/wms:Title"/><xsl:value-of select="Service/Title"/>
          </th>
        </tr>
        <xsl:apply-templates/>
      </table>
    </xsl:template>
  
    <!-- template rule matching displayable layers -->
    <xsl:template match="Layer[Name]">
      <xsl:variable name="name"><xsl:value-of select="Name"/></xsl:variable>
      <tr>
        <td>
          <xsl:value-of select="Title"/>
        </td>
        <td width="200px" nowrap="true">
          <a href="javascript:config.objects.editContext.addNodeToModel('{$name}')">add to map</a>
          <!--a href="javascript:config.objects.{$modelId}.setParam('GetMap','{$name}')">show map</a-->
        </td>
      </tr>
      <xsl:apply-templates/>
    </xsl:template>
  
    <!-- template rule matching displayable layers for v1.3.x servers-->
    <xsl:template match="wms:Layer[wms:Name and wms:Dimension/@name='time']">
      <xsl:variable name="name"><xsl:value-of select="wms:Name"/></xsl:variable>
      <tr>
        <td>
          <xsl:value-of select="wms:Title"/>
        </td>
        <td>
          <a href="javascript:config.objects.{$modelId}.setParam('mapLayer','{$name}')">show map</a>
          <!--a href="javascript:config.objects.{$modelId}.setParam('GetMap','{$name}')">show map</a-->
        </td>
      </tr>
      <xsl:apply-templates/>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SelectTimeFrame.js
  
  Index: SelectTimeFrame.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to specify the start and stop frames for a time series context
   *
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function SelectTimeFrame(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Sets the frame index for the time series to start
     * @param index the array index for the first frame
     */
    this.setFirstFrame = function(index) {
      this.model.setParam("stopLoop");
      this.model.setParam("firstFrame",index);
    }
  
    /**
     * Sets the frame index for the time series end
     * @param index the array index for the first frame
     */
    this.setLastFrame = function(index) {
      var timestampList = this.model.timestampList;
      if (index > timestampList.firstFrame) {
        timestampList.lastFrame = index;
      } else {
        alert("last frame must be after the first frame");
      }
      this.model.setParam("stopLoop");
    }
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SelectTimeFrame.xsl
  
  Index: SelectTimeFrame.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0"
  xmlns:wmc="http://www.opengis.net/context"
  xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Displays the Title value from a Web Map Context document
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="layerName">TEMPERATURE</xsl:param>
  
    <!-- Main html -->
    
    <xsl:template match="/wmc:ViewContext/wmc:General/wmc:Extension ">
      <div>
        <form>
          start:<select name="firstFrame" onchange="config.objects.{$modelId}.setParam('firstFrame',this.value)">
            <xsl:apply-templates select="mb:TimestampList[@layerName=$layerName]/mb:Timestamp"/>
          </select>
          <!--
          - stop:<select name="lastFrame" onchange="config.objects.{$widgetId}.setLastFrame(this.value)">
            <xsl:apply-templates select="wmc:TimestampList[@layerName=$layerName]/wmc:Timestamp"/>
          </select>
          -->
        </form>
      </div>
    </xsl:template>
    
    <xsl:template match="mb:Timestamp">
      <xsl:param name="index" select="position()-1"/>
      <option value="{$index}">
        <xsl:value-of select="."/>
      </option>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ServiceRegistryList.js
  
  Index: ServiceRegistryList.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display a list of web services from a registry.
   * TBD: not compelted yet.
   *
   * @constructor
   * @base WidgetBase
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function ServiceRegistryList(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Handles submission of the form (via javascript in an <a> tag)
     */
    this.submitForm = function() {
      alert("submitForm");
  
      //create the http GET URL
      //TBD: handle POST submission
      //TBD: create filter request
      var webServiceUrl = this.webServiceForm.action + "?";
      for (var i=0; i<this.webServiceForm.elements.length; ++i) {
        var element = this.webServiceForm.elements[i];
        webServiceUrl += element.name + "=" + element.value + "&";
      }
      alert(webServiceUrl);
      config.loadModel( this.targetModel.id, webServiceUrl);
    }
  
    /**
     * Refreshes the form onblur handlers when this widget is painted.
     * @param objRef Pointer to this CurorTrack object.
     */
    this.postPaint = function(objRef) {
      objRef.webServiceForm = document.getElementById(objRef.formName);
      //objRef.WebServiceForm.onsubmit = objRef.submitForm;
      //objRef.WebServiceForm.mapsheet.onblur = objRef.setMapsheet;
    }
  
    //set some properties for the form output
    this.formName = "WebServiceForm_";// + mbIds.getId();
    this.stylesheet.setParameter("formName", this.formName);
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ServiceRegistryList.xsl
  
  Index: ServiceRegistryList.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parses an listing of OGC services from the Discovery Portal registry
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  		xmlns:ogc="http://www.opengis.net/ogc"
  		xmlns:gml="http://www.opengis.net/gml"
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelTitle"/>
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="targetModel"/>
    
    <xsl:param name="webServiceUrl">http://geodiscover.cgdi.ca/ceonetWeb/biz</xsl:param>
    <xsl:param name="formName">OGCServiceList</xsl:param>
    <xsl:param name="keywords"/>
    <xsl:param name="serviceType"/>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/searchDetails">
      <xsl:variable name="numPerPage"><xsl:value-of select="searchCriteria/numResultsPerPage"/></xsl:variable>
      <xsl:variable name="numPages"><xsl:value-of select="paging/totalPages"/></xsl:variable>
      <xsl:variable name="pageNum"><xsl:value-of select="paging/currentPage"/></xsl:variable>
      <xsl:variable name="nextPage"><xsl:value-of select="paging/nextPage"/></xsl:variable>
      <xsl:variable name="prevPage"><xsl:value-of select="paging/prevPage"/></xsl:variable>
      <div>
      <h4>Browse for web services</h4>
      <form name="{$formName}" id="{$formName}" method="get" action="{$webServiceUrl}">
        <input type="hidden" name="language" value="en"/>
        <input type="hidden" name="levelOfDetail" value="brief"/>
        <input type="hidden" name="serviceType" value="{$serviceType}"/>
        <input type="hidden" name="request" value="searchForService"/>
        <input type="hidden" name="numResultsPerPage" value="{$numPerPage}"/>
        <input type="hidden" name="page" value="{$pageNum}"/>
        <input type="hidden" name="sortOrder" value="default"/>
        <table width="100%">
          <tr>
            <td align="left">
              Keywords:<input type="text" name="keywords" value="{$keywords}" size="10"/>
            </td>
            <td align="right">
              <xsl:if test="$pageNum &gt; 1">
                <a href="javascript:config.objects.{$widgetId}.webServiceForm.page.value={$prevPage};config.objects.{$widgetId}.submitForm()">previous</a> - 
              </xsl:if>
              page <xsl:value-of select="$pageNum"/> of <xsl:value-of select="$numPages"/>
              <xsl:if test="$pageNum &lt; $numPages">
                - <a href="javascript:config.objects.{$widgetId}.webServiceForm.page.value={$nextPage};config.objects.{$widgetId}.submitForm()">next</a>
              </xsl:if>
            </td>
          </tr>
        </table>
      <dl>
        <xsl:apply-templates select="searchResults/entry"/>
      </dl>
      </form>
      </div>
    </xsl:template>
  
    <!-- template rule matching source root element -->
    <xsl:template match="entry">
      <xsl:variable name="rowClass">altRow_<xsl:value-of select="position() mod 2"/></xsl:variable>
      <xsl:variable name="capsUrl"><xsl:value-of select="accessUrl"/></xsl:variable>
      <dt class="{$rowClass}">
        <a href="javascript:config.loadModel('{$targetModel}','{$capsUrl}')">
          <xsl:value-of select="name"/>
        </a>
      </dt>
      <dd class="{$rowClass}"><xsl:value-of select="custodianName"/></dd>
    </xsl:template>
  
    <xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/SetAoi.js
  
  Index: SetAoi.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is selected, the AOI box stays visible and no zoom happens. 
   * @constructor
   * @base ButtonBase
   * @author Mike Adair 
   * @param widgetNode The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function SetAoi(widgetNode, model) {
  
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    // override default cursor by user
    // cursor can be changed by spefying a new cursor in config file
    this.cursor = "crosshair";
  
    /**
     * The action to do on click
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      //does nothing for the moment
    }
  
    if (this.mouseHandler) {
      this.mouseHandler.model.addListener('mouseup',this.doAction,this);
    }
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/TabbedContent.js
  
  Index: TabbedContent.js
  ===================================================================
  /*
  Author:       Mike Adair/Fedele Stella
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display various other widgets by selecting a tab in a tab bar.
   * 
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function TabbedContent(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    this.selectedTab = null;
    var textNodeXpath = "/mb:WidgetText/mb:widgets/mb:TabbedContent";
    this.tabLabels = config.widgetText.selectNodes(textNodeXpath);
  
    //find the workspace node controlled by these tabs
    var workspace = widgetNode.selectSingleNode("mb:htmlWorkspace");
    if ( workspace ) {
      this.htmlWorkspace = workspace.firstChild.nodeValue;
    } else {
      alert("htmlWorkspace must be defined for TabbedContent widget");
    }
  
    /**
     * Initializes the tab list and sets the label for each tab
     * @param objRef a pointer to this object
     */
    this.initTabs = function(objRef) {
      var tabs = objRef.widgetNode.selectNodes("mb:tab");
      for (var i=0; i<tabs.length; ++i) {
        var tab = tabs[i];
        var tabWidgetId = tab.firstChild.nodeValue;
        var tabWidget = config.objects[tabWidgetId];
        if (!tabWidget) {
          alert("tab widget not found:"+tabWidgetId);
          return;
        }
  
        tabWidget.htmlTagId = objRef.htmlWorkspace;
        tabWidget.outputNodeId = objRef.id+"_workspace";
        tabWidget.node = document.getElementById(tabWidget.htmlTagId);
        tabWidget.tabList = objRef;
  
        var tabLabel = tab.getAttribute("label"); 
        if (!tabLabel) tabLabel = tabWidgetId;
        var textNode = config.widgetText.selectSingleNode(textNodeXpath+"/mb:"+tabWidgetId);
        if (textNode) tabLabel = textNode.firstChild.nodeValue;
        tab.setAttribute("label",tabLabel);
        
        tabWidget.model.addListener("refresh",objRef.selectTab,tabWidget);
      }
    }
    this.model.addListener("init",this.initTabs,this);
  
    /**
     * Adds a widget to the list of tabs (TBD: not yet working/tested)
     * @param widget the widget to be added to the list of tabs
     * @param order  the order within the tabs
     */
    this.addWidget = function(tabWidget,tabLabel) {
      tabWidget.htmlTagId = this.htmlWorkspace;
      tabWidget.outputNodeId = this.id+"_workspace";
      tabWidget.node = document.getElementById(tabWidget.htmlTagId);
      tabWidget.tabList = this;
  
      if (!tabLabel) tabLabel = tabWidget.id;
      var textNode = config.widgetText.selectSingleNode(textNodeXpath+"/mb:"+tabWidget.id);
      if (textNode) tabLabel = textNode.firstChild.nodeValue;
  
      var tabNode = this.model.doc.createElementNS(mbNS,"tab");
      tabNode.appendChild(this.model.doc.createTextNode(tabWidget.id));
      tabNode.setAttribute("label",tabLabel);
      this.widgetNode.appendChild(tabNode);
  
      this.paint(this);
      this.selectTab(tabWidget);
    }
  
    /**
     * Selects a tab, which has the effect of displaying that widget in the 
     * workspace
     * @param tabWidget the widget to be selected
     */
    this.selectTab = function(tabWidget) {
      if (!tabWidget.model.doc) {
        alert("no data to show yet");
        return;
      }
      var tabList = tabWidget.tabList;
      if (tabList.selectedTab!=null) tabList.selectedTab.className = '';
      var newAnchor = document.getElementById(tabList.id+"_"+tabWidget.id);
      if (newAnchor) {
        newAnchor.className = 'current';
        tabList.selectedTab = newAnchor;
        tabWidget.paint(tabWidget,true);
      }
      //tabWidget.targetModel.callListeners("refresh");
    }
  
    /**
     * sett the doc to be styled to the TabbedContent node from config
     * @param objRef a pointer to this object
     */
    this.prePaint = function(objRef){
      objRef.resultDoc = objRef.widgetNode;
    }
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/TabbedContent.xsl
  
  Index: TabbedContent.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: a TabbedContent node from config to output some tabs, 
                this requires a CSS file, see skin/default/tablist.css
  Author:      adair/stella
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
    <xsl:output method="xml"/>
    <xsl:strip-space elements="*"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- these handled outside of the stylesheet -->
    <xsl:template match="mb:TabbedContent">
      <ul class="tablist">
        <xsl:apply-templates select="mb:tab"/>
      </ul>
    </xsl:template>
    
    <xsl:template match="mb:tab">
      <xsl:variable name="tabWidgetId" select="."/>
      <li>
        <a href="javascript:config.objects.{$widgetId}.selectTab(config.objects.{$tabWidgetId})" id="{$widgetId}_{$tabWidgetId}">
          <xsl:value-of select="@label"/>
        </a>
      </li>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/TimeSeries.js
  
  Index: TimeSeries.js
  ===================================================================
  /*
  Author:       Mike Adair
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  mapbuilder.loadScript(baseDir+"/widget/MapContainerBase.js");
  
  /**
   * Widget to render a time series of maps from an OGC context document.  Each 
   * map layer is rendered one on top of the other and only the first one is visible.
   * the MovieLoop tool is used to cycle the visibility of the layers.
   * The timstamping is handled as an array, ie the array index is used to select
   * layers.
   * 
   * @constructor
   * @base MapContainerBase
   * @base MapContainerBase
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function TimeSeries(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
    MapContainerBase.apply(this,new Array(widgetNode, model));
  
    /**
     * Called when the context's hidden attribute changes.
     * @param layerName The Name of the LayerList/Layer from the Context which
     * has changed.
     * @param objRef This object.
     * @param layerName  The name of the layer that was toggled.
     */
    this.hiddenListener=function(objRef, layerName){
      var vis="visible";
      if(objRef.model.getHidden(layerName)=="1") {
        vis="hidden";
      }
      var layerId = objRef.model.id + "_" + objRef.id + "_" + layerName;
  
      //add timestamp to layerID if layer have a timestampList
      if (objRef.model.timestampList && objRef.model.timestampList.getAttribute("layerName") == layerName) {  
        var timestampIndex = objRef.model.getParam("timestamp");
        var timestamp = objRef.model.timestampList.childNodes[timestampIndex];
        layerId += "_" + timestamp.firstChild.nodeValue;
      }
  
      var layer = document.getElementById(layerId);
      if (layer) {
        layer.style.visibility=vis;
      } else {
        alert("error finding layerId:"+layerId);
      }
    }
    this.model.addListener("hidden",this.hiddenListener,this);
  
    /**
     * Called when the map timestamp is changed so set the layer visiblity.
     * @param objRef This object.
     * @param timestampIndex  The array index for the layer to be displayed. 
     */
    this.timestampListener=function(objRef, timestampIndex){
      var layerName = objRef.model.timestampList.getAttribute("layerName");
      var timestamp = objRef.model.timestampList.childNodes[timestampIndex];
      var vis = (timestamp.getAttribute("current")=="1") ? "visible":"hidden";
      var layerId = objRef.model.id + "_" + objRef.id + "_" + layerName + "_" + timestamp.firstChild.nodeValue;
      var layer = document.getElementById(layerId);
      if (layer) {
        layer.style.visibility=vis;
      } else {
        alert("error finding layerId:"+layerId);
      }
    }
    this.model.addListener("timestamp",this.timestampListener,this);
  
    /**
     * override of prePaint to set the selected timestamp values as a comma-
     * separated list stylesheet parameter.  
     * @param objRef This object.
     */
    this.prePaint=function(objRef) {
      var timelist = "";
      var timestampList = objRef.model.timestampList;
      if (timestampList) {
        for (var i=objRef.model.getParam("firstFrame"); i<=objRef.model.getParam("lastFrame"); ++i) {
          timelist += timestampList.childNodes[i].firstChild.nodeValue + ",";
        }
        objRef.stylesheet.setParameter("timeList", timelist.substring(0,timelist.length-1));  //remove trailing comma
      }
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Timestamp.js
  
  Index: Timestamp.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Adds a timstamp listener to show the curretn timestamp value in a form.
   * @constructor
   * @base WidgetBaseXSL
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param widgetNode      The tool node from the Config XML file.
   * @param model  The ButtonBar widget.
   */
  function Timestamp(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    this.updateTimestamp = function (objRef, timestamp) {
      var inputEl = document.getElementById("timestampValue");
      inputEl.value = objRef.model.timestampList.childNodes[timestamp].firstChild.nodeValue;
    }
  
    this.model.addListener("timestamp",this.updateTimestamp, this);
  }
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Timestamp.xsl
  
  Index: Timestamp.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
    xmlns:mb="http://mapbuilder.sourceforge.net/mapbuilder"
    xmlns:wmc="http://www.opengis.net/context" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://www.w3.org/1999/xlink" >
  <!--
  Description: Output the timestamp value
  Author:      Mike Adair mike.adairATnrcan.gc.ca
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  Abstract.xsl,v 1.5 2004/06/25 17:59:38 madair1 Exp
  
  -->
    <xsl:output method="xml" encoding="utf-8"/>
    
    <!-- The common params set for all widgets -->
    <xsl:param name="lang">en</xsl:param>
    <xsl:param name="widgetNode"/>
  
    <!-- Text params for this widget -->
    <xsl:param name="title"/>
    
    <xsl:template match="/">
      <form STYLE="font: 8pt Verdana, geneva, arial, sans-serif;">
        <xsl:value-of select="$title"/>
        <xsl:apply-templates select="wmc:ViewContext/wmc:General"/>
      </form>
    </xsl:template>
  
    
    <!-- readonly input element to display the time value -->
    <xsl:template match="mb:TimestampList">
      <input id="timestampValue" type="text" size="10" class="bareInput" readonly="true">
        <xsl:attribute name="value">
          <xsl:value-of select="mb:Timestamp[@current='1']"/>
        </xsl:attribute>
      </input>
    </xsl:template>
  
    <!-- readonly input element to display the time value 
    repeated here without namespaces because IE doesn't support the createElementNS function
    and this part of the extension is output without any apparent namespace
    -->
    <xsl:template match="TimestampList">
      <input id="timestampValue" type="text" size="10" class="bareInput" readonly="true">
        <xsl:attribute name="value">
          <xsl:value-of select="Timestamp[@current='1']"/>
        </xsl:attribute>
      </input>
    </xsl:template>
    <xsl:template match="text()|@*"/>
    
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/TransactionResponse.js
  
  Index: TransactionResponse.js
  ===================================================================
  /*
  Author:       Cameron Shorter
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Render the response from a WFS request.
   * @constructor
   * @base WidgetBaseXSL
   * @author Cameron Shorter
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function TransactionResponse(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/TransactionResponse.xsl
  
  Index: TransactionResponse.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  
  Description: Render a WFS Transaction Response.
  
  Author:      Cameron Shorter
  
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  
  
  $Id$
  
  $Name$
  
  -->
  
  
  
  <xsl:stylesheet
  
    version="1.0"
  
    xmlns:ogc="http://www.opengis.net/ogc"
  
    xmlns:wfs="http://www.opengis.net/wfs"
  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  
  
    <xsl:output method="xml"/>
  
  
  
    <!-- template rule matching source root element -->
  
    <xsl:template match="/">
  
      <div>
  
        <xsl:apply-templates/>
  
      </div>
  
    </xsl:template>
  
  
  
    <!-- Service Exception -->
  
    <xsl:template match="ogc:ServiceException">
  
      <table>
  
        <tr>
  
          <td>Service Exception:</td>
  
          <td><xsl:apply-templates/></td>
  
        </tr>
  
      </table>
  
    </xsl:template>
  
  
  
    <!-- Transaction Response -->
  
    <xsl:template match="wfs:WFS_TransactionResponse">
  
      <table>
  
        <tr>
  
          <td>Transaction Status:</td>
  
          <td><xsl:value-of select="name(wfs:TransactionResult/wfs:Status/*)"/></td>
  
        </tr>
  
        <tr>
  
          <td>New Feature Id:</td>
  
          <td><xsl:value-of select="wfs:InsertResult/ogc:FeatureId/@fid"/></td>
  
        </tr>
  
      </table>
  
    </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Version.xsl
  
  Index: Version.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Displays the mapbuilder version.
  Author:      Cameron Shorter
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <xsl:param name="version">$Name$</xsl:param>
    <xsl:param name="version1" select="substring-after($version,'mapbuilder-lib-')"/>
    <xsl:param name="version2" select="normalize-space(substring-before($version1,'$'))"/>
  
    <!-- Main html -->
    <xsl:template match="/">
      <div>
        <xsl:choose>
          <xsl:when test="$version2">              
            <xsl:value-of select="$version2"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>CVS Head</xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </div>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
  </xsl:stylesheet>
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WebServiceForm.js
  
  Index: WebServiceForm.js
  ===================================================================
  /*
  Author:       Mike Adair mike.adairATccrs.nrcan.gc.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Widget to display a form for input of parameters to generate a web service 
   * request.  This JS object handles the form submit via HTTP Get by appending 
   * a query string to the form's action URL.  The query string is created from
   * all input elements and their values.
   * The target model is then loaded from the URL created.
   * A stylehseet must be specified as a property in config for this widget.  
   * See widget/NtsForm.xsl for an example. 
   *
   * @constructor
   * @base WidgetBaseXSL
   * @param widgetNode This widget's object node from the configuration document.
   * @param model The model that this widget is a view of.
   */
  
  function WebServiceForm(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
    this.formElements = new Object();
  
    /**
     * Handles submission of the form (via javascript in an <a> tag)
     */
    this.submitForm = function() {
      this.webServiceForm = document.getElementById(this.formName);
  
      //create the http GET URL
      //TBD: handle POST submission
      //TBD: create filter request
      var webServiceUrl = this.webServiceForm.action + "?";
      for (var i=0; i<this.webServiceForm.elements.length; ++i) {
        var element = this.webServiceForm.elements[i];
        webServiceUrl += element.name + "=" + element.value + "&";
        this.formElements[element.name] = element.value;
      }
      if (this.debug) alert(webServiceUrl);
  
      var httpPayload = new Object();
      httpPayload.method = "get";
      httpPayload.url = webServiceUrl;
      this.targetModel.newRequest(this.targetModel,httpPayload);
    }
  
    /**
     * handles keypress events to filter out everything except "enter".  
     * Pressing the "enter" key will trigger a form submit
     * @param event  the event object passed in for Mozilla; IE uses window.event
     */
    this.handleKeyPress = function(event) {
      var keycode;
      var target;
      if (event){
        //Mozilla
        keycode=event.which;
        target=event.currentTarget;
      }else{
        //IE
        keycode=window.event.keyCode;
        target=window.event.srcElement.form;
      }
  
      if (keycode == 13) {    //enter key
        target.parentWidget.submitForm();
        return false;
      }
    }
  
    /**
     * Refreshes the form onblur handlers when this widget is painted.
     * @param objRef Pointer to this object.
     */
    this.postPaint = function(objRef) {
      objRef.webServiceForm = document.getElementById(objRef.formName);
      objRef.webServiceForm.parentWidget = objRef;
      objRef.webServiceForm.onkeypress = objRef.handleKeyPress;
      //objRef.WebServiceForm.onsubmit = objRef.submitForm;
      //objRef.WebServiceForm.mapsheet.onblur = objRef.setMapsheet;
    }
  
    //set some properties for the form output
    this.formName = "WebServiceForm_" + mbIds.getId();
    this.stylesheet.setParameter("formName", this.formName);
  
    /**
     * Sets value for form elements
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      for (var elementName in objRef.formElements) {
        objRef.stylesheet.setParameter(elementName, objRef.formElements[elementName]);
      }
    }
  
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WfsGetFeature.js
  
  Index: WfsGetFeature.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  Dependancies: Context
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/tool/ButtonBase.js");
  /**
   * Builds then sends a WFS GetFeature GET request based on the WMC
   * coordinates and click point.
   * @constructor
   * @base ButtonBase
   * @author Cameron Shorter
   * @param widgetNode The XML node in the Config file referencing this object.
   * @param model The Context object which this tool is associated with.
   */
  function WfsGetFeature(widgetNode, model) {
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model));
    this.tolerance= widgetNode.selectSingleNode('mb:tolerance').firstChild.nodeValue;
    this.typeName= widgetNode.selectSingleNode('mb:typeName').firstChild.nodeValue;
    this.webServiceUrl= widgetNode.selectSingleNode('mb:webServiceUrl').firstChild.nodeValue;
    this.httpPayload=new Object();
    this.httpPayload.method="get";
    this.httpPayload.postData=null;
    this.trm=widgetNode.selectSingleNode("mb:transactionResponseModel").firstChild.nodeValue;
  
    // override default cursor by user
    // cursor can be changed by spefying a new cursor in config file
    this.cursor = "pointer"; 
  
    /**
     * Open window with query info.
     * This function is called when user clicks map with Query tool.
     * @param objRef      Pointer to this GetFeatureInfo object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        extent=objRef.targetModel.extent;
        point=extent.getXY(targetNode.evpl);
        xPixel=extent.res[0]*objRef.tolerance;
        yPixel=extent.res[1]*objRef.tolerance;
        bbox=(point[0]-xPixel)+","+(point[1]-yPixel)+","+(point[0]+xPixel)+","+(point[1]+yPixel);
        objRef.httpPayload.url=objRef.webServiceUrl+"?request=GetFeature&typeName="+objRef.typeName+"&bbox="+bbox;
  
        // Model that will be populated with the WFS response.
        if (!objRef.transactionResponseModel){
          objRef.transactionResponseModel=eval("config.objects."+objRef.trm);
          //objRef.transactionResponseModel.addListener("loadModel",objRef.handleResponse, objRef);
        }
        objRef.transactionResponseModel.newRequest(objRef.transactionResponseModel,objRef.httpPayload);
      }
    }
    
  
    /**
     * Register for mouseUp events.
     * @param objRef  Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.mouseHandler) {
        objRef.mouseHandler.model.addListener('mouseup',objRef.doAction,objRef);
      }
      objRef.context=objRef.widgetNode.selectSingleNode("mb:context");
      if (objRef.context){
        objRef.context=eval("config.objects."+objRef.context.firstChild.nodeValue);
      }
    }
    config.addListener( "loadModel", this.setMouseListener, this );
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/Widget.js
  
  Index: Widget.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Generic Widget object for widgets where no specialization is required.  
   * This is just an instance of a abstract WidgetBase object.
   * This widget requires a <stylesheet> property in the config file.
   * @constructor
   * @base WidgetBase
   * @author Cameron Shorter cameronATshorter.net
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function Widget(widgetNode, model) {
    //var base = new WidgetBaseXSL(this, widgetNode, model);
    WidgetBaseXSL.apply(this, new Array(widgetNode, model));
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WidgetBase.js
  
  Index: WidgetBase.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Base Class for widgets.  Associates a node on the page with a stylesheet and
   * model.  All widgets must extend this base class.
   * Defines the default paint() method for all widgets which is where the 
   * stylesheet is applied to the model XML document.
   * To override widget.paint(), define it before calling this constructor.
   * The stylesheet URL defaults to "widget/<widgetName>.xsl" if it is not defined
   * in config file.  Set a stylesheet property containing an XSL URL in config
   * to customize the stylesheet used.
   * All stylesheets will have "modelId" and "widgetId" parameters set when called.
   *
   * @constructor
   * @author Mike Adair 
   * @param widget      Pointer to the widget instance being created
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function WidgetBase(widgetNode,model) {
    this.model = model;
    this.widgetNode = widgetNode;
  //alert(widgetNode.nodeName);
  
    /** Widget's Id defined in the Config (required) */
    if (widgetNode.attributes.getNamedItem("id")) {
      this.id = widgetNode.attributes.getNamedItem("id").nodeValue;
    } else {
      alert("id required for object:" + widgetNode.nodeName );
    }
  
    //allow the widget output to be replaced on each paint call
    this.autoRefresh = true;
    var outputNode = widgetNode.selectSingleNode("mb:outputNodeId");
    if ( outputNode ) {
      this.outputNodeId = outputNode.firstChild.nodeValue;
      this.autoRefresh = false;
    } else {
      this.outputNodeId = "MbWidget_" + mbIds.getId();
    }
  
    //until htmlTagNode becomes required allow setting of it by widget id
    if (!this.htmlTagId) {
      var htmlTagNode = widgetNode.selectSingleNode("mb:htmlTagId");
      if (htmlTagNode) {
        this.htmlTagId = htmlTagNode.firstChild.nodeValue;
      } else {
        this.htmlTagId = this.id;
      }
    }
  
    // Node in main HTML to attach widget to.
    this.node = document.getElementById(this.htmlTagId);
    if(!this.node) {
      //alert("htmlTagId: "+this.htmlTagId+" for widget "+widgetNode.nodeName+" not found in config");
    }
  
    //set an empty debug property in config to see inputs and outputs of stylehseet
    if ( widgetNode.selectSingleNode("mb:debug") ) this.debug=true;
  
    /**
     * Initialize dynamic properties.set the target model
     * @param toolRef Pointer to this object.
     */
    this.initTargetModel = function(objRef) {
      //set the target model
      var targetModel = objRef.widgetNode.selectSingleNode("mb:targetModel");
      if (targetModel) {
        objRef.targetModel = eval("config.objects."+targetModel.firstChild.nodeValue);
        if ( !objRef.targetModel ) {
          alert("error finding targetModel:" + targetModel.firstChild.nodeValue + " for:" + objRef.id);
        }
      } else {
        objRef.targetModel = objRef.model;
      }
    }
    this.model.addListener("init", this.initTargetModel, this);
  
    /**
     * Called before paint(), can be used to set up a widget's paint parameters,
     * or modify model using this.resultDoc().
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      //no-op by default
    }
  
    /**
     * Called after paint(), can be used to initialize things that depend on the
     * the widget output being presetn, eg. form and form elements
     * @param objRef Pointer to this object.
     */
    this.postPaint = function(objRef) {
      //no-op by default
    }
  
    /**
     * Remove widget from display.
     * @param objRef Pointer to this object.
     */ 
    this.clearWidget = function(objRef) {
      //with objRef.node remove child
      var outputNode = document.getElementById( objRef.outputNodeId );
      if (outputNode) objRef.node.removeChild(outputNode);
    }
    this.model.addListener("newModel",this.clearWidget, this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WidgetBase.js.txt
  
  Index: WidgetBase.js.txt
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  /**
   * Base Class for widgets.  Associates a node on the page with a stylesheet and
   * model.  All widgets must extend this base class.
   * Defines the default paint() method for all widgets which is where the 
   * stylesheet is applied to the model XML document.
   * To override widget.paint(), define it before calling this constructor.
   * The stylesheet URL defaults to "widget/<widgetName>.xsl" if it is not defined
   * in config file.  Set a stylesheet property containing an XSL URL in config
   * to customize the stylesheet used.
   * All stylesheets will have "modelId" and "widgetId" parameters set when called.
   *
   * @constructor
   * @author Mike Adair 
   * @param widget      Pointer to the widget instance being created
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function WidgetBase(widget,widgetNode,model) {
    widget.model = model;
    widget.widgetNode = widgetNode;
  
    /** Method used for painting.
     * xsl2html (default) => output of XSL will be HTML.
     * xsl2js => output of XSL will be javascript to execute.
     * image2html => where the model doc has content type image/*
     */
    widget.paintMethod="xsl2html";
  
    /** Widget's Id defined in the Config (required) */
    if (widgetNode.attributes.getNamedItem("id")) {
      widget.id = widgetNode.attributes.getNamedItem("id").nodeValue;
    } else {
      alert("id required for object:" + widgetNode.nodeName );
    }
  
    //allow the widget output to be replaced on each paint call
    var outputNode = widgetNode.selectSingleNode("mb:outputNodeId");
    if ( outputNode ) {
      widget.outputNodeId = outputNode.firstChild.nodeValue;
    } else {
      widget.outputNodeId = "MbWidget_" + mbIds.getId();
    }
  
    //until htmlTagNode becomes required allow setting of it by widget id
    if (!widget.htmlTagId) {
      var htmlTagNode = widgetNode.selectSingleNode("mb:htmlTagId");
      if (htmlTagNode) {
        widget.htmlTagId = htmlTagNode.firstChild.nodeValue;
      } else {
        widget.htmlTagId = widget.id;
      }
    }
  
    // Node in main HTML to attach widget to.
    widget.node = document.getElementById(widget.htmlTagId);
    if(!widget.node) {
      //alert("htmlTagId: "+widget.htmlTagId+" for widget "+widgetNode.nodeName+" not found in config");
    }
  
    //set an empty debug property in config to see inputs and outputs of stylehseet
    if ( widgetNode.selectSingleNode("mb:debug") ) widget.debug=true;
  
    /** Transient var used to store model XML before and then after XSL transform.
     *  It can be modified by prePaint() .
     */
    widget.resultDoc = null;
  
    // Set this.stylesheet
    // Defaults to "widget/<widgetName>.xsl" if not defined in config file.
    if ( !widget.stylesheet ) {
      var styleNode = widgetNode.selectSingleNode("mb:stylesheet");
      if (styleNode ) {
        widget.stylesheet = new XslProcessor(styleNode.firstChild.nodeValue,model.namespace);
      } else {
        widget.stylesheet = new XslProcessor(baseDir+"/widget/"+widgetNode.nodeName+".xsl",model.namespace);
      }
    }
  
    /**
     * Initialize dynamic properties.set the target model
     * @param toolRef Pointer to this object.
     */
    this.initTargetModel = function(objRef) {
      //set the target model
      var targetModel = objRef.widgetNode.selectSingleNode("mb:targetModel");
      if (targetModel) {
        objRef.targetModel = eval("config.objects."+targetModel.firstChild.nodeValue);
        if ( !objRef.targetModel ) {
          alert("error finding targetModel:" + targetModel.firstChild.nodeValue + " for:" + objRef.id);
        }
      } else {
        objRef.targetModel = objRef.model;
      }
      objRef.stylesheet.setParameter("targetModelId", objRef.targetModel.id );
    }
  
  
    // Set stylesheet parameters for all the child nodes from the config file
    for (var j=0;j<widgetNode.childNodes.length;j++) {
      if (widgetNode.childNodes[j].firstChild
        && widgetNode.childNodes[j].firstChild.nodeValue)
      {
        widget.stylesheet.setParameter(
          widgetNode.childNodes[j].nodeName,
          widgetNode.childNodes[j].firstChild.nodeValue);
      }
    }
  
    // Set widget text values as parameters 
    if (config.widgetText) {
      var textNodeXpath = "/mb:WidgetText/mb:widgets/mb:" + widgetNode.nodeName;
      var textParams = config.widgetText.selectNodes(textNodeXpath+"/*");
      for (var j=0;j<textParams.length;j++) {
        widget.stylesheet.setParameter(textParams[j].nodeName,textParams[j].firstChild.nodeValue);
      }
    }
  
    //all stylesheets will have these properties available
    widget.stylesheet.setParameter("modelId", widget.model.id );
    widget.stylesheet.setParameter("modelTitle", widget.model.title );
    widget.stylesheet.setParameter("widgetId", widget.id );
    widget.stylesheet.setParameter("skinDir", config.skinDir );
    widget.stylesheet.setParameter("lang", config.lang );
  
    /**
     * Move this widget to the absolute (left,top) position in the browser.
     * @param left Absolute left coordinate.
     * @param top Absolute top coordinate.
     */
    this.move = function(left,top) {
      this.node.style.left = left;
      this.node.style.top = top;
    }
  
    /**
     * Resize this widget.
     * @param width New width.
     * @param height New height.
     */
    this.resize = function(width,height) {
      this.node.style.width = width;
      this.node.style.height = height;
    }
  
    /**
     * Called change the visibility of this widget's output node
     * @param vis   boolean true or false 
     */
    this.setVisibility = function(vis) {
      var vis="visible";
      if (vis) vis="hidden";
      document.getElementById(this.outputNodeId).style.visibility = vis;
    }
  
    /**
     * Called before paint(), can be used to set up a widget's paint parameters,
     * or modify model using this.resultDoc().
     * @param objRef Pointer to this object.
     */
    this.prePaint = function(objRef) {
      //no-op by default
    }
  
    /**
     * Called after paint(), can be used to initialize things that depend on the
     * the widget output being presetn, eg. form and form elements
     * @param objRef Pointer to this object.
     */
    this.postPaint = function(objRef) {
      //no-op by default
    }
  
  
  
  
  
  
  //to override the paint method, define it in the exetnsion class before calling 
  //the WidgetBase constructor.  This is so that when paint is registered as a
  //listener, the method from the instance is used.
  if (!widget.paint) {
  
    /**
     * Render the widget.
     * @param objRef Pointer to widget object.
     */
  
  	
   this.paint = function(objRef) {
  
      if (objRef.model.template) return;
  
      // Remove widget from display if the model is empty
      if (!objRef.model.doc){
        objRef.clearWidget(objRef);
      }
  
      if (objRef.model.doc && objRef.node) {
        objRef.stylesheet.setParameter("modelUrl", objRef.model.url);
  
        //if (objRef.debug) alert("source:"+Sarissa.serialize(objRef.model.doc));
        objRef.resultDoc = objRef.model.doc; // resultDoc sometimes modified by prePaint()
        objRef.prePaint(objRef);
  
        //confirm inputs
        if (objRef.debug) alert("prepaint:"+Sarissa.serialize(objRef.resultDoc));
        if (objRef.debug) alert("stylesheet:"+Sarissa.serialize(objRef.stylesheet.xslDom));
  
        //set to output to a temporary node
        //hack to get by doc parsing problem in IE
        //the firstChild of tempNode will be the root element output by the stylesheet
        var outputNode = document.getElementById( objRef.outputNodeId );
        var tempNode = document.createElement("DIV");
        switch (objRef.paintMethod) {
          case "xsl2html":
            //process the doc with the stylesheet
            var s = objRef.stylesheet.transformNodeToString(objRef.resultDoc);
            if (config.serializeUrl && objRef.debug) postLoad(config.serializeUrl, s);
            if (objRef.debug) alert("painting:"+objRef.id+":"+s);
            tempNode.innerHTML = s;
            tempNode.firstChild.setAttribute("id", objRef.outputNodeId);
  
            //look for this widgets output and replace if found,
            //otherwise append it
            if (outputNode) {
              objRef.node.replaceChild(tempNode.firstChild,outputNode);
            } else {
              objRef.node.appendChild(tempNode.firstChild);
            }
            break;
          case "image2html":
            //here the model document is an image
            tempNode.style.position="absolute";
            tempNode.style.top=0;
            tempNode.style.left=0;
            tempNode.appendChild(objRef.model.doc);
            tempNode.setAttribute("id", objRef.outputNodeId);
  
            //look for this widgets output and replace if found,
            //otherwise append it
            if (outputNode) {
              objRef.node.replaceChild(tempNode,outputNode);
            } else {
              objRef.node.appendChild(tempNode);
            }
            break;
          case "xsl2js":
            jsNode = objRef.stylesheet.transformNodeToObject(objRef.resultDoc);
            js=jsNode.selectSingleNode("js").firstChild.nodeValue;
            tempNode.style.position="absolute";
            tempNode.style.top=0;
            tempNode.style.left=0;
            tempNode.setAttribute("id", objRef.outputNodeId);
            //look for this widgets output and replace if found,
            //otherwise append it
            if (outputNode) {
              objRef.node.replaceChild(tempNode,outputNode);
            } else {
              objRef.node.appendChild(tempNode);
            }
            if (objRef.debug) alert("javascript eval:"+js);
            objRef.model.setParam("modelStatus","rendering");
            eval(js);
  
            break;
  		//Michael Jenik added this case for the MapContainer Paint
  		case "preloading":
          break;
  
          default:
            alert("WidgetBase: Invalid paintMethod="+objRef.paintMethod);
        }
  
        objRef.postPaint(objRef);
      }
    }
  }
  
    /**
     * Remove widget from display.
     * @param objRef Pointer to this object.
     */ 
    this.clearWidget = function(objRef) {
      //with objRef.node remove child
      var outputNode = document.getElementById( objRef.outputNodeId );
      if (outputNode) objRef.node.removeChild(outputNode);
    }
  
    // If this object is being created because a child is extending this object,
    // then child.properties = this.properties
    for (sProperty in this) {
      widget[sProperty] = this[sProperty];
    }
  
    // Call paint when model changes
    widget.model.addListener("init", widget.initTargetModel, widget);
    widget.model.addListener("refresh",widget.paint, widget);
    widget.model.addListener("newModel",widget.clearWidget, widget);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WidgetBaseWZ.js
  
  Index: WidgetBaseWZ.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * Base Class for widgets.  Associates a node on the page with a stylesheet and
   * model.  All widgets must extend this base class.
   * Defines the default paint() method for all widgets which is where the 
   * stylesheet is applied to the model XML document.
   * To override widget.paint(), define it before calling this constructor.
   * The stylesheet URL defaults to "widget/<widgetName>.xsl" if it is not defined
   * in config file.  Set a stylesheet property containing an XSL URL in config
   * to customize the stylesheet used.
   * All stylesheets will have "modelId" and "widgetId" parameters set when called.
   *
   * @constructor
   * @author Mike Adair 
   * @param widget      Pointer to the widget instance being created
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function WidgetBaseWZ(widgetNode,model) {
    // Extend WidgetBase
    WidgetBase.apply(this, new Array(widgetNode, model));
  
    // Set this.stylesheet
    // Defaults to "widget/<widgetName>.xsl" if not defined in config file.
    if ( !widget.stylesheet ) {
      var styleNode = widgetNode.selectSingleNode("mb:stylesheet");
      if (styleNode ) {
        widget.stylesheet = new XslProcessor(styleNode.firstChild.nodeValue,model.namespace);
      } else {
        widget.stylesheet = new XslProcessor(baseDir+"/widget/"+widgetNode.nodeName+".xsl",model.namespace);
      }
    }
  
    // Set stylesheet parameters for all the child nodes from the config file
    for (var j=0;j<widgetNode.childNodes.length;j++) {
      if (widgetNode.childNodes[j].firstChild
        && widgetNode.childNodes[j].firstChild.nodeValue)
      {
        widget.stylesheet.setParameter(
          widgetNode.childNodes[j].nodeName,
          widgetNode.childNodes[j].firstChild.nodeValue);
      }
    }
  
    // Set widget text values as parameters 
    if (config.widgetText) {
      var textNodeXpath = "/mb:WidgetText/mb:widgets/mb:" + widgetNode.nodeName;
      var textParams = config.widgetText.selectNodes(textNodeXpath+"/*");
      for (var j=0;j<textParams.length;j++) {
        widget.stylesheet.setParameter(textParams[j].nodeName,textParams[j].firstChild.nodeValue);
      }
    }
  
    //all stylesheets will have these properties available
    widget.stylesheet.setParameter("modelId", widget.model.id );
    widget.stylesheet.setParameter("modelTitle", widget.model.title );
    widget.stylesheet.setParameter("widgetId", widget.id );
    widget.stylesheet.setParameter("skinDir", config.skinDir );
    widget.stylesheet.setParameter("lang", config.lang );
  
    /**
     * Render the widget.
     * @param objRef Pointer to widget object.
     */
    this.paint = function(objRef) {
      if (objRef.model.doc && objRef.node) {
        objRef.stylesheet.setParameter("modelUrl", objRef.model.url);
        objRef.stylesheet.setParameter("targetModelId", objRef.targetModel.id );
  
        //if (objRef.debug) alert("source:"+Sarissa.serialize(objRef.model.doc));
        objRef.resultDoc = objRef.model.doc; // resultDoc sometimes modified by prePaint()
        objRef.prePaint(objRef);
  
        //confirm inputs
        if (objRef.debug) alert("prepaint:"+Sarissa.serialize(objRef.resultDoc));
        if (objRef.debug) alert("stylesheet:"+Sarissa.serialize(objRef.stylesheet.xslDom));
  
        //set to output to a temporary node
        //hack to get by doc parsing problem in IE
        //the firstChild of tempNode will be the root element output by the stylesheet
        var outputNode = document.getElementById( objRef.outputNodeId );
        var tempNode = document.createElement("DIV");
  
        //process the doc with the stylesheet
        var s = objRef.stylesheet.transformNodeToString(objRef.resultDoc);
        if (config.serializeUrl && objRef.debug) postLoad(config.serializeUrl, s);
        if (objRef.debug) alert("painting:"+objRef.id+":"+s);
        tempNode.innerHTML = s;
        tempNode.firstChild.setAttribute("id", objRef.outputNodeId);
  
        //look for this widgets output and replace if found,
        //otherwise append it
        if (outputNode) {
          objRef.node.replaceChild(tempNode.firstChild,outputNode);
        } else {
          objRef.node.appendChild(tempNode.firstChild);
        }
  
        objRef.postPaint(objRef);
      }
    }
  
    /**
     * Remove widget from display.
     * @param objRef Pointer to this object.
     */ 
    this.clearWidget = function(objRef) {
      //with objRef.node remove child
      var outputNode = document.getElementById( objRef.outputNodeId );
      if (outputNode) objRef.node.removeChild(outputNode);
    }
  
    // Call paint when model changes
    widget.model.addListener("refresh",widget.paint, widget);
    widget.model.addListener("newModel",widget.clearWidget, widget);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WidgetBaseXSL.js
  
  Index: WidgetBaseXSL.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  mapbuilder.loadScript(baseDir+"/widget/WidgetBase.js");
  
  /**
   * Base Class for widgets.  Associates a node on the page with a stylesheet and
   * model.  All widgets must extend this base class.
   * Defines the default paint() method for all widgets which is where the 
   * stylesheet is applied to the model XML document.
   * To override widget.paint(), define it before calling this constructor.
   * The stylesheet URL defaults to "widget/<widgetName>.xsl" if it is not defined
   * in config file.  Set a stylesheet property containing an XSL URL in config
   * to customize the stylesheet used.
   * All stylesheets will have "modelId" and "widgetId" parameters set when called.
   *
   * @constructor
   * @author Mike Adair 
   * @param widget      Pointer to the widget instance being created
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  function WidgetBaseXSL(widgetNode,model) {
    // Extend WidgetBase
    WidgetBase.apply(this, new Array(widgetNode, model));
  
    // Set this.stylesheet
    // Defaults to "widget/<widgetName>.xsl" if not defined in config file.
    if ( !this.stylesheet ) {
      var styleNode = widgetNode.selectSingleNode("mb:stylesheet");
      if (styleNode ) {
        this.stylesheet = new XslProcessor(styleNode.firstChild.nodeValue,model.namespace);
      } else {
        this.stylesheet = new XslProcessor(baseDir+"/widget/"+widgetNode.nodeName+".xsl",model.namespace);
      }
    }
  
    // Set widget text values as parameters 
    if (config.widgetText) {
      var textNodeXpath = "/mb:WidgetText/mb:widgets/mb:" + widgetNode.nodeName;
      var textParams = config.widgetText.selectNodes(textNodeXpath+"/*");
      for (var j=0;j<textParams.length;j++) {
        this.stylesheet.setParameter(textParams[j].nodeName,textParams[j].firstChild.nodeValue);
      }
    }
  
    // Set stylesheet parameters for all the child nodes from the config file
    for (var j=0;j<widgetNode.childNodes.length;j++) {
      if (widgetNode.childNodes[j].firstChild
        && widgetNode.childNodes[j].firstChild.nodeValue)
      {
        this.stylesheet.setParameter(
          widgetNode.childNodes[j].nodeName,
          widgetNode.childNodes[j].firstChild.nodeValue);
      }
    }
  
    //all stylesheets will have these properties available
    this.stylesheet.setParameter("modelId", this.model.id );
    this.stylesheet.setParameter("modelTitle", this.model.title );
    this.stylesheet.setParameter("widgetId", this.id );
    this.stylesheet.setParameter("skinDir", config.skinDir );
    this.stylesheet.setParameter("lang", config.lang );
  
    /**
     * Render the widget.
     * @param objRef Pointer to widget object.
     */
    this.paint = function(objRef, refresh) {
  
      if (objRef.model.doc && objRef.node && (objRef.autoRefresh||refresh) ) {
        objRef.stylesheet.setParameter("modelUrl", objRef.model.url);
        objRef.stylesheet.setParameter("targetModelId", objRef.targetModel.id );
  
        //if (objRef.debug) alert("source:"+Sarissa.serialize(objRef.model.doc));
        objRef.resultDoc = objRef.model.doc; // resultDoc sometimes modified by prePaint()
        objRef.prePaint(objRef);
  
        //confirm inputs
        if (objRef.debug) alert("prepaint:"+Sarissa.serialize(objRef.resultDoc));
        if (objRef.debug) alert("stylesheet:"+Sarissa.serialize(objRef.stylesheet.xslDom));
  
        //set to output to a temporary node
        //hack to get by doc parsing problem in IE
        //the firstChild of tempNode will be the root element output by the stylesheet
        var outputNode = document.getElementById( objRef.outputNodeId );
        var tempNode = document.createElement("DIV");
  
        //process the doc with the stylesheet
        var s = objRef.stylesheet.transformNodeToString(objRef.resultDoc);
        if (config.serializeUrl && objRef.debug) postLoad(config.serializeUrl, s);
        if (objRef.debug) alert("painting:"+objRef.id+":"+s);
        tempNode.innerHTML = s;
        if( tempNode.firstChild != null ) { //Could be null!
          tempNode.firstChild.setAttribute("id", objRef.outputNodeId);
  
  	    //look for this widgets output and replace if found,
  	    //otherwise append it
  	    if (outputNode) {
  	      objRef.node.replaceChild(tempNode.firstChild,outputNode);
  	    } else {
  	      objRef.node.appendChild(tempNode.firstChild);
  	    }
        }
        objRef.postPaint(objRef);
      }
    }
    // Call paint when model changes
    this.model.addListener("refresh",this.paint, this);
  
    /**
     * Remove widget from display.
     * @param objRef Pointer to this object.
     */ 
    this.clearWidget = function(objRef) {
      //with objRef.node remove child
      var outputNode = document.getElementById( objRef.outputNodeId );
      if (outputNode) objRef.node.removeChild(outputNode);
    }
    this.model.addListener("newModel",this.clearWidget, this);
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WktParser.js
  
  Index: WktParser.js
  ===================================================================
  /*
  Author:       Nedjo Rogers nedjo ATgworks.ca
  License:      LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  */
  
  /**
   * Parse OGC Simple Features for SQL WKT into GML.
   * @constructor
   */
  function WktParser() {
  
    /**
     * Do parsing.
     * @param geom Geometry in WKT format.
     */
    this.parse = function(geom) {
      geomTypeExp=/(\D+)\(([^)]+)\)/;
      pointExp=/(-?[0-9]+\.[0-9]+)\s+(-?[0-9]+\.[0-9]+)/;
      ringExp=/\(([^)]+)\)/;
      if (match = geomTypeExp.exec(geom)) {
        switch(match[1]) {
          case 'POINT':
            if (pt = pointExp.exec(match[2])) {
              out = '<gml:Point><gml:coordinates decimal="." cs="," ts=" "><gml:coord>' + pt[1] + ',' + pt[2] + '</gml:coord></gml:coordinates></gml:Point>';
            }
            break;
          case 'LINESTRING':
            out = '<gml:Linestring><gml:coordinates decimal="." cs="," ts=" ">';
            while (pt = pointExp.exec(match[2])) {
              out += '<gml:coord>' + pt[1] + ',' + pt[2] + '</gml:coord>';
              match[2] = match[2].replace(pt[0], '');
            }
            out += '</gml:coordinates></gml:Linestring>';
            break;
        }
      }
      return out;
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WmsCapabilitiesImport.js
  
  Index: WmsCapabilitiesImport.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/WidgetBaseXSL.js");
  
  /**
   * Build a WMC document from a WMS GetCapabilities response.
   * @constructor
   * @base WidgetBaseXSL
   * @author Cameron Shorter cameronATshorter.net
   * @param widgetNode  The widget's XML object node from the configuration document.
   * @param model       The model object that this widget belongs to.
   */
  
  function WmsCapabilitiesImport(widgetNode, model) {
    WidgetBaseXSL.apply(this,new Array(widgetNode, model));
  
    /**
     * Load Capabilities document when ENTER is pressed.
     * param e The window event.
     */
    this.onKeyPress=function(e) {
      var url;
      var keycode;
      if (e.which){
        //Mozilla
        keycode=e.which;
        url=e.currentTarget.value;
      }else{
        //IE
        keycode=window.event.keyCode;
        url=window.event.srcElement.value;
      }
  
      if (keycode == 13) {
        capabilities = Sarissa.getDomDocument();
        capabilities.async = false;
        capabilities.load(url);
        alert("capabilities="+capabilities.xml);
  
        xsl = Sarissa.getDomDocument();
        xsl.async = false;
        xsl.load(baseDir+"/widget/wms/WMSCapabilities2Context.xsl");
        alert("xsl="+xsl.xml);
  
        context=Sarissa.getDomDocument();
        capabilities.transformNodeToObject(xsl,context);
        alert("context="+context.xml);
  
        // Load the new Context Document
        this.model.loadModelNode(context);
      }
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/WmsCapabilitiesImport.xsl
  
  Index: WmsCapabilitiesImport.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <!--
  Description: Provides a form to enter a WMS GetCapabilities URL into.
  Author:      Cameron Shorter cameron ATshorter.net
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  $Name$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <!-- Main html -->
    <xsl:template match="/">
      <DIV>
      <form>
        <h3>Load WMS GetCapabilities:</h3>
        <textarea cols="40" rows="1" onkeypress="config.objects.{$widgetId}.onKeyPress(event)">../lib/widget/wms/GmapCapabilities.xml</textarea> 
      </form>
      </DIV>
    </xsl:template>
    
    <xsl:template match="text()|@*"/>
  </xsl:stylesheet>
  
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/XmlForm.xsl
  
  Index: XmlForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" xmlns:wmc="http://www.opengis.net/context" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" >
  
  <!--
  Description: Prototype stylesheet to automatically generate a form from an XML doc.
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  XmlForm.xsl,v 1.1 2004/06/28 03:46:49 madair1 Exp
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <xsl:param name="procNode"></xsl:param>
    
    <!-- The name of the form for coordinate output -->
    <xsl:param name="formName">XmlForm</xsl:param>
  
    <!-- Main html -->
  	<xsl:template match="/">
      <div>
      <form name="{$formName}" id="{$formName}">
        <xsl:apply-templates select="wmc:ViewContext/wmc:General/wmc:ContactInformation"/> 
      </form>
      </div>
    </xsl:template>
  
  	<xsl:template match="*">
      <xsl:choose>
        <xsl:when test="string-length(normalize-space(text()))>0">
          <xsl:value-of select="name()"/>
          <xsl:element name="INPUT">
            <xsl:attribute name="ID">elId</xsl:attribute>
            <xsl:attribute name="TYPE">text</xsl:attribute>
            <xsl:attribute name="VALUE"><xsl:value-of select='text()'/></xsl:attribute>
          </xsl:element>
          <br/>
          <xsl:apply-templates /> 
        </xsl:when>
        <xsl:otherwise>
          <dl>
            <dt>
              <xsl:value-of select="name()"/>
            </dt>
            <dd>
              <xsl:apply-templates /> 
            </dd>
          </dl>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    
  	<xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/XmlSchemaForm.xsl
  
  Index: XmlSchemaForm.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wmc="http://www.opengis.net/context" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" >
  
  <!--
  Description: Prototype stylesheet to automatically generate a form from an XML schema.
  Author:      Mike Adair
  Licence:     LGPL as per: http://www.gnu.org/copyleft/lesser.html
  
  $Id$
  -->
  
    <xsl:output method="xml" encoding="utf-8"/>
  
    <!-- The common params set for all widgets -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
  
    <xsl:param name="rootElement">ContactInformation</xsl:param>
    <xsl:param name="nsTypeName"><xsl:value-of select="//xs:element[@name=$rootElement]/@type"/></xsl:param>
    
    <!-- The name of the form for coordinate output -->
    <xsl:param name="formName">XmlForm</xsl:param>
    <xsl:param name="xmlDoc" select="document('/mapbuilder/demo/context/atlasWorld.xml')"/>  <!-- Element tag names. -->
  
    <!-- Main html -->
  	<xsl:template match="/">
      <xsl:variable name="typeName"><xsl:value-of select="substring-after($nsTypeName,':')"/></xsl:variable>
      id:<xsl:value-of select="$xmlDoc/ViewContext/@id"/>
      <DIV>
      <FORM NAME="{$formName}" ID="{$formName}">
        <xsl:apply-templates select="xs:schema/xs:complexType[@name=$typeName]"> 
          <xsl:with-param name="currentDocNode" select="$xmlDoc/ViewContext/General/ContactInformation"/>
        </xsl:apply-templates>
      </FORM>
      </DIV>
    </xsl:template>
  	
  	<xsl:template match="xs:element">
      <xsl:param name="currentDocNode"/>
      <xsl:choose>
        <xsl:when test="@type='xs:string'">
          <tr><td>
            <xsl:value-of select="@name"/>
          </td><td>
            <xsl:variable name="docValue"><xsl:value-of select="$currentDocNode/@name"/></xsl:variable>
            <xsl:element name="INPUT">
              <xsl:attribute name="ID">elId</xsl:attribute>
              <xsl:attribute name="TYPE">text</xsl:attribute>
              <xsl:attribute name="VALUE"><xsl:value-of select="$docValue"/></xsl:attribute>
            </xsl:element>
            <xsl:apply-templates> 
              <xsl:with-param name="currentDocNode" select="$currentDocNode/@name"/>
            </xsl:apply-templates>
          </td></tr>
        </xsl:when>
        <xsl:otherwise>
          <xsl:variable name="complexTypeName"><xsl:value-of select="substring-after(@type,':')"/></xsl:variable>
          <tr><td colspan="2">
            <xsl:value-of select="@name"/>
            <xsl:apply-templates select="ancestor::*/xs:complexType[@name=$complexTypeName]"> 
              <xsl:with-param name="currentDocNode" select="$currentDocNode/@name"/>
            </xsl:apply-templates>
          </td></tr>
        </xsl:otherwise>
      </xsl:choose>
  	</xsl:template>
    
  	<xsl:template match="xs:complexType">
      <xsl:param name="currentDocNode"/>
      <dl>
        <dd>
          <xsl:apply-templates> 
            <xsl:with-param name="currentDocNode" select="$currentDocNode"/>
          </xsl:apply-templates>
        </dd>
      </dl>
  	</xsl:template>
    
  	<xsl:template match="xs:sequence">
      <xsl:param name="currentDocNode"/>
      <table border="1">
        <xsl:apply-templates> 
          <xsl:with-param name="currentDocNode" select="$currentDocNode"/>
        </xsl:apply-templates>
      </table>
  	</xsl:template>
    
  	<xsl:template match="text()|@*"/>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ZoomIn.js
  
  Index: ZoomIn.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is selected, clicks on the MapPane trigger a zoomIn to the 
   * currently set AOI.
   * @constructor
   * @base ButtonBase
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param widgetNode The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function ZoomIn(widgetNode, model) {
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    this.zoomBy = 4;//TBD: get this from config
  
    /**
     * Calls the model's ceter at method to zoom in.  If the AOI is a single point,
     * it zooms in by the zoomBy factor.
     * @param objRef      Pointer to this object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (objRef.enabled) {
        var bbox = objRef.targetModel.getParam("aoi");
        if ( bbox!=null) {
          var extent = objRef.targetModel.extent;
          var ul = bbox[0];
          var lr = bbox[1];
          if ( ( ul[0]==lr[0] ) && ( ul[1]==lr[1] ) ) {
            extent.centerAt( ul, extent.res[0]/objRef.zoomBy );
          } else {
            extent.zoomToBox( ul, lr );
          }
        }
      }
    }
  
    /**
     * Register for mouseUp events.
     * @param objRef  Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.mouseHandler) {
        objRef.mouseHandler.model.addListener('mouseup',objRef.doAction,objRef);
      }
    }
    this.model.addListener( "loadModel", this.setMouseListener, this );
  
  }
  
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/ZoomOut.js
  
  Index: ZoomOut.js
  ===================================================================
  /*
  License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
  $Id$
  */
  
  // Ensure this object's dependancies are loaded.
  mapbuilder.loadScript(baseDir+"/widget/ButtonBase.js");
  
  /**
   * When this button is selected, click on the map to zoom out centered at the click.
   * @constructor
   * @base ButtonBase
   * @author Mike Adair mike.adairATccrs.nrcan.gc.ca
   * @param widgetNode The widget node from the Config XML file.
   * @param model  The model for this widget
   */
  function ZoomOut(widgetNode, model) {
    // Extend ButtonBase
    ButtonBase.apply(this, new Array(widgetNode, model));
  
    this.zoomBy = 4;//TBD: get this from config
  
    /**
     * Calls the centerAt method of the context doc to zoom out, recentering at 
     * the mouse event coordinates.
     * TBD: set the zoomBy property as a button property in conifg
     * @param objRef      Pointer to this AoiMouseHandler object.
     * @param targetNode  The node for the enclosing HTML tag for this widget.
     */
    this.doAction = function(objRef,targetNode) {
      if (!objRef.enabled) return;
      var bbox = objRef.targetModel.getParam("aoi");
      var extent = objRef.targetModel.extent;
      var newRes = extent.res[0]*objRef.zoomBy;
      extent.centerAt(bbox[0], newRes);
    }
  
    /**
     * Register for mouseUp events.
     * @param objRef  Pointer to this object.
     */
    this.setMouseListener = function(objRef) {
      if (objRef.mouseHandler) {
        objRef.mouseHandler.model.addListener('mouseup',objRef.doAction,objRef);
      }
    }
    this.model.addListener( "loadModel", this.setMouseListener, this );
  
  }
  
  
  
  1.1                  metacat/lib/spatial/mapbuilder/lib/widget/owsMapPane.xsl
  
  Index: owsMapPane.xsl
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!--
  Description: parses an OGC context document to generate an array of DHTML layers.
              The context doc is from the OGC COntext IE where FeatureTypes, static
              GML and Coverages can be listed in addition to WMS layers.
  Author:      adair
  Licence:     LGPL as specified in http://www.gnu.org/copyleft/lesser.html .
  
  $Id$
  $Name$
  -->
  
  <xsl:stylesheet version="1.0" 
      xmlns:wmc="http://www.opengis.net/context" 
      xmlns:ows="http://www.opengis.net/ows"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:xlink="http://www.w3.org/1999/xlink">
  
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
  
    <!-- The coordinates of the DHTML Layer on the HTML page -->
    <xsl:param name="modelId"/>
    <xsl:param name="widgetId"/>
    <xsl:param name="context">config['<xsl:value-of select="$modelId"/>']</xsl:param>
    <xsl:param name="outputNodeId"/>
  
    <xsl:param name="lowerLeft"><xsl:value-of select="/wmc:OWSContext/wmc:General/ows:BoundingBox/ows:LowerCorner"/></xsl:param>
    <xsl:param name="upperRight"><xsl:value-of select="/wmc:OWSContext/wmc:General/ows:BoundingBox/ows:UpperCorner"/></xsl:param>
    <xsl:param name="bbox"><xsl:value-of select="translate($lowerLeft,' ',',')"/>,<xsl:value-of select="translate($upperRight,' ',',')"/></xsl:param>
    <xsl:param name="width">
      <xsl:value-of select="/wmc:OWSContext/wmc:General/wmc:Window/@width"/>
    </xsl:param>
    <xsl:param name="height">
      <xsl:value-of select="/wmc:OWSContext/wmc:General/wmc:Window/@height"/>
    </xsl:param>
    <xsl:param name="srs" select="/wmc:OWSContext/wmc:General/ows:BoundingBox/@crs"/>
    
    <!-- template rule matching source root element -->
    <xsl:template match="/wmc:OWSContext">
        <DIV STYLE="width:{$width}; height:{$height}; position:absolute" ID="{$outputNodeId}">
          <xsl:apply-templates select="wmc:ResourceList/*"/>
        </DIV>
    </xsl:template>
    
    <!-- these handled outside of the stylesheet -->
    <xsl:template match="wmc:Coverage"/>
    <xsl:template match="wmc:FeatureType"/>
    
    <xsl:template match="wmc:Layer">
      <xsl:param name="version">
          <xsl:value-of select="wmc:Server/@version"/>    
      </xsl:param>
      <xsl:param name="baseUrl">
          <xsl:value-of select="wmc:Server/wmc:OnlineResource/@xlink:href"/>    
      </xsl:param>
      <xsl:variable name="visibility">
        <xsl:choose>
          <xsl:when test="@hidden='1'">hidden</xsl:when>
          <xsl:otherwise>visible</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="firstJoin">
        <xsl:choose>
          <xsl:when test="substring($baseUrl,string-length($baseUrl))='?'"></xsl:when>
          <xsl:when test="contains($baseUrl, '?')">&amp;</xsl:when> 
          <xsl:otherwise>?</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:variable name="mapRequest">
        <xsl:choose>
          <xsl:when test="starts-with($version, '1.0')">
              WMTVER=<xsl:value-of select="$version"/>&amp;REQUEST=map
          </xsl:when>            
          <xsl:otherwise>
              VERSION=<xsl:value-of select="$version"/>&amp;REQUEST=GetMap&amp;SERVICE=WMS
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
  
      <DIV>    
          <xsl:attribute name="STYLE">position:absolute; visibility:<xsl:value-of select="$visibility"/>; top:0; left:0;</xsl:attribute>
          <xsl:attribute name="ID"><xsl:value-of select="$modelId"/>_<xsl:value-of select="$widgetId"/>_<xsl:value-of select="wmc:Name"/></xsl:attribute>
      
      <xsl:element name="IMG">    
          <xsl:variable name="src">    
              <xsl:value-of select="$baseUrl"/>
              <xsl:value-of select="$firstJoin"/>
               <xsl:value-of select="$mapRequest"/>
     &amp;SRS=<xsl:value-of select="$srs"/>
    &amp;BBOX=<xsl:value-of select="$bbox"/>
   &amp;WIDTH=<xsl:value-of select="$width"/>
  &amp;HEIGHT=<xsl:value-of select="$height"/>
  &amp;LAYERS=<xsl:value-of select="wmc:Name"/>
  &amp;STYLES=<xsl:value-of select="translate(wmc:StyleList/wmc:Style[@current='1']/wmc:Name,' ','+')"/>
  &amp;FORMAT=<xsl:value-of select="wmc:FormatList/wmc:Format[@current='1']"/>
  &amp;TRANSPARENT=TRUE
  
  <!--	
    //TBD: these still to be properly handled 
    //also sld support
    if (this.transparent) src += '&' + 'TRANSPARENT=' + this.transparent;
  	if (this.bgcolor) src += '&' + 'BGCOLOR=' + this.bgcolor;
  	//if (this.exceptions) src += '&' + 'EXCEPTIONS=' + this.exceptions;
  	if (this.vendorstr) src += '&' + this.vendorstr;
    //
          -->
          </xsl:variable>
          <xsl:attribute name="SRC">    
              <xsl:value-of select="translate(normalize-space($src),' ', '' )" disable-output-escaping="no"/>
          </xsl:attribute>
          <xsl:attribute name="WIDTH">
              <xsl:value-of select="$width"/>
          </xsl:attribute>
          <xsl:attribute name="HEIGHT">
              <xsl:value-of select="$height"/>
          </xsl:attribute>
          <xsl:attribute name="ALT">
              <xsl:value-of select="wmc:Title"/>
          </xsl:attribute>
      </xsl:element>
      </DIV>    
    </xsl:template>
  
  </xsl:stylesheet>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/license.txt
  
  Index: license.txt
  ===================================================================
  Copyright (c) 2005-2006 MetaCarta, Inc.
  All rights reserved.
  
  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:
  
    * Redistributions of source code must retain the above copyright notice, this
      list of conditions and the following disclaimer.
  
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
    * Neither the name of MetaCarta, Inc. nor the names of its contributors
      may be used to endorse or promote products derived from this software
      without specific prior written permission.
  
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/news.txt
  
  Index: news.txt
  ===================================================================
  OpenLayers 2.0 Release Notes
  
   * Deprecated Methods which were removed: 
  
   For details, see r1228
  
   * OpenLayers.Map
     * removed: getFullExtent() -- use  getMaxExtent() instead
     * removed: zoomToFullExtent() -- use  zoomToMaxExtent() instead
   * OpenLayers.Layer.Grid
     * removed: setTileSize() -- user should instead pass a 'tileSize' property 
                as one of the options when initializing the Grid Layer. ex: 
          
          var url = "http://octo.metacarta.com/cgi-bin/mapserv";
          var options = {tileSize: new OpenLayers.Size(500,50)};
          var map = new OpenLayers.Map('map', options);
          layer = new OpenLayers.Layer.WMS(name, url, params);
   
   * OpenLayers.Layer.HTTPRequest
     * removed: changeParams() -- use mergeNewParams() instead
   * OpenLayers.Pixel
     * removed: copyOf() -- use  clone() instead
   * OpenLayers.Size
     * removed: copyOf() -- use  clone() instead
   * OpenLayers.LonLat
     * removed: copyOf() -- use  clone() instead
   * OpenLayers.Bounds
     * removed: copyOf() -- use  clone() instead
   * Array
     * removed: copyOf() -- use  clone() instead
  
   * MouseWheel
    * It is now possible to zoom in/out with the mouse wheel instead of clicks.
   
   * Spiral Gridding
    * Instead of loading from the top to bottom of the map, Openlayers will 
      now start loading tiles from the center of the map.
  
   * Tile Re-Use
    * In order to lower memory constraints and reduce element creation times, 
      OpenLayers now creates a single set of images/tiles and reuses them as 
      you scroll around the map.
  
   * New Layer Support
    * Google 
    * Virtual Earth
    * GeoRSS (RSS 1.0 and 2.0 in FF, IE, RSS 2.0 in Safari)
    * KaMap
    * Untiled WMS
  
   * Scale Based Methods 
    * It is now possible to set zooms based on the concept of scale. See 
      documentation in the options for the Map constructor.
  
  OpenLayers 1.0
   Initial release.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/readme.txt
  
  Index: readme.txt
  ===================================================================
  OpenLayers
  -=-=-=-=-=-
  Copyright (c) 2005-2006 MetaCarta, Inc.
  
  OpenLayers is a JavaScript library for building map applications
  on the web. OpenLayers is made available under a BSD-license.
  Please see license.txt in this distribution for more details.
  
  ------------------
  Getting OpenLayers
  ------------------
  
  OpenLayers lives at http://www.openlayers.org/.
  
  You can get OpenLayers from
      http://trac.openlayers.org/wiki/HowToDownload.
  
  ---------------------
  Installing OpenLayers
  ---------------------
  
  You can use OpenLayers as-is by copying build/OpenLayers.js and the
  entire lib/ directory up to your webserver, putting them in the same
  directory. To include the OpenLayers library in your web page, use:
  
    <script type="text/javascript" src="OpenLayers.js" />
  
  If you want to use the multiple-file version of OpenLayers (for, say,
  debugging or development purposes), copy the lib/ directory up to your
  webserver in the same directory you put the img/ folder. Then add
  the following to your web page instead:
  
    <script type="text/javascript" src="lib/OpenLayers.js" />
  
  ------------------------------------
  Using OpenLayers in Your Own Website
  ------------------------------------
  
  The examples/ directory is full of useful examples.
  
  Dcumentation is available in the doc/ directory: to build an HTML version
  of the documentation, run ./docs.sh in the build/ directory.
  
  Information on changes in the API is available in news.txt.
  
  --------------------------
  Contributing to OpenLayers
  --------------------------
  
  Please join the email lists at http://openlayers.org/EmailLists/.
  Patches are welcome!
  
  = 30 =
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/arrows.svg
  
  Index: arrows.svg
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <!-- Created with Inkscape (http://www.inkscape.org/) -->
  <svg
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:cc="http://web.resource.org/cc/"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
     width="18.000000px"
     height="18.000000px"
     id="svg2"
     sodipodi:version="0.32"
     inkscape:version="0.42"
     sodipodi:docbase="/Users/phil/Documents/work/metacarta/2svn.openlayers.net/follower/code/b-edits-1/openlayers/assets/ui_elements"
     sodipodi:docname="pan_icons.svg"
     inkscape:export-filename="/Users/phil/Documents/work/metacarta/2svn.openlayers.net/follower/code/b-edits-1/openlayers/assets/ui_elements/zoom-minus-mini.png"
     inkscape:export-xdpi="90.000000"
     inkscape:export-ydpi="90.000000">
    <defs
       id="defs4" />
    <sodipodi:namedview
       id="base"
       pagecolor="#ffffff"
       bordercolor="#666666"
       borderopacity="1.0"
       inkscape:pageopacity="0.0"
       inkscape:pageshadow="2"
       inkscape:zoom="1.0000000"
       inkscape:cx="9.0000000"
       inkscape:cy="9.0000000"
       inkscape:document-units="px"
       inkscape:current-layer="layer1"
       inkscape:window-width="1226"
       inkscape:window-height="800"
       inkscape:window-x="42"
       inkscape:window-y="22" />
    <metadata
       id="metadata7">
      <rdf:RDF>
        <cc:Work
           rdf:about="">
          <dc:format>image/svg+xml</dc:format>
          <dc:type
             rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        </cc:Work>
      </rdf:RDF>
    </metadata>
    <g
       inkscape:label="background"
       inkscape:groupmode="layer"
       id="layer1">
      <g
         id="g2110">
        <path
           transform="matrix(0.000000,-1.003160,1.003160,0.000000,-2.844000e-2,18.02844)"
           d="M 17.971654 9.0000000 A 8.9716539 8.9716539 0 1 1  0.028346062,9.0000000 A 8.9716539 8.9716539 0 1 1  17.971654 9.0000000 z"
           sodipodi:ry="8.9716539"
           sodipodi:rx="8.9716539"
           sodipodi:cy="9.0000000"
           sodipodi:cx="9.0000000"
           id="path2059"
           style="fill:#00008b;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
           sodipodi:type="arc" />
        <rect
           transform="matrix(0.000000,-1.000000,1.000000,0.000000,0.000000,0.000000)"
           y="4.3599998e-06"
           x="-9.0000048"
           height="18.000000"
           width="9.0000000"
           id="rect2061"
           style="fill:#00008b;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
      </g>
    </g>
    <g
       inkscape:groupmode="layer"
       id="layer4"
       inkscape:label="zoom"
       style="display:inline">
      <text
         xml:space="preserve"
         style="font-size:18.000000px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1.0000000;font-family:Helvetica"
         x="3.7485352"
         y="-3.4077148"
         id="text2114"
         sodipodi:linespacing="125.00000%"
         transform="scale(1.000000,-1.000000)"><tspan
           sodipodi:role="line"
           id="tspan2118"
           x="3.7485352"
           y="-3.4077148">−</tspan></text>
    </g>
    <g
       inkscape:groupmode="layer"
       id="layer2"
       inkscape:label="overlay"
       style="display:none">
      <path
         style="font-size:12.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Verdana"
         d="M 2.9678210,9.0332227 C 2.9678314,9.5015070 3.1752531,9.8938504 3.5900866,10.210254 C 3.6463464,10.254553 3.9451742,10.453889 4.4865710,10.808262 L 8.1568835,13.247754 C 8.2693886,13.323691 8.4240759,13.393300 8.6209460,13.456582 C 8.8107943,13.519862 9.0041535,13.551503 9.2010240,13.551504 C 9.5736843,13.551503 9.8936056,13.431269 10.160789,13.190801 C 10.427980,12.950332 10.561574,12.659238 10.561572,12.317520 C 10.561574,11.861896 10.322511,11.488536 9.8443836,11.197442 L 8.5998522,10.428575 L 14.548408,10.428575 C 15.026535,10.428577 15.406221,10.298849 15.687470,10.039395 C 15.968721,9.7799443 16.109345,9.4318977 16.109345,8.9952540 C 16.109345,8.5396330 15.961690,8.1915865 15.666377,7.9511133 C 15.364034,7.7106494 14.980831,7.5904152 14.516767,7.5904102 L 8.6314928,7.5904102 L 9.9920390,6.7076368 C 10.160793,6.5937365 10.290871,6.4481897 10.382274,6.2709962 C 10.466652,6.0874870 10.508840,5.8913153 10.508837,5.6824805 C 10.508840,5.3281127 10.378761,5.033855
 2 10.118602,4.7997070 C 9.8584498,4.5655745 9.5279814,4.4485043 9.1271961,4.4484962 C 8.7615757,4.4485043 8.4029823,4.5624104 8.0514147,4.7902149 L 3.9697741,7.5239649 C 3.6393151,7.7454540 3.4002529,7.9542820 3.2525866,8.1504493 C 3.0627532,8.3972503 2.9678314,8.6756875 2.9678210,8.9857618 L 2.9678210,9.0332227"
         id="text2082"
         sodipodi:nodetypes="csccsssscccssscccssssccscc" />
    </g>
    <g
       inkscape:groupmode="layer"
       id="layer3"
       inkscape:label="pan triangle"
       style="display:none">
      <path
         sodipodi:type="star"
         style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
         id="path2107"
         sodipodi:sides="3"
         sodipodi:cx="6.8031497"
         sodipodi:cy="5.1874018"
         sodipodi:r1="5.0880113"
         sodipodi:r2="2.5440056"
         sodipodi:arg1="1.0471976"
         sodipodi:arg2="2.0943951"
         inkscape:flatsided="false"
         inkscape:rounded="0.0000000"
         inkscape:randomized="0.0000000"
         d="M 9.3471551,9.5937489 L 5.5311469,7.3905753 L 1.7151384,5.1874015 L 5.5311469,2.9842283 L 9.3471555,0.78105489 L 9.3471553,5.1874018 L 9.3471551,9.5937489 z "
         transform="matrix(0.000000,-1.331000,1.331000,0.000000,2.038879,16.92102)" />
    </g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/layer-switcher-maximize.svg
  
  Index: layer-switcher-maximize.svg
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <!-- Created with Inkscape (http://www.inkscape.org/) -->
  <svg
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:cc="http://web.resource.org/cc/"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
     width="18.000000px"
     height="18.000000px"
     id="svg2"
     sodipodi:version="0.32"
     inkscape:version="0.43"
     sodipodi:docbase="/home/sderle/projects/openlayers/layerswitcher/art"
     sodipodi:docname="layer-switcher-maximize.svg"
     inkscape:export-filename="/Users/phil/Documents/work/metacarta/2svn.openlayers.net/follower/code/b-edits-1/openlayers/assets/ui_elements/zoom-minus-mini.png"
     inkscape:export-xdpi="90.000000"
     inkscape:export-ydpi="90.000000">
    <defs
       id="defs4" />
    <sodipodi:namedview
       id="base"
       pagecolor="#ffffff"
       bordercolor="#666666"
       borderopacity="1.0"
       inkscape:pageopacity="0.0"
       inkscape:pageshadow="2"
       inkscape:zoom="16"
       inkscape:cx="9"
       inkscape:cy="9"
       inkscape:document-units="px"
       inkscape:current-layer="layer4"
       inkscape:window-width="1226"
       inkscape:window-height="800"
       inkscape:window-x="42"
       inkscape:window-y="25" />
    <metadata
       id="metadata7">
      <rdf:RDF>
        <cc:Work
           rdf:about="">
          <dc:format>image/svg+xml</dc:format>
          <dc:type
             rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        </cc:Work>
      </rdf:RDF>
    </metadata>
    <g
       inkscape:label="background"
       inkscape:groupmode="layer"
       id="layer1">
      <g
         id="g2110"
         transform="matrix(-7.849624e-17,1,-1,-7.849624e-17,18,0)">
        <path
           transform="matrix(0,-1.00316,1.00316,0,-2.844e-2,18.02844)"
           d="M 17.971654 9 A 8.9716539 8.9716539 0 1 1  0.028346062,9 A 8.9716539 8.9716539 0 1 1  17.971654 9 z"
           sodipodi:ry="8.9716539"
           sodipodi:rx="8.9716539"
           sodipodi:cy="9"
           sodipodi:cx="9"
           id="path2059"
           style="fill:#00008b;fill-opacity:1;stroke:none;stroke-width:39.98414612;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
           sodipodi:type="arc" />
        <rect
           transform="matrix(0,-1,1,0,0,0)"
           y="4.3599998e-06"
           x="-9.0000048"
           height="18"
           width="9"
           id="rect2061"
           style="fill:#00008b;fill-opacity:1;stroke:none;stroke-width:39.98414612;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
      </g>
    </g>
    <g
       inkscape:groupmode="layer"
       id="layer4"
       inkscape:label="zoom"
       style="display:inline">
      <text
         xml:space="preserve"
         style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline;font-family:Helvetica"
         x="1.5214844"
         y="-3.2949219"
         id="text2114"
         sodipodi:linespacing="125%"
         transform="scale(1,-1)"><tspan
           sodipodi:role="line"
           id="tspan2118"
           x="1.5214844"
           y="-3.2949219">+</tspan></text>
    </g>
    <g
       inkscape:groupmode="layer"
       id="layer2"
       inkscape:label="overlay"
       style="display:none">
      <path
         style="font-size:12.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Verdana"
         d="M 2.9678210,9.0332227 C 2.9678314,9.5015070 3.1752531,9.8938504 3.5900866,10.210254 C 3.6463464,10.254553 3.9451742,10.453889 4.4865710,10.808262 L 8.1568835,13.247754 C 8.2693886,13.323691 8.4240759,13.393300 8.6209460,13.456582 C 8.8107943,13.519862 9.0041535,13.551503 9.2010240,13.551504 C 9.5736843,13.551503 9.8936056,13.431269 10.160789,13.190801 C 10.427980,12.950332 10.561574,12.659238 10.561572,12.317520 C 10.561574,11.861896 10.322511,11.488536 9.8443836,11.197442 L 8.5998522,10.428575 L 14.548408,10.428575 C 15.026535,10.428577 15.406221,10.298849 15.687470,10.039395 C 15.968721,9.7799443 16.109345,9.4318977 16.109345,8.9952540 C 16.109345,8.5396330 15.961690,8.1915865 15.666377,7.9511133 C 15.364034,7.7106494 14.980831,7.5904152 14.516767,7.5904102 L 8.6314928,7.5904102 L 9.9920390,6.7076368 C 10.160793,6.5937365 10.290871,6.4481897 10.382274,6.2709962 C 10.466652,6.0874870 10.508840,5.8913153 10.508837,5.6824805 C 10.508840,5.3281127 10.378761,5.033855
 2 10.118602,4.7997070 C 9.8584498,4.5655745 9.5279814,4.4485043 9.1271961,4.4484962 C 8.7615757,4.4485043 8.4029823,4.5624104 8.0514147,4.7902149 L 3.9697741,7.5239649 C 3.6393151,7.7454540 3.4002529,7.9542820 3.2525866,8.1504493 C 3.0627532,8.3972503 2.9678314,8.6756875 2.9678210,8.9857618 L 2.9678210,9.0332227"
         id="text2082"
         sodipodi:nodetypes="csccsssscccssscccssssccscc" />
    </g>
    <g
       inkscape:groupmode="layer"
       id="layer3"
       inkscape:label="pan triangle"
       style="display:none">
      <path
         sodipodi:type="star"
         style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
         id="path2107"
         sodipodi:sides="3"
         sodipodi:cx="6.8031497"
         sodipodi:cy="5.1874018"
         sodipodi:r1="5.0880113"
         sodipodi:r2="2.5440056"
         sodipodi:arg1="1.0471976"
         sodipodi:arg2="2.0943951"
         inkscape:flatsided="false"
         inkscape:rounded="0.0000000"
         inkscape:randomized="0.0000000"
         d="M 9.3471551,9.5937489 L 5.5311469,7.3905753 L 1.7151384,5.1874015 L 5.5311469,2.9842283 L 9.3471555,0.78105489 L 9.3471553,5.1874018 L 9.3471551,9.5937489 z "
         transform="matrix(0.000000,-1.331000,1.331000,0.000000,2.038879,16.92102)" />
    </g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/layer-switcher-minimize.svg
  
  Index: layer-switcher-minimize.svg
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <!-- Created with Inkscape (http://www.inkscape.org/) -->
  <svg
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:cc="http://web.resource.org/cc/"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
     inkscape:export-ydpi="90.000000"
     inkscape:export-xdpi="90.000000"
     inkscape:export-filename="/home/sderle/projects/openlayers/layerswitcher/img/layer-switcher-minimize.png"
     sodipodi:docname="layer-switcher-minimize.svg"
     sodipodi:docbase="/home/sderle/projects/openlayers/layerswitcher/art"
     inkscape:version="0.43"
     sodipodi:version="0.32"
     id="svg2"
     height="18.000000px"
     width="18.000000px">
    <defs
       id="defs4" />
    <sodipodi:namedview
       inkscape:window-y="26"
       inkscape:window-x="42"
       inkscape:window-height="800"
       inkscape:window-width="1226"
       inkscape:current-layer="layer1"
       inkscape:document-units="px"
       inkscape:cy="9.3025513"
       inkscape:cx="9"
       inkscape:zoom="16"
       inkscape:pageshadow="2"
       inkscape:pageopacity="0.0"
       borderopacity="1.0"
       bordercolor="#666666"
       pagecolor="#ffffff"
       id="base" />
    <metadata
       id="metadata7">
      <rdf:RDF>
        <cc:Work
           rdf:about="">
          <dc:format>image/svg+xml</dc:format>
          <dc:type
             rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        </cc:Work>
      </rdf:RDF>
    </metadata>
    <g
       style="display:inline"
       id="layer1"
       inkscape:groupmode="layer"
       inkscape:label="background">
      <rect
         style="fill:#00008b;fill-opacity:0;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
         id="rect2061"
         width="18.014498"
         height="18.000000"
         x="-18.014502"
         y="4.3599998e-06"
         transform="matrix(0.000000,-1.000000,1.000000,0.000000,0.000000,0.000000)"
         inkscape:export-xdpi="90"
         inkscape:export-ydpi="90"
         inkscape:export-filename="/home/sderle/projects/openlayers/layerswitcher/art/layer-switcher-minimize.png" />
    </g>
    <g
       inkscape:label="graticule"
       id="layer5"
       inkscape:groupmode="layer">
      <text
         xml:space="preserve"
         style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline;font-family:Helvetica"
         x="5.2802601"
         y="-3.8032362"
         id="text1432"
         sodipodi:linespacing="125%"
         transform="scale(1,-1)"><tspan
           sodipodi:role="line"
           id="tspan1434"
           x="5.2802601"
           y="-3.8032362">-</tspan></text>
      <rect
         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99699599px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
         id="rect1438"
         width="13.003004"
         height="13.002999"
         x="2.498498"
         y="2.4984975" />
    </g>
    <g
       style="display:none"
       inkscape:label="zoom"
       id="layer4"
       inkscape:groupmode="layer">
      <text
         transform="scale(1.000000,-1.000000)"
         sodipodi:linespacing="125.00000%"
         id="text2114"
         y="-3.4077148"
         x="3.7485352"
         style="font-size:18.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#ffffff;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1.0000000;font-family:Helvetica;text-anchor:start;writing-mode:lr-tb"
         xml:space="preserve"><tspan
           y="-3.4077148"
           x="3.7485352"
           id="tspan2118"
           sodipodi:role="line">−</tspan></text>
    </g>
    <g
       style="display:none"
       inkscape:label="overlay"
       id="layer2"
       inkscape:groupmode="layer">
      <path
         sodipodi:nodetypes="csccsssscccssscccssssccscc"
         id="text2082"
         d="M 2.9678210,9.0332227 C 2.9678314,9.5015070 3.1752531,9.8938504 3.5900866,10.210254 C 3.6463464,10.254553 3.9451742,10.453889 4.4865710,10.808262 L 8.1568835,13.247754 C 8.2693886,13.323691 8.4240759,13.393300 8.6209460,13.456582 C 8.8107943,13.519862 9.0041535,13.551503 9.2010240,13.551504 C 9.5736843,13.551503 9.8936056,13.431269 10.160789,13.190801 C 10.427980,12.950332 10.561574,12.659238 10.561572,12.317520 C 10.561574,11.861896 10.322511,11.488536 9.8443836,11.197442 L 8.5998522,10.428575 L 14.548408,10.428575 C 15.026535,10.428577 15.406221,10.298849 15.687470,10.039395 C 15.968721,9.7799443 16.109345,9.4318977 16.109345,8.9952540 C 16.109345,8.5396330 15.961690,8.1915865 15.666377,7.9511133 C 15.364034,7.7106494 14.980831,7.5904152 14.516767,7.5904102 L 8.6314928,7.5904102 L 9.9920390,6.7076368 C 10.160793,6.5937365 10.290871,6.4481897 10.382274,6.2709962 C 10.466652,6.0874870 10.508840,5.8913153 10.508837,5.6824805 C 10.508840,5.3281127 10.378761,5.033855
 2 10.118602,4.7997070 C 9.8584498,4.5655745 9.5279814,4.4485043 9.1271961,4.4484962 C 8.7615757,4.4485043 8.4029823,4.5624104 8.0514147,4.7902149 L 3.9697741,7.5239649 C 3.6393151,7.7454540 3.4002529,7.9542820 3.2525866,8.1504493 C 3.0627532,8.3972503 2.9678314,8.6756875 2.9678210,8.9857618 L 2.9678210,9.0332227"
         style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Verdana;text-anchor:start;writing-mode:lr-tb" />
    </g>
    <g
       style="display:none"
       inkscape:label="pan triangle"
       id="layer3"
       inkscape:groupmode="layer">
      <path
         transform="matrix(0.000000,-1.331000,1.331000,0.000000,2.038879,16.92102)"
         d="M 9.3471551,9.5937489 L 5.5311469,7.3905753 L 1.7151384,5.1874015 L 5.5311469,2.9842283 L 9.3471555,0.78105489 L 9.3471553,5.1874018 L 9.3471551,9.5937489 z "
         inkscape:randomized="0.0000000"
         inkscape:rounded="0.0000000"
         inkscape:flatsided="false"
         sodipodi:arg2="2.0943951"
         sodipodi:arg1="1.0471976"
         sodipodi:r2="2.5440056"
         sodipodi:r1="5.0880113"
         sodipodi:cy="5.1874018"
         sodipodi:cx="6.8031497"
         sodipodi:sides="3"
         id="path2107"
         style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
         sodipodi:type="star" />
    </g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/marker.svg
  
  Index: marker.svg
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
  	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
  	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
  ]>
  <svg  version="1.1" id="Layer_1" xmlns:i="&ns_ai;" 
  	 xmlns="&ns_svg;" width="20.5" height="24.5" viewBox="0 0 20.5 24.5"
  	 overflow="visible" enable-background="new 0 0 20.5 24.5" xml:space="preserve">
  	<g i:extraneous="self">
  		<rect x="0.25" y="0.25" opacity="0" stroke="#000000" stroke-width="1" width="20" height="24"/>
  		<g id="XMLID_2_">
  			<g>
  				<polygon fill="#FF0000" points="10.12,0.6 19.93,7.71 10.06,24.03 0.6,7.58 				"/>
  			</g>
  			<g>
  				<polyline fill="none" stroke="#000000" stroke-width="1" points="9.98,24.16 10.06,24.03 19.93,7.71 20.06,7.49 				"/>
  				<polyline fill="none" stroke="#000000" stroke-width="1" points="10.13,24.16 10.06,24.03 0.6,7.58 0.5,7.41 				"/>
  				<polyline fill="none" stroke="#000000" stroke-width="1" points="0.41,7.72 0.6,7.58 10.12,0.6 10.29,0.47 				"/>
  				<polyline fill="none" stroke="#000000" stroke-width="1" points="9.94,0.47 10.12,0.6 19.93,7.71 20.06,7.8 				"/>
  			</g>
  		</g>
  		<ellipse stroke="#000000" stroke-width="1" cx="10.125" cy="9.25" rx="1.5" ry="1.5"/>
  	</g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/measuring-stick-off.svg
  
  Index: measuring-stick-off.svg
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
  	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
  	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
  	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
  	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
  	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
  	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
  	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
  	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
  	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
  	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
  ]>
  <svg  version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
  	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="28.375" height="28" viewBox="0 0 28.375 28"
  	 overflow="visible" enable-background="new 0 0 28.375 28" xml:space="preserve">
  	<g i:extraneous="self">
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M27.875,1.375"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M0,1.375"/>
  		<path fill="none" stroke="#FFFFFF" d="M0,27.475"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,27.645"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,0.544"/>
  		<line fill="none" stroke="#00008B" x1="0.875" y1="27.5" x2="27.875" y2="27.475"/>
  		<rect x="0.875" y="1.045" fill="#00008B" width="27.125" height="26"/>
  		<line fill="none" stroke="#00008B" x1="27.875" y1="26.925" x2="27.875" y2="0.925"/>
  		<line fill="none" stroke="#FFFFFF" x1="1.375" y1="0.5" x2="27.375" y2="0.5"/>
  		<line fill="none" stroke="#FFFFFF" x1="0.875" y1="1" x2="0.875" y2="27"/>
  		
  			<rect x="5.252" y="11.157" transform="matrix(0.7933 -0.6088 0.6088 0.7933 -5.1621 12.1086)" fill="#FFBF00" width="20" height="5"/>
  		<line fill="#FFBF00" stroke="#000000" x1="8.376" y1="15.783" x2="10.717" y2="18.766"/>
  		<line fill="#FFBF00" stroke="#000000" x1="11.946" y1="13.043" x2="14.288" y2="16.027"/>
  		<line fill="#FFBF00" stroke="#000000" x1="15.342" y1="10.437" x2="17.684" y2="13.42"/>
  		<line fill="#FFBF00" stroke="#000000" x1="18.69" y1="7.869" x2="21.03" y2="10.852"/>
  	</g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/measuring-stick-on.svg
  
  Index: measuring-stick-on.svg
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
  	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
  	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
  	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
  	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
  	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
  	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
  	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
  	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
  	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
  	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
  ]>
  <svg  version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
  	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="28.375" height="28" viewBox="0 0 28.375 28"
  	 overflow="visible" enable-background="new 0 0 28.375 28" xml:space="preserve">
  	<g i:extraneous="self">
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M27.875,1.375"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M0,1.375"/>
  		<path fill="none" stroke="#FFFFFF" d="M0,27.475"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,27.645"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,0.544"/>
  		<line fill="none" stroke="#FFFFFF" x1="0.875" y1="27.5" x2="27.875" y2="27.475"/>
  		<rect x="0.875" y="1.045" fill="#ADD8E6" width="27.125" height="26"/>
  		<line fill="none" stroke="#FFFFFF" x1="27.875" y1="26.925" x2="27.875" y2="0.925"/>
  		<line fill="none" stroke="#00008B" x1="1.375" y1="0.5" x2="27.375" y2="0.5"/>
  		<line fill="none" stroke="#00008B" x1="0.875" y1="1" x2="0.875" y2="27"/>
  		
  			<rect x="4.252" y="12.157" transform="matrix(0.7933 -0.6088 0.6088 0.7933 -5.9776 11.7065)" fill="#FFBF00" width="20" height="5"/>
  		<line fill="#FFBF00" stroke="#000000" x1="7.376" y1="16.783" x2="9.717" y2="19.766"/>
  		<line fill="#FFBF00" stroke="#000000" x1="10.946" y1="14.043" x2="13.288" y2="17.027"/>
  		<line fill="#FFBF00" stroke="#000000" x1="14.342" y1="11.437" x2="16.684" y2="14.42"/>
  		<line fill="#FFBF00" stroke="#000000" x1="17.69" y1="8.869" x2="20.03" y2="11.852"/>
  	</g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/panning-hand-off.svg
  
  Index: panning-hand-off.svg
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
  	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
  	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
  	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
  	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
  	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
  	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
  	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
  	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
  	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
  	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
  ]>
  <svg  version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
  	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="28.375" height="28" viewBox="0 0 28.375 28"
  	 overflow="visible" enable-background="new 0 0 28.375 28" xml:space="preserve">
  	<g i:extraneous="self">
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M27.875,1.375"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M0,1.375"/>
  		<path fill="none" stroke="#FFFFFF" d="M0,27.475"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,27.645"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,0.544"/>
  		<line fill="none" stroke="#00008B" x1="0.875" y1="27.5" x2="27.875" y2="27.475"/>
  		<rect x="0.875" y="1.045" fill="#00008B" width="27.125" height="26"/>
  		<line fill="none" stroke="#00008B" x1="27.875" y1="26.925" x2="27.875" y2="0.925"/>
  		<line fill="none" stroke="#FFFFFF" x1="1.375" y1="0.5" x2="27.375" y2="0.5"/>
  		<line fill="none" stroke="#FFFFFF" x1="0.875" y1="1" x2="0.875" y2="27"/>
  		<path fill="#FFFFFF" stroke="#000000" d="M9.458,22.458c-0.473-0.168-1.02-1.269-1.363-1.695
  			c-0.479-0.595-0.894-1.245-1.377-1.829c-0.733-0.887-1.356-1.729-1.854-2.764c-0.375-0.782-0.884-1.997-0.005-2.648
  			c1.036-0.767,2.095-0.162,2.934,0.479c0.844,0.646,1.729,1.18,2.526,1.869c-0.372-0.305-0.548-0.986-0.778-1.421
  			c-0.253-0.477-0.565-0.906-0.822-1.375c-0.359-0.657-0.767-1.201-1.21-1.823c-0.544-0.763-1.051-1.74-0.925-2.709
  			c0.133-1.025,0.972-1.527,1.924-1.207c1.202,0.405,1.969,1.692,2.627,2.698c0.636,0.971,1.201,2.159,1.938,3.042
  			c-0.222-0.209-0.148-0.508-0.155-0.782c-0.01-0.37-0.097-0.626-0.219-0.967c-0.162-0.455-0.219-0.972-0.24-1.45
  			c-0.034-0.776-0.25-1.465-0.25-2.247c0-0.988-0.14-1.963,0.71-2.631c0.666-0.523,1.649-0.764,2.381-0.248
  			c1.385,0.976,1.057,2.999,1.209,4.458c0.079,0.759,0.165,1.489,0.2,2.263c0.022,0.496,0.209,1.067,0.168,1.558
  			c-0.146-0.269-0.113-0.749-0.127-1.057c-0.022-0.502-0.041-0.982-0.115-1.47c-0.114-0.743-0.188-1.564-0.25-2.324
  			c-0.152-1.877,2.054-3.17,3.301-1.469c0.884,1.206,0.773,2.643,0.773,4.085c0,0.698-0.034,1.251-0.22,1.91
  			c-0.13,0.459-0.293,1.222-0.239,1.638c0-0.902,0.334-1.697,0.334-2.588c0-0.678-0.272-2.099,0.581-2.334
  			c1.065-0.294,2.008,0.875,2.428,1.66c0.458,0.855,0.555,1.901,0.409,2.882c-0.318,2.154-0.845,4.227-2.096,6.072
  			c-0.268,0.396-0.485,0.838-0.79,1.22c-0.361,0.452-0.923,0.772-1.416,1.071c-0.381,0.232-0.764,0.53-1.176,0.604
  			c-0.822,0.149-1.725,0.157-2.565,0.157c-1.29,0-2.564-0.068-3.832-0.251c-0.799-0.115-2.12,0.153-2.668-0.54"/>
  	</g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/panning-hand-on.svg
  
  Index: panning-hand-on.svg
  ===================================================================
  <?xml version="1.0" encoding="utf-8"?>
  <!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
  	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
  	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
  	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
  	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
  	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
  	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
  	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
  	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
  	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
  	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
  ]>
  <svg  version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
  	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="28.375" height="28" viewBox="0 0 28.375 28"
  	 overflow="visible" enable-background="new 0 0 28.375 28" xml:space="preserve">
  	<g i:extraneous="self">
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M27.875,1.375"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M0,1.375"/>
  		<path fill="none" stroke="#FFFFFF" d="M0,27.475"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,27.645"/>
  		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,0.544"/>
  		<line fill="none" stroke="#FFFFFF" x1="0.875" y1="27.5" x2="27.875" y2="27.475"/>
  		<rect x="0.875" y="1.045" fill="#ADD8E6" width="27.125" height="26"/>
  		<line fill="none" stroke="#FFFFFF" x1="27.875" y1="26.925" x2="27.875" y2="0.925"/>
  		<line fill="none" stroke="#00008B" x1="1.375" y1="0.5" x2="27.375" y2="0.5"/>
  		<line fill="none" stroke="#00008B" x1="0.875" y1="1" x2="0.875" y2="27"/>
  		<path fill="#FFFFFF" stroke="#000000" d="M8.458,23.458c-0.473-0.168-1.02-1.269-1.363-1.695
  			c-0.479-0.595-0.894-1.245-1.377-1.829c-0.733-0.887-1.356-1.729-1.854-2.764c-0.375-0.782-0.884-1.997-0.005-2.648
  			c1.036-0.767,2.095-0.161,2.934,0.479c0.844,0.646,1.729,1.18,2.526,1.869c-0.372-0.305-0.548-0.986-0.778-1.421
  			c-0.253-0.477-0.565-0.906-0.822-1.375c-0.359-0.657-0.767-1.201-1.21-1.823c-0.544-0.763-1.051-1.74-0.925-2.709
  			c0.133-1.025,0.972-1.527,1.924-1.207c1.202,0.405,1.969,1.692,2.627,2.698c0.636,0.971,1.201,2.159,1.938,3.042
  			c-0.222-0.21-0.148-0.509-0.155-0.783c-0.01-0.37-0.097-0.626-0.219-0.967c-0.162-0.455-0.219-0.972-0.24-1.45
  			c-0.034-0.776-0.25-1.465-0.25-2.247c0-0.988-0.14-1.963,0.71-2.631c0.666-0.523,1.649-0.764,2.381-0.248
  			c1.385,0.976,1.057,2.999,1.209,4.458c0.079,0.759,0.165,1.489,0.2,2.263c0.022,0.496,0.209,1.068,0.168,1.558
  			c-0.146-0.27-0.113-0.75-0.127-1.058c-0.022-0.502-0.041-0.982-0.115-1.47c-0.114-0.743-0.188-1.564-0.25-2.324
  			c-0.152-1.877,2.054-3.17,3.301-1.469c0.884,1.206,0.773,2.643,0.773,4.085c0,0.698-0.034,1.251-0.22,1.91
  			c-0.13,0.459-0.293,1.222-0.239,1.639c0-0.902,0.334-1.697,0.334-2.589c0-0.678-0.272-2.099,0.581-2.334
  			c1.065-0.294,2.008,0.875,2.428,1.66c0.458,0.855,0.555,1.901,0.409,2.883c-0.318,2.153-0.845,4.227-2.096,6.071
  			c-0.268,0.396-0.485,0.838-0.79,1.22c-0.361,0.452-0.923,0.772-1.416,1.071c-0.381,0.232-0.764,0.53-1.176,0.604
  			c-0.822,0.149-1.725,0.157-2.565,0.157c-1.29,0-2.564-0.068-3.832-0.251c-0.799-0.115-2.12,0.153-2.668-0.54"/>
  	</g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/slider.svg
  
  Index: slider.svg
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <!-- Created with Inkscape (http://www.inkscape.org/) -->
  <svg
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:cc="http://web.resource.org/cc/"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
     width="210mm"
     height="297mm"
     id="svg2"
     sodipodi:version="0.32"
     inkscape:version="0.41.1"
     sodipodi:docbase="/afs/metacarta.com/user/sderle/public_html/ol.zoombar/art"
     sodipodi:docname="slider.svg"
     inkscape:export-filename="/afs/metacarta.com/user/sderle/public_html/ol.zoombar/img/slider.png"
     inkscape:export-xdpi="90.000000"
     inkscape:export-ydpi="90.000000">
    <defs
       id="defs3" />
    <sodipodi:namedview
       id="base"
       pagecolor="#ffffff"
       bordercolor="#666666"
       borderopacity="1.0"
       inkscape:pageopacity="0.0"
       inkscape:pageshadow="2"
       inkscape:zoom="39.870978"
       inkscape:cx="140.00732"
       inkscape:cy="695.49796"
       inkscape:document-units="px"
       inkscape:current-layer="layer1"
       showgrid="true"
       inkscape:window-width="1010"
       inkscape:window-height="538"
       inkscape:window-x="20"
       inkscape:window-y="107" />
    <metadata
       id="metadata4">
      <rdf:RDF
         id="RDF5">
        <cc:Work
           rdf:about=""
           id="Work6">
          <dc:format
             id="format7">image/svg+xml</dc:format>
          <dc:type
             id="type9"
             rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        </cc:Work>
      </rdf:RDF>
    </metadata>
    <g
       inkscape:label="Layer 1"
       inkscape:groupmode="layer"
       id="layer1">
      <rect
         style="fill:#00008b;fill-opacity:1.0000000;stroke:#000080;stroke-width:4.9999957;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
         id="rect1291"
         x="132.50000"
         y="354.86218"
         width="15.014628"
         height="4.0040474" />
      <path
         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
         d="M 134.08880,356.89603 L 146.00000,356.87002"
         id="path2052" />
    </g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/zoom-world.svg
  
  Index: zoom-world.svg
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <!-- Created with Inkscape (http://www.inkscape.org/) -->
  <svg
     xmlns:xml="http://www.w3.org/XML/1998/namespace"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:cc="http://web.resource.org/cc/"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
     inkscape:export-ydpi="90.000000"
     inkscape:export-xdpi="90.000000"
     inkscape:export-filename="/Users/phil/Documents/work/metacarta/2svn.openlayers.net/follower/code/b-edits-1/openlayers/assets/ui_elements/zoom-minus-mini.png"
     sodipodi:docname="zoom-world.svg"
     sodipodi:docbase="/afs/metacarta.com/user/sderle/OL/openlayers/assets/ui_elements"
     inkscape:version="0.41.1"
     sodipodi:version="0.32"
     id="svg2"
     height="18.000000px"
     width="18.000000px">
    <defs
       id="defs4" />
    <sodipodi:namedview
       inkscape:window-y="26"
       inkscape:window-x="42"
       inkscape:window-height="800"
       inkscape:window-width="1226"
       inkscape:current-layer="layer5"
       inkscape:document-units="px"
       inkscape:cy="9.3025513"
       inkscape:cx="9.0000000"
       inkscape:zoom="1.0000000"
       inkscape:pageshadow="2"
       inkscape:pageopacity="0.0"
       borderopacity="1.0"
       bordercolor="#666666"
       pagecolor="#ffffff"
       id="base" />
    <metadata
       id="metadata7">
      <rdf:RDF
         id="RDF1295">
        <cc:Work
           id="Work1297"
           rdf:about="">
          <dc:format
             id="format1299">image/svg+xml</dc:format>
          <dc:type
             id="type1301"
             rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        </cc:Work>
      </rdf:RDF>
    </metadata>
    <g
       style="display:inline"
       id="layer1"
       inkscape:groupmode="layer"
       inkscape:label="background">
      <rect
         style="fill:#00008b;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
         id="rect2061"
         width="18.014498"
         height="18.000000"
         x="-18.014502"
         y="4.3599998e-06"
         transform="matrix(0.000000,-1.000000,1.000000,0.000000,0.000000,0.000000)" />
    </g>
    <g
       inkscape:label="graticule"
       id="layer5"
       inkscape:groupmode="layer">
      <g
         transform="translate(0.000000,-4.419417e-2)"
         id="g2876">
        <path
           transform="matrix(1.155321,0.000000,0.000000,1.155321,-2.292065,-1.751761)"
           d="M 16.869573 9.3188362 A 7.0579743 7.0579743 0 1 1  2.7536244,9.3188362 A 7.0579743 7.0579743 0 1 1  16.869573 9.3188362 z"
           sodipodi:ry="7.0579743"
           sodipodi:rx="7.0579743"
           sodipodi:cy="9.3188362"
           sodipodi:cx="9.8115988"
           id="path1321"
           style="fill:none;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:0.50000000;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
           sodipodi:type="arc" />
        <path
           sodipodi:nodetypes="cc"
           id="path2086"
           d="M 8.1145142,1.1289949 C 15.315267,9.5238831 8.3963197,17.101449 8.3963197,17.057255"
           style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
        <path
           sodipodi:nodetypes="cc"
           id="path2846"
           d="M 11.588885,1.3666059 C 18.922222,9.5405232 11.605526,16.764536 11.605526,16.764536"
           style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
        <path
           sodipodi:nodetypes="cc"
           id="path2848"
           d="M 5.2258471,2.0593951 C 11.080923,9.7405585 5.3432210,16.278941 5.3432210,16.278941"
           style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
        <path
           sodipodi:nodetypes="cc"
           id="path2850"
           d="M 2.7388198,3.7571959 C 6.3686281,9.1817837 2.9127331,14.361601 2.9127331,14.361601"
           style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
      </g>
      <g
         transform="matrix(-6.269315e-2,0.998033,-0.998033,-6.269315e-2,18.62352,0.612232)"
         id="g2883">
        <path
           transform="matrix(1.155321,0.000000,0.000000,1.155321,-2.292065,-1.751761)"
           d="M 16.869573 9.3188362 A 7.0579743 7.0579743 0 1 1  2.7536244,9.3188362 A 7.0579743 7.0579743 0 1 1  16.869573 9.3188362 z"
           sodipodi:ry="7.0579743"
           sodipodi:rx="7.0579743"
           sodipodi:cy="9.3188362"
           sodipodi:cx="9.8115988"
           id="path2885"
           style="fill:none;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:0.50000000;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
           sodipodi:type="arc" />
        <path
           sodipodi:nodetypes="cc"
           id="path2887"
           d="M 8.1145142,1.1289949 C 15.315267,9.5238831 8.3963197,17.101449 8.3963197,17.057255"
           style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
        <path
           sodipodi:nodetypes="cc"
           id="path2889"
           d="M 11.588885,1.3666059 C 18.922222,9.5405232 11.605526,16.764536 11.605526,16.764536"
           style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
        <path
           sodipodi:nodetypes="cc"
           id="path2891"
           d="M 5.2258471,2.0593951 C 11.080923,9.7405585 5.3432210,16.278941 5.3432210,16.278941"
           style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
        <path
           sodipodi:nodetypes="cc"
           id="path2893"
           d="M 2.7388198,3.7571959 C 6.3686281,9.1817837 2.9127331,14.361601 2.9127331,14.361601"
           style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
      </g>
    </g>
    <g
       style="display:none"
       inkscape:label="zoom"
       id="layer4"
       inkscape:groupmode="layer">
      <text
         transform="scale(1.000000,-1.000000)"
         sodipodi:linespacing="125.00000%"
         id="text2114"
         y="-3.4077148"
         x="3.7485352"
         style="font-size:18.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#ffffff;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1.0000000;font-family:Helvetica;text-anchor:start;writing-mode:lr-tb"
         xml:space="preserve"><tspan
           y="-3.4077148"
           x="3.7485352"
           id="tspan2118"
           sodipodi:role="line">−</tspan></text>
    </g>
    <g
       style="display:none"
       inkscape:label="overlay"
       id="layer2"
       inkscape:groupmode="layer">
      <path
         sodipodi:nodetypes="csccsssscccssscccssssccscc"
         id="text2082"
         d="M 2.9678210,9.0332227 C 2.9678314,9.5015070 3.1752531,9.8938504 3.5900866,10.210254 C 3.6463464,10.254553 3.9451742,10.453889 4.4865710,10.808262 L 8.1568835,13.247754 C 8.2693886,13.323691 8.4240759,13.393300 8.6209460,13.456582 C 8.8107943,13.519862 9.0041535,13.551503 9.2010240,13.551504 C 9.5736843,13.551503 9.8936056,13.431269 10.160789,13.190801 C 10.427980,12.950332 10.561574,12.659238 10.561572,12.317520 C 10.561574,11.861896 10.322511,11.488536 9.8443836,11.197442 L 8.5998522,10.428575 L 14.548408,10.428575 C 15.026535,10.428577 15.406221,10.298849 15.687470,10.039395 C 15.968721,9.7799443 16.109345,9.4318977 16.109345,8.9952540 C 16.109345,8.5396330 15.961690,8.1915865 15.666377,7.9511133 C 15.364034,7.7106494 14.980831,7.5904152 14.516767,7.5904102 L 8.6314928,7.5904102 L 9.9920390,6.7076368 C 10.160793,6.5937365 10.290871,6.4481897 10.382274,6.2709962 C 10.466652,6.0874870 10.508840,5.8913153 10.508837,5.6824805 C 10.508840,5.3281127 10.378761,5.033855
 2 10.118602,4.7997070 C 9.8584498,4.5655745 9.5279814,4.4485043 9.1271961,4.4484962 C 8.7615757,4.4485043 8.4029823,4.5624104 8.0514147,4.7902149 L 3.9697741,7.5239649 C 3.6393151,7.7454540 3.4002529,7.9542820 3.2525866,8.1504493 C 3.0627532,8.3972503 2.9678314,8.6756875 2.9678210,8.9857618 L 2.9678210,9.0332227"
         style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Verdana;text-anchor:start;writing-mode:lr-tb" />
    </g>
    <g
       style="display:none"
       inkscape:label="pan triangle"
       id="layer3"
       inkscape:groupmode="layer">
      <path
         transform="matrix(0.000000,-1.331000,1.331000,0.000000,2.038879,16.92102)"
         d="M 9.3471551,9.5937489 L 5.5311469,7.3905753 L 1.7151384,5.1874015 L 5.5311469,2.9842283 L 9.3471555,0.78105489 L 9.3471553,5.1874018 L 9.3471551,9.5937489 z "
         inkscape:randomized="0.0000000"
         inkscape:rounded="0.0000000"
         inkscape:flatsided="false"
         sodipodi:arg2="2.0943951"
         sodipodi:arg1="1.0471976"
         sodipodi:r2="2.5440056"
         sodipodi:r1="5.0880113"
         sodipodi:cy="5.1874018"
         sodipodi:cx="6.8031497"
         sodipodi:sides="3"
         id="path2107"
         style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
         sodipodi:type="star" />
    </g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/art/zoombar.svg
  
  Index: zoombar.svg
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <!-- Created with Inkscape (http://www.inkscape.org/) -->
  <svg
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:cc="http://web.resource.org/cc/"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
     width="18"
     height="18"
     id="svg2"
     sodipodi:version="0.32"
     inkscape:version="0.43"
     version="1.0"
     inkscape:export-filename="C:\Documents and Settings\crschmidt\Desktop\zoombar.png"
     inkscape:export-xdpi="90"
     inkscape:export-ydpi="90"
     sodipodi:docbase="C:\Documents and Settings\crschmidt\Desktop"
     sodipodi:docname="zoombar.svg">
    <defs
       id="defs4" />
    <sodipodi:namedview
       id="base"
       pagecolor="#ffffff"
       bordercolor="#666666"
       borderopacity="1.0"
       inkscape:pageopacity="0.0"
       inkscape:pageshadow="2"
       inkscape:zoom="1"
       inkscape:cx="-117.50597"
       inkscape:cy="65.94562"
       inkscape:document-units="px"
       inkscape:current-layer="layer1"
       showguides="false"
       showgrid="false"
       inkscape:window-width="1024"
       inkscape:window-height="721"
       inkscape:window-x="-4"
       inkscape:window-y="-4" />
    <metadata
       id="metadata7">
      <rdf:RDF>
        <cc:Work
           rdf:about="">
          <dc:format>image/svg+xml</dc:format>
          <dc:type
             rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        </cc:Work>
      </rdf:RDF>
    </metadata>
    <g
       inkscape:label="Layer 1"
       inkscape:groupmode="layer"
       id="layer1">
      <rect
         style="opacity:0.5;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
         id="rect1307"
         width="16.999998"
         height="10.000004"
         x="-125.51302"
         y="-52.420002" />
      <path
         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999958;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196078"
         d="M -125.54176,-52.415494 L -125.54176,-42.415495"
         id="path8297" />
      <path
         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999982;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196078"
         d="M -108.48157,-52.418044 L -108.48157,-42.418046"
         id="path12667" />
    </g>
  </svg>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/build/OpenLayers.js
  
  Index: OpenLayers.js
  ===================================================================
  /*
  
    OpenLayers.js -- OpenLayers Map Viewer Library
  
    Copyright 2005-2006 MetaCarta, Inc., released under the BSD License.
    Please see http://svn.openlayers.org/trunk/openlayers/license.txt
    for the full text of the license.
  
    Includes compressed code under the following licenses:
  
    (For uncompressed versions of the code used please see the
    OpenLayers SVN repository: <http://openlayers.org/>)
  
  */
  
  /*  Prototype JavaScript framework, version 1.4.0
   *  (c) 2005 Sam Stephenson <sam at conio.net>
   *
   *  Prototype is freely distributable under the terms of an MIT-style license.
   *  For details, see the Prototype web site: http://prototype.conio.net/
   *
  /*--------------------------------------------------------------------------*/
  
  /**  
  *  
  *  Contains portions of Rico <http://openrico.org/>
  * 
  *  Copyright 2005 Sabre Airline Solutions  
  *  
  *  Licensed under the Apache License, Version 2.0 (the "License"); you
  *  may not use this file except in compliance with the License. You
  *  may obtain a copy of the License at
  *  
  *         http://www.apache.org/licenses/LICENSE-2.0  
  *  
  *  Unless required by applicable law or agreed to in writing, software
  *  distributed under the License is distributed on an "AS IS" BASIS,
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  *  implied. See the License for the specific language governing
  *  permissions and limitations under the License. 
  *
  **/
  
  
  var Prototype={Version:'1.4.0',ScriptFragment:'(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',emptyFunction:function(){},K:function(x){return x}}
  var Class={create:function(){return function(){this.initialize.apply(this,arguments);}}}
  var Abstract=new Object();Object.extend=function(destination,source){for(property in source){destination[property]=source[property];}
  return destination;}
  Object.inspect=function(object){try{if(object==undefined)return'undefined';if(object==null)return'null';return object.inspect?object.inspect():object.toString();}catch(e){if(e instanceof RangeError)return'...';throw e;}}
  Function.prototype.bind=function(){var __method=this,args=$A(arguments),object=args.shift();return function(){return __method.apply(object,args.concat($A(arguments)));}}
  Function.prototype.bindAsEventListener=function(object){var __method=this;return function(event){return __method.call(object,event||window.event);}}
  Object.extend(Number.prototype,{toColorPart:function(){var digits=this.toString(16);if(this<16)return'0'+digits;return digits;},succ:function(){return this+1;},times:function(iterator){$R(0,this,true).each(iterator);return this;}});var Try={these:function(){var returnValue;for(var i=0;i<arguments.length;i++){var lambda=arguments[i];try{returnValue=lambda();break;}catch(e){}}
  return returnValue;}}
  var PeriodicalExecuter=Class.create();PeriodicalExecuter.prototype={initialize:function(callback,frequency){this.callback=callback;this.frequency=frequency;this.currentlyExecuting=false;this.registerCallback();},registerCallback:function(){setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.callback();}finally{this.currentlyExecuting=false;}}}}
  function $(){var elements=new Array();for(var i=0;i<arguments.length;i++){var element=arguments[i];if(typeof element=='string')
  element=document.getElementById(element);if(arguments.length==1)
  return element;elements.push(element);}
  return elements;}
  Object.extend(String.prototype,{stripTags:function(){return this.replace(/<\/?[^>]+>/gi,'');},stripScripts:function(){return this.replace(new RegExp(Prototype.ScriptFragment,'img'),'');},extractScripts:function(){var matchAll=new RegExp(Prototype.ScriptFragment,'img');var matchOne=new RegExp(Prototype.ScriptFragment,'im');return(this.match(matchAll)||[]).map(function(scriptTag){return(scriptTag.match(matchOne)||['',''])[1];});},evalScripts:function(){return this.extractScripts().map(eval);},escapeHTML:function(){var div=document.createElement('div');var text=document.createTextNode(this);div.appendChild(text);return div.innerHTML;},unescapeHTML:function(){var div=document.createElement('div');div.innerHTML=this.stripTags();return div.childNodes[0]?div.childNodes[0].nodeValue:'';},toQueryParams:function(){var pairs=this.match(/^\??(.*)$/)[1].split('&');return pairs.inject({},function(params,pairString){var pair=pairString.split('=');params[pair[0]]=pair[1];return params;});}
 ,toArray:function(){return this.split('');},camelize:function(){var oStringList=this.split('-');if(oStringList.length==1)return oStringList[0];var camelizedString=this.indexOf('-')==0?oStringList[0].charAt(0).toUpperCase()+oStringList[0].substring(1):oStringList[0];for(var i=1,len=oStringList.length;i<len;i++){var s=oStringList[i];camelizedString+=s.charAt(0).toUpperCase()+s.substring(1);}
  return camelizedString;},inspect:function(){return"'"+this.replace('\\','\\\\').replace("'",'\\\'')+"'";}});String.prototype.parseQuery=String.prototype.toQueryParams;var $break=new Object();var $continue=new Object();var Enumerable={each:function(iterator){var index=0;try{this._each(function(value){try{iterator(value,index++);}catch(e){if(e!=$continue)throw e;}});}catch(e){if(e!=$break)throw e;}},all:function(iterator){var result=true;this.each(function(value,index){result=result&&!!(iterator||Prototype.K)(value,index);if(!result)throw $break;});return result;},any:function(iterator){var result=true;this.each(function(value,index){if(result=!!(iterator||Prototype.K)(value,index))
  throw $break;});return result;},collect:function(iterator){var results=[];this.each(function(value,index){results.push(iterator(value,index));});return results;},detect:function(iterator){var result;this.each(function(value,index){if(iterator(value,index)){result=value;throw $break;}});return result;},findAll:function(iterator){var results=[];this.each(function(value,index){if(iterator(value,index))
  results.push(value);});return results;},grep:function(pattern,iterator){var results=[];this.each(function(value,index){var stringValue=value.toString();if(stringValue.match(pattern))
  results.push((iterator||Prototype.K)(value,index));})
  return results;},include:function(object){var found=false;this.each(function(value){if(value==object){found=true;throw $break;}});return found;},inject:function(memo,iterator){this.each(function(value,index){memo=iterator(memo,value,index);});return memo;},invoke:function(method){var args=$A(arguments).slice(1);return this.collect(function(value){return value[method].apply(value,args);});},max:function(iterator){var result;this.each(function(value,index){value=(iterator||Prototype.K)(value,index);if(value>=(result||value))
  result=value;});return result;},min:function(iterator){var result;this.each(function(value,index){value=(iterator||Prototype.K)(value,index);if(value<=(result||value))
  result=value;});return result;},partition:function(iterator){var trues=[],falses=[];this.each(function(value,index){((iterator||Prototype.K)(value,index)?trues:falses).push(value);});return[trues,falses];},pluck:function(property){var results=[];this.each(function(value,index){results.push(value[property]);});return results;},reject:function(iterator){var results=[];this.each(function(value,index){if(!iterator(value,index))
  results.push(value);});return results;},sortBy:function(iterator){return this.collect(function(value,index){return{value:value,criteria:iterator(value,index)};}).sort(function(left,right){var a=left.criteria,b=right.criteria;return a<b?-1:a>b?1:0;}).pluck('value');},toArray:function(){return this.collect(Prototype.K);},zip:function(){var iterator=Prototype.K,args=$A(arguments);if(typeof args.last()=='function')
  iterator=args.pop();var collections=[this].concat(args).map($A);return this.map(function(value,index){iterator(value=collections.pluck(index));return value;});},inspect:function(){return'#<Enumerable:'+this.toArray().inspect()+'>';}}
  Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray});var $A=Array.from=function(iterable){if(!iterable)return[];if(iterable.toArray){return iterable.toArray();}else{var results=[];for(var i=0;i<iterable.length;i++)
  results.push(iterable[i]);return results;}}
  Object.extend(Array.prototype,Enumerable);Array.prototype._reverse=Array.prototype.reverse;Object.extend(Array.prototype,{_each:function(iterator){for(var i=0;i<this.length;i++)
  iterator(this[i]);},clear:function(){this.length=0;return this;},first:function(){return this[0];},last:function(){return this[this.length-1];},compact:function(){return this.select(function(value){return value!=undefined||value!=null;});},flatten:function(){return this.inject([],function(array,value){return array.concat(value.constructor==Array?value.flatten():[value]);});},without:function(){var values=$A(arguments);return this.select(function(value){return!values.include(value);});},indexOf:function(object){for(var i=0;i<this.length;i++)
  if(this[i]==object)return i;return-1;},reverse:function(inline){return(inline!==false?this:this.toArray())._reverse();},shift:function(){var result=this[0];for(var i=0;i<this.length-1;i++)
  this[i]=this[i+1];this.length--;return result;},inspect:function(){return'['+this.map(Object.inspect).join(', ')+']';}});var Hash={_each:function(iterator){for(key in this){var value=this[key];if(typeof value=='function')continue;var pair=[key,value];pair.key=key;pair.value=value;iterator(pair);}},keys:function(){return this.pluck('key');},values:function(){return this.pluck('value');},merge:function(hash){return $H(hash).inject($H(this),function(mergedHash,pair){mergedHash[pair.key]=pair.value;return mergedHash;});},toQueryString:function(){return this.map(function(pair){return pair.map(encodeURIComponent).join('=');}).join('&');},inspect:function(){return'#<Hash:{'+this.map(function(pair){return pair.map(Object.inspect).join(': ');}).join(', ')+'}>';}}
  function $H(object){var hash=Object.extend({},object||{});Object.extend(hash,Enumerable);Object.extend(hash,Hash);return hash;}
  ObjectRange=Class.create();Object.extend(ObjectRange.prototype,Enumerable);Object.extend(ObjectRange.prototype,{initialize:function(start,end,exclusive){this.start=start;this.end=end;this.exclusive=exclusive;},_each:function(iterator){var value=this.start;do{iterator(value);value=value.succ();}while(this.include(value));},include:function(value){if(value<this.start)
  return false;if(this.exclusive)
  return value<this.end;return value<=this.end;}});var $R=function(start,end,exclusive){return new ObjectRange(start,end,exclusive);}
  var Ajax={getTransport:function(){return Try.these(function(){return new ActiveXObject('Msxml2.XMLHTTP')},function(){return new ActiveXObject('Microsoft.XMLHTTP')},function(){return new XMLHttpRequest()})||false;},activeRequestCount:0}
  Ajax.Responders={responders:[],_each:function(iterator){this.responders._each(iterator);},register:function(responderToAdd){if(!this.include(responderToAdd))
  this.responders.push(responderToAdd);},unregister:function(responderToRemove){this.responders=this.responders.without(responderToRemove);},dispatch:function(callback,request,transport,json){this.each(function(responder){if(responder[callback]&&typeof responder[callback]=='function'){try{responder[callback].apply(responder,[request,transport,json]);}catch(e){}}});}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++;},onComplete:function(){Ajax.activeRequestCount--;}});Ajax.Base=function(){};Ajax.Base.prototype={setOptions:function(options){this.options={method:'post',asynchronous:true,parameters:''}
  Object.extend(this.options,options||{});},responseIsSuccess:function(){return this.transport.status==undefined||this.transport.status==0||(this.transport.status>=200&&this.transport.status<300);},responseIsFailure:function(){return!this.responseIsSuccess();}}
  Ajax.Request=Class.create();Ajax.Request.Events=['Uninitialized','Loading','Loaded','Interactive','Complete'];Ajax.Request.prototype=Object.extend(new Ajax.Base(),{initialize:function(url,options){this.transport=Ajax.getTransport();this.setOptions(options);this.request(url);},request:function(url){var parameters=this.options.parameters||'';if(parameters.length>0)parameters+='&_=';try{this.url=url;if(this.options.method=='get'&&parameters.length>0)
  this.url+=(this.url.match(/\?/)?'&':'?')+parameters;Ajax.Responders.dispatch('onCreate',this,this.transport);this.transport.open(this.options.method,this.url,this.options.asynchronous);if(this.options.asynchronous){this.transport.onreadystatechange=this.onStateChange.bind(this);setTimeout((function(){this.respondToReadyState(1)}).bind(this),10);}
  this.setRequestHeaders();var body=this.options.postBody?this.options.postBody:parameters;this.transport.send(this.options.method=='post'?body:null);}catch(e){this.dispatchException(e);}},setRequestHeaders:function(){var requestHeaders=['X-Requested-With','XMLHttpRequest','X-Prototype-Version',Prototype.Version];if(this.options.method=='post'){requestHeaders.push('Content-type','application/x-www-form-urlencoded');if(this.transport.overrideMimeType)
  requestHeaders.push('Connection','close');}
  if(this.options.requestHeaders)
  requestHeaders.push.apply(requestHeaders,this.options.requestHeaders);for(var i=0;i<requestHeaders.length;i+=2)
  this.transport.setRequestHeader(requestHeaders[i],requestHeaders[i+1]);},onStateChange:function(){var readyState=this.transport.readyState;if(readyState!=1)
  this.respondToReadyState(this.transport.readyState);},header:function(name){try{return this.transport.getResponseHeader(name);}catch(e){}},evalJSON:function(){try{return eval(this.header('X-JSON'));}catch(e){}},evalResponse:function(){try{return eval(this.transport.responseText);}catch(e){this.dispatchException(e);}},respondToReadyState:function(readyState){var event=Ajax.Request.Events[readyState];var transport=this.transport,json=this.evalJSON();if(event=='Complete'){try{(this.options['on'+this.transport.status]||this.options['on'+(this.responseIsSuccess()?'Success':'Failure')]||Prototype.emptyFunction)(transport,json);}catch(e){this.dispatchException(e);}
  if((this.header('Content-type')||'').match(/^text\/javascript/i))
  this.evalResponse();}
  try{(this.options['on'+event]||Prototype.emptyFunction)(transport,json);Ajax.Responders.dispatch('on'+event,this,transport,json);}catch(e){this.dispatchException(e);}
  if(event=='Complete')
  this.transport.onreadystatechange=Prototype.emptyFunction;},dispatchException:function(exception){(this.options.onException||Prototype.emptyFunction)(this,exception);Ajax.Responders.dispatch('onException',this,exception);}});Ajax.Updater=Class.create();Object.extend(Object.extend(Ajax.Updater.prototype,Ajax.Request.prototype),{initialize:function(container,url,options){this.containers={success:container.success?$(container.success):$(container),failure:container.failure?$(container.failure):(container.success?null:$(container))}
  this.transport=Ajax.getTransport();this.setOptions(options);var onComplete=this.options.onComplete||Prototype.emptyFunction;this.options.onComplete=(function(transport,object){this.updateContent();onComplete(transport,object);}).bind(this);this.request(url);},updateContent:function(){var receiver=this.responseIsSuccess()?this.containers.success:this.containers.failure;var response=this.transport.responseText;if(!this.options.evalScripts)
  response=response.stripScripts();if(receiver){if(this.options.insertion){new this.options.insertion(receiver,response);}else{Element.update(receiver,response);}}
  if(this.responseIsSuccess()){if(this.onComplete)
  setTimeout(this.onComplete.bind(this),10);}}});Ajax.PeriodicalUpdater=Class.create();Ajax.PeriodicalUpdater.prototype=Object.extend(new Ajax.Base(),{initialize:function(container,url,options){this.setOptions(options);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=container;this.url=url;this.start();},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent();},stop:function(){this.updater.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments);},updateComplete:function(request){if(this.options.decay){this.decay=(request.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=request.responseText;}
  this.timer=setTimeout(this.onTimerEvent.bind(this),this.decay*this.frequency*1000);},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options);}});document.getElementsByClassName=function(className,parentElement){var children=($(parentElement)||document.body).getElementsByTagName('*');return $A(children).inject([],function(elements,child){if(child.className.match(new RegExp("(^|\\s)"+className+"(\\s|$)")))
  elements.push(child);return elements;});}
  if(!window.Element){var Element=new Object();}
  Object.extend(Element,{visible:function(element){return $(element).style.display!='none';},toggle:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);Element[Element.visible(element)?'hide':'show'](element);}},hide:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='none';}},show:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='';}},remove:function(element){element=$(element);element.parentNode.removeChild(element);},update:function(element,html){$(element).innerHTML=html.stripScripts();setTimeout(function(){html.evalScripts()},10);},getHeight:function(element){element=$(element);return element.offsetHeight;},classNames:function(element){return new Element.ClassNames(element);},hasClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).include(className);},addClassName:function(element,className){if(!(element=
 $(element)))return;return Element.classNames(element).add(className);},removeClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).remove(className);},cleanWhitespace:function(element){element=$(element);for(var i=0;i<element.childNodes.length;i++){var node=element.childNodes[i];if(node.nodeType==3&&!/\S/.test(node.nodeValue))
  Element.remove(node);}},empty:function(element){return $(element).innerHTML.match(/^\s*$/);},scrollTo:function(element){element=$(element);var x=element.x?element.x:element.offsetLeft,y=element.y?element.y:element.offsetTop;window.scrollTo(x,y);},getStyle:function(element,style){element=$(element);var value=element.style[style.camelize()];if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);value=css?css.getPropertyValue(style):null;}else if(element.currentStyle){value=element.currentStyle[style.camelize()];}}
  if(window.opera&&['left','top','right','bottom'].include(style))
  if(Element.getStyle(element,'position')=='static')value='auto';return value=='auto'?null:value;},setStyle:function(element,style){element=$(element);for(name in style)
  element.style[name.camelize()]=style[name];},getDimensions:function(element){element=$(element);if(Element.getStyle(element,'display')!='none')
  return{width:element.offsetWidth,height:element.offsetHeight};var els=element.style;var originalVisibility=els.visibility;var originalPosition=els.position;els.visibility='hidden';els.position='absolute';els.display='';var originalWidth=element.clientWidth;var originalHeight=element.clientHeight;els.display='none';els.position=originalPosition;els.visibility=originalVisibility;return{width:originalWidth,height:originalHeight};},makePositioned:function(element){element=$(element);var pos=Element.getStyle(element,'position');if(pos=='static'||!pos){element._madePositioned=true;element.style.position='relative';if(window.opera){element.style.top=0;element.style.left=0;}}},undoPositioned:function(element){element=$(element);if(element._madePositioned){element._madePositioned=undefined;element.style.position=element.style.top=element.style.left=element.style.bottom=element.style.right='';}},makeClipping:function(element){element=$(element);if(element._overflow)return;element._ov
 erflow=element.style.overflow;if((Element.getStyle(element,'overflow')||'visible')!='hidden')
  element.style.overflow='hidden';},undoClipping:function(element){element=$(element);if(element._overflow)return;element.style.overflow=element._overflow;element._overflow=undefined;}});var Toggle=new Object();Toggle.display=Element.toggle;Abstract.Insertion=function(adjacency){this.adjacency=adjacency;}
  Abstract.Insertion.prototype={initialize:function(element,content){this.element=$(element);this.content=content.stripScripts();if(this.adjacency&&this.element.insertAdjacentHTML){try{this.element.insertAdjacentHTML(this.adjacency,this.content);}catch(e){if(this.element.tagName.toLowerCase()=='tbody'){this.insertContent(this.contentFromAnonymousTable());}else{throw e;}}}else{this.range=this.element.ownerDocument.createRange();if(this.initializeRange)this.initializeRange();this.insertContent([this.range.createContextualFragment(this.content)]);}
  setTimeout(function(){content.evalScripts()},10);},contentFromAnonymousTable:function(){var div=document.createElement('div');div.innerHTML='<table><tbody>'+this.content+'</tbody></table>';return $A(div.childNodes[0].childNodes[0].childNodes);}}
  var Insertion=new Object();Insertion.Before=Class.create();Insertion.Before.prototype=Object.extend(new Abstract.Insertion('beforeBegin'),{initializeRange:function(){this.range.setStartBefore(this.element);},insertContent:function(fragments){fragments.each((function(fragment){this.element.parentNode.insertBefore(fragment,this.element);}).bind(this));}});Insertion.Top=Class.create();Insertion.Top.prototype=Object.extend(new Abstract.Insertion('afterBegin'),{initializeRange:function(){this.range.selectNodeContents(this.element);this.range.collapse(true);},insertContent:function(fragments){fragments.reverse(false).each((function(fragment){this.element.insertBefore(fragment,this.element.firstChild);}).bind(this));}});Insertion.Bottom=Class.create();Insertion.Bottom.prototype=Object.extend(new Abstract.Insertion('beforeEnd'),{initializeRange:function(){this.range.selectNodeContents(this.element);this.range.collapse(this.element);},insertContent:function(fragments){fragments.each
 ((function(fragment){this.element.appendChild(fragment);}).bind(this));}});Insertion.After=Class.create();Insertion.After.prototype=Object.extend(new Abstract.Insertion('afterEnd'),{initializeRange:function(){this.range.setStartAfter(this.element);},insertContent:function(fragments){fragments.each((function(fragment){this.element.parentNode.insertBefore(fragment,this.element.nextSibling);}).bind(this));}});Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(element){this.element=$(element);},_each:function(iterator){this.element.className.split(/\s+/).select(function(name){return name.length>0;})._each(iterator);},set:function(className){this.element.className=className;},add:function(classNameToAdd){if(this.include(classNameToAdd))return;this.set(this.toArray().concat(classNameToAdd).join(' '));},remove:function(classNameToRemove){if(!this.include(classNameToRemove))return;this.set(this.select(function(className){return className!=classNameTo
 Remove;}).join(' '));},toString:function(){return this.toArray().join(' ');}}
  Object.extend(Element.ClassNames.prototype,Enumerable);var Field={clear:function(){for(var i=0;i<arguments.length;i++)
  $(arguments[i]).value='';},focus:function(element){$(element).focus();},present:function(){for(var i=0;i<arguments.length;i++)
  if($(arguments[i]).value=='')return false;return true;},select:function(element){$(element).select();},activate:function(element){element=$(element);element.focus();if(element.select)
  element.select();}}
  var Form={serialize:function(form){var elements=Form.getElements($(form));var queryComponents=new Array();for(var i=0;i<elements.length;i++){var queryComponent=Form.Element.serialize(elements[i]);if(queryComponent)
  queryComponents.push(queryComponent);}
  return queryComponents.join('&');},getElements:function(form){form=$(form);var elements=new Array();for(tagName in Form.Element.Serializers){var tagElements=form.getElementsByTagName(tagName);for(var j=0;j<tagElements.length;j++)
  elements.push(tagElements[j]);}
  return elements;},getInputs:function(form,typeName,name){form=$(form);var inputs=form.getElementsByTagName('input');if(!typeName&&!name)
  return inputs;var matchingInputs=new Array();for(var i=0;i<inputs.length;i++){var input=inputs[i];if((typeName&&input.type!=typeName)||(name&&input.name!=name))
  continue;matchingInputs.push(input);}
  return matchingInputs;},disable:function(form){var elements=Form.getElements(form);for(var i=0;i<elements.length;i++){var element=elements[i];element.blur();element.disabled='true';}},enable:function(form){var elements=Form.getElements(form);for(var i=0;i<elements.length;i++){var element=elements[i];element.disabled='';}},findFirstElement:function(form){return Form.getElements(form).find(function(element){return element.type!='hidden'&&!element.disabled&&['input','select','textarea'].include(element.tagName.toLowerCase());});},focusFirstElement:function(form){Field.activate(Form.findFirstElement(form));},reset:function(form){$(form).reset();}}
  Form.Element={serialize:function(element){element=$(element);var method=element.tagName.toLowerCase();var parameter=Form.Element.Serializers[method](element);if(parameter){var key=encodeURIComponent(parameter[0]);if(key.length==0)return;if(parameter[1].constructor!=Array)
  parameter[1]=[parameter[1]];return parameter[1].map(function(value){return key+'='+encodeURIComponent(value);}).join('&');}},getValue:function(element){element=$(element);var method=element.tagName.toLowerCase();var parameter=Form.Element.Serializers[method](element);if(parameter)
  return parameter[1];}}
  Form.Element.Serializers={input:function(element){switch(element.type.toLowerCase()){case'submit':case'hidden':case'password':case'text':return Form.Element.Serializers.textarea(element);case'checkbox':case'radio':return Form.Element.Serializers.inputSelector(element);}
  return false;},inputSelector:function(element){if(element.checked)
  return[element.name,element.value];},textarea:function(element){return[element.name,element.value];},select:function(element){return Form.Element.Serializers[element.type=='select-one'?'selectOne':'selectMany'](element);},selectOne:function(element){var value='',opt,index=element.selectedIndex;if(index>=0){opt=element.options[index];value=opt.value;if(!value&&!('value'in opt))
  value=opt.text;}
  return[element.name,value];},selectMany:function(element){var value=new Array();for(var i=0;i<element.length;i++){var opt=element.options[i];if(opt.selected){var optValue=opt.value;if(!optValue&&!('value'in opt))
  optValue=opt.text;value.push(optValue);}}
  return[element.name,value];}}
  var $F=Form.Element.getValue;Abstract.TimedObserver=function(){}
  Abstract.TimedObserver.prototype={initialize:function(element,frequency,callback){this.frequency=frequency;this.element=$(element);this.callback=callback;this.lastValue=this.getValue();this.registerCallback();},registerCallback:function(){setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},onTimerEvent:function(){var value=this.getValue();if(this.lastValue!=value){this.callback(this.element,value);this.lastValue=value;}}}
  Form.Element.Observer=Class.create();Form.Element.Observer.prototype=Object.extend(new Abstract.TimedObserver(),{getValue:function(){return Form.Element.getValue(this.element);}});Form.Observer=Class.create();Form.Observer.prototype=Object.extend(new Abstract.TimedObserver(),{getValue:function(){return Form.serialize(this.element);}});Abstract.EventObserver=function(){}
  Abstract.EventObserver.prototype={initialize:function(element,callback){this.element=$(element);this.callback=callback;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=='form')
  this.registerFormCallbacks();else
  this.registerCallback(this.element);},onElementEvent:function(){var value=this.getValue();if(this.lastValue!=value){this.callback(this.element,value);this.lastValue=value;}},registerFormCallbacks:function(){var elements=Form.getElements(this.element);for(var i=0;i<elements.length;i++)
  this.registerCallback(elements[i]);},registerCallback:function(element){if(element.type){switch(element.type.toLowerCase()){case'checkbox':case'radio':Event.observe(element,'click',this.onElementEvent.bind(this));break;case'password':case'text':case'textarea':case'select-one':case'select-multiple':Event.observe(element,'change',this.onElementEvent.bind(this));break;}}}}
  Form.Element.EventObserver=Class.create();Form.Element.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){return Form.Element.getValue(this.element);}});Form.EventObserver=Class.create();Form.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){return Form.serialize(this.element);}});if(!window.Event){var Event=new Object();}
  Object.extend(Event,{KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,element:function(event){return event.target||event.srcElement;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},pointerX:function(event){return event.pageX||(event.clientX+
  (document.documentElement.scrollLeft||document.body.scrollLeft));},pointerY:function(event){return event.pageY||(event.clientY+
  (document.documentElement.scrollTop||document.body.scrollTop));},stop:function(event){if(event.preventDefault){event.preventDefault();event.stopPropagation();}else{event.returnValue=false;event.cancelBubble=true;}},findElement:function(event,tagName){var element=Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase())))
  element=element.parentNode;return element;},observers:false,_observeAndCache:function(element,name,observer,useCapture){if(!this.observers)this.observers=[];if(element.addEventListener){this.observers.push([element,name,observer,useCapture]);element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){this.observers.push([element,name,observer,useCapture]);element.attachEvent('on'+name,observer);}},unloadCache:function(){if(!Event.observers)return;for(var i=0;i<Event.observers.length;i++){Event.stopObserving.apply(this,Event.observers[i]);Event.observers[i][0]=null;}
  Event.observers=false;},observe:function(elementParam,name,observer,useCapture){var element=$(elementParam);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent))
  name='keydown';this._observeAndCache(element,name,observer,useCapture);},stopObserving:function(elementParam,name,observer,useCapture){var element=$(elementParam);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent))
  name='keydown';if(element.removeEventListener){element.removeEventListener(name,observer,useCapture);}else if(element.detachEvent){element.detachEvent('on'+name,observer);}}});Event.observe(window,'unload',Event.unloadCache,false);var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;},realOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.scrollTop||0;valueL+=element.scrollLeft||0;element=element.parentNode;}while(element);return[valueL,valueT];},cumulativeOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;element=element.offsetParent;}while(element);return[valueL,valueT];},positionedOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;element=element.
 offsetParent;if(element){p=Element.getStyle(element,'position');if(p=='relative'||p=='absolute')break;}}while(element);return[valueL,valueT];},offsetParent:function(element){if(element.offsetParent)return element.offsetParent;if(element==document.body)return element;while((element=element.parentNode)&&element!=document.body)
  if(Element.getStyle(element,'position')!='static')
  return element;return document.body;},within:function(element,x,y){if(this.includeScrollOffsets)
  return this.withinIncludingScrolloffsets(element,x,y);this.xcomp=x;this.ycomp=y;this.offset=this.cumulativeOffset(element);return(y>=this.offset[1]&&y<this.offset[1]+element.offsetHeight&&x>=this.offset[0]&&x<this.offset[0]+element.offsetWidth);},withinIncludingScrolloffsets:function(element,x,y){var offsetcache=this.realOffset(element);this.xcomp=x+offsetcache[0]-this.deltaX;this.ycomp=y+offsetcache[1]-this.deltaY;this.offset=this.cumulativeOffset(element);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+element.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+element.offsetWidth);},overlap:function(mode,element){if(!mode)return 0;if(mode=='vertical')
  return((this.offset[1]+element.offsetHeight)-this.ycomp)/element.offsetHeight;if(mode=='horizontal')
  return((this.offset[0]+element.offsetWidth)-this.xcomp)/element.offsetWidth;},clone:function(source,target){source=$(source);target=$(target);target.style.position='absolute';var offsets=this.cumulativeOffset(source);target.style.top=offsets[1]+'px';target.style.left=offsets[0]+'px';target.style.width=source.offsetWidth+'px';target.style.height=source.offsetHeight+'px';},page:function(forElement){var valueT=0,valueL=0;var element=forElement;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;if(element.offsetParent==document.body)
  if(Element.getStyle(element,'position')=='absolute')break;}while(element=element.offsetParent);element=forElement;do{valueT-=element.scrollTop||0;valueL-=element.scrollLeft||0;}while(element=element.parentNode);return[valueL,valueT];},clone:function(source,target){var options=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{})
  source=$(source);var p=Position.page(source);target=$(target);var delta=[0,0];var parent=null;if(Element.getStyle(target,'position')=='absolute'){parent=Position.offsetParent(target);delta=Position.page(parent);}
  if(parent==document.body){delta[0]-=document.body.offsetLeft;delta[1]-=document.body.offsetTop;}
  if(options.setLeft)target.style.left=(p[0]-delta[0]+options.offsetLeft)+'px';if(options.setTop)target.style.top=(p[1]-delta[1]+options.offsetTop)+'px';if(options.setWidth)target.style.width=source.offsetWidth+'px';if(options.setHeight)target.style.height=source.offsetHeight+'px';},absolutize:function(element){element=$(element);if(element.style.position=='absolute')return;Position.prepare();var offsets=Position.positionedOffset(element);var top=offsets[1];var left=offsets[0];var width=element.clientWidth;var height=element.clientHeight;element._originalLeft=left-parseFloat(element.style.left||0);element._originalTop=top-parseFloat(element.style.top||0);element._originalWidth=element.style.width;element._originalHeight=element.style.height;element.style.position='absolute';element.style.top=top+'px';;element.style.left=left+'px';;element.style.width=width+'px';;element.style.height=height+'px';;},relativize:function(element){element=$(element);if(element.style.position=='rel
 ative')return;Position.prepare();element.style.position='relative';var top=parseFloat(element.style.top||0)-(element._originalTop||0);var left=parseFloat(element.style.left||0)-(element._originalLeft||0);element.style.top=top+'px';element.style.left=left+'px';element.style.height=element._originalHeight;element.style.width=element._originalWidth;}}
  if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){Position.cumulativeOffset=function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;if(element.offsetParent==document.body)
  if(Element.getStyle(element,'position')=='absolute')break;element=element.offsetParent;}while(element);return[valueL,valueT];}}
  var Rico=new Object();Rico.Corner={round:function(e,options){var e=$(e);this._setOptions(options);var color=this.options.color;if(this.options.color=="fromElement")
  color=this._background(e);var bgColor=this.options.bgColor;if(this.options.bgColor=="fromParent")
  bgColor=this._background(e.offsetParent);this._roundCornersImpl(e,color,bgColor);},changeColor:function(theDiv,newColor){theDiv.style.backgroundColor=newColor;var spanElements=theDiv.parentNode.getElementsByTagName("span");for(var currIdx=0;currIdx<spanElements.length;currIdx++){spanElements[currIdx].style.backgroundColor=newColor;}},changeOpacity:function(theDiv,newOpacity){var mozillaOpacity=newOpacity;var ieOpacity='alpha(opacity='+newOpacity*100+')';theDiv.style.opacity=mozillaOpacity;theDiv.style.filter=ieOpacity;var spanElements=theDiv.parentNode.getElementsByTagName("span");for(var currIdx=0;currIdx<spanElements.length;currIdx++){spanElements[currIdx].style.opacity=mozillaOpacity;spanElements[currIdx].style.filter=ieOpacity;}},reRound:function(theDiv,options){var topRico=theDiv.parentNode.childNodes[0];var bottomRico=theDiv.parentNode.childNodes[2];theDiv.parentNode.removeChild(topRico);theDiv.parentNode.removeChild(bottomRico);this.round(theDiv.parentNode,options);}
 ,_roundCornersImpl:function(e,color,bgColor){if(this.options.border)
  this._renderBorder(e,bgColor);if(this._isTopRounded())
  this._roundTopCorners(e,color,bgColor);if(this._isBottomRounded())
  this._roundBottomCorners(e,color,bgColor);},_renderBorder:function(el,bgColor){var borderValue="1px solid "+this._borderColor(bgColor);var borderL="border-left: "+borderValue;var borderR="border-right: "+borderValue;var style="style='"+borderL+";"+borderR+"'";el.innerHTML="<div "+style+">"+el.innerHTML+"</div>"},_roundTopCorners:function(el,color,bgColor){var corner=this._createCorner(bgColor);for(var i=0;i<this.options.numSlices;i++)
  corner.appendChild(this._createCornerSlice(color,bgColor,i,"top"));el.style.paddingTop=0;el.insertBefore(corner,el.firstChild);},_roundBottomCorners:function(el,color,bgColor){var corner=this._createCorner(bgColor);for(var i=(this.options.numSlices-1);i>=0;i--)
  corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));el.style.paddingBottom=0;el.appendChild(corner);},_createCorner:function(bgColor){var corner=document.createElement("div");corner.style.backgroundColor=(this._isTransparent()?"transparent":bgColor);return corner;},_createCornerSlice:function(color,bgColor,n,position){var slice=document.createElement("span");var inStyle=slice.style;inStyle.backgroundColor=color;inStyle.display="block";inStyle.height="1px";inStyle.overflow="hidden";inStyle.fontSize="1px";var borderColor=this._borderColor(color,bgColor);if(this.options.border&&n==0){inStyle.borderTopStyle="solid";inStyle.borderTopWidth="1px";inStyle.borderLeftWidth="0px";inStyle.borderRightWidth="0px";inStyle.borderBottomWidth="0px";inStyle.height="0px";inStyle.borderColor=borderColor;}
  else if(borderColor){inStyle.borderColor=borderColor;inStyle.borderStyle="solid";inStyle.borderWidth="0px 1px";}
  if(!this.options.compact&&(n==(this.options.numSlices-1)))
  inStyle.height="2px";this._setMargin(slice,n,position);this._setBorder(slice,n,position);return slice;},_setOptions:function(options){this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false}
  Object.extend(this.options,options||{});this.options.numSlices=this.options.compact?2:4;if(this._isTransparent())
  this.options.blend=false;},_whichSideTop:function(){if(this._hasString(this.options.corners,"all","top"))
  return"";if(this.options.corners.indexOf("tl")>=0&&this.options.corners.indexOf("tr")>=0)
  return"";if(this.options.corners.indexOf("tl")>=0)
  return"left";else if(this.options.corners.indexOf("tr")>=0)
  return"right";return"";},_whichSideBottom:function(){if(this._hasString(this.options.corners,"all","bottom"))
  return"";if(this.options.corners.indexOf("bl")>=0&&this.options.corners.indexOf("br")>=0)
  return"";if(this.options.corners.indexOf("bl")>=0)
  return"left";else if(this.options.corners.indexOf("br")>=0)
  return"right";return"";},_borderColor:function(color,bgColor){if(color=="transparent")
  return bgColor;else if(this.options.border)
  return this.options.border;else if(this.options.blend)
  return this._blend(bgColor,color);else
  return"";},_setMargin:function(el,n,corners){var marginSize=this._marginSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.marginLeft=marginSize+"px";el.style.marginRight="0px";}
  else if(whichSide=="right"){el.style.marginRight=marginSize+"px";el.style.marginLeft="0px";}
  else{el.style.marginLeft=marginSize+"px";el.style.marginRight=marginSize+"px";}},_setBorder:function(el,n,corners){var borderSize=this._borderSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth="0px";}
  else if(whichSide=="right"){el.style.borderRightWidth=borderSize+"px";el.style.borderLeftWidth="0px";}
  else{el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";}
  if(this.options.border!=false)
  el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";},_marginSize:function(n){if(this._isTransparent())
  return 0;var marginSizes=[5,3,2,1];var blendedMarginSizes=[3,2,1,0];var compactMarginSizes=[2,1];var smBlendedMarginSizes=[1,0];if(this.options.compact&&this.options.blend)
  return smBlendedMarginSizes[n];else if(this.options.compact)
  return compactMarginSizes[n];else if(this.options.blend)
  return blendedMarginSizes[n];else
  return marginSizes[n];},_borderSize:function(n){var transparentBorderSizes=[5,3,2,1];var blendedBorderSizes=[2,1,1,1];var compactBorderSizes=[1,0];var actualBorderSizes=[0,2,0,0];if(this.options.compact&&(this.options.blend||this._isTransparent()))
  return 1;else if(this.options.compact)
  return compactBorderSizes[n];else if(this.options.blend)
  return blendedBorderSizes[n];else if(this.options.border)
  return actualBorderSizes[n];else if(this._isTransparent())
  return transparentBorderSizes[n];return 0;},_hasString:function(str){for(var i=1;i<arguments.length;i++)if(str.indexOf(arguments[i])>=0)return true;return false;},_blend:function(c1,c2){var cc1=Rico.Color.createFromHex(c1);cc1.blend(Rico.Color.createFromHex(c2));return cc1;},_background:function(el){try{return Rico.Color.createColorFromBackground(el).asHex();}catch(err){return"#ffffff";}},_isTransparent:function(){return this.options.color=="transparent";},_isTopRounded:function(){return this._hasString(this.options.corners,"all","top","tl","tr");},_isBottomRounded:function(){return this._hasString(this.options.corners,"all","bottom","bl","br");},_hasSingleTextChild:function(el){return el.childNodes.length==1&&el.childNodes[0].nodeType==3;}}
  _OPENLAYERS_SFL_=true
  OpenLayers=new Object();OpenLayers._scriptName=(typeof(_OPENLAYERS_SFL_)=="undefined"?"lib/OpenLayers.js":"OpenLayers.js");OpenLayers._getScriptLocation=function(){var scriptLocation="";var SCRIPT_NAME=OpenLayers._scriptName;var scripts=document.getElementsByTagName('script');for(var i=0;i<scripts.length;i++){var src=scripts[i].getAttribute('src');if(src){var index=src.lastIndexOf(SCRIPT_NAME);if((index>-1)&&(index+SCRIPT_NAME.length==src.length)){scriptLocation=src.slice(0,-SCRIPT_NAME.length);break;}}}
  return scriptLocation;}
  if(typeof(_OPENLAYERS_SFL_)=="undefined"){(function(){var jsfiles=new Array("Prototype.js","Rico/Corner.js","Rico/Color.js","OpenLayers/BaseTypes.js","OpenLayers/Util.js","OpenLayers/Ajax.js","OpenLayers/Events.js","OpenLayers/Map.js","OpenLayers/Layer.js","OpenLayers/Icon.js","OpenLayers/Marker.js","OpenLayers/Marker/Box.js","OpenLayers/Popup.js","OpenLayers/Tile.js","OpenLayers/Feature.js","OpenLayers/Feature/WFS.js","OpenLayers/Tile/Image.js","OpenLayers/Tile/WFS.js","OpenLayers/Layer/EventPane.js","OpenLayers/Layer/Google.js","OpenLayers/Layer/VirtualEarth.js","OpenLayers/Layer/HTTPRequest.js","OpenLayers/Layer/Grid.js","OpenLayers/Layer/KaMap.js","OpenLayers/Layer/Markers.js","OpenLayers/Layer/Text.js","OpenLayers/Layer/WorldWind.js","OpenLayers/Layer/WMS.js","OpenLayers/Layer/WFS.js","OpenLayers/Layer/WMS/Untiled.js","OpenLayers/Layer/GeoRSS.js","OpenLayers/Layer/Boxes.js","OpenLayers/Popup/Anchored.js","OpenLayers/Popup/AnchoredBubble.js","OpenLayers/Control.js","Ope
 nLayers/Control/MouseDefaults.js","OpenLayers/Control/MouseToolbar.js","OpenLayers/Control/KeyboardDefaults.js","OpenLayers/Control/PanZoom.js","OpenLayers/Control/PanZoomBar.js","OpenLayers/Control/Permalink.js","OpenLayers/Control/Scale.js","OpenLayers/Control/LayerSwitcher.js","OpenLayers/Control/LayerTabs.js");var allScriptTags="";var host=OpenLayers._getScriptLocation()+"lib/";var start=1;try{x=Prototype;}
  catch(e){start=0;}
  for(var i=start;i<jsfiles.length;i++){var currentScriptTag="<script src='"+host+jsfiles[i]+"'></script>";allScriptTags+=currentScriptTag;}
  document.write(allScriptTags);})();}
  OpenLayers.ProxyHost="";OpenLayers.nullHandler=function(request){alert("Unhandled request return "+request.statusText);};OpenLayers.loadURL=function(uri,params,caller,onComplete,onFailure){if(OpenLayers.ProxyHost&&uri.startsWith("http")){uri=OpenLayers.ProxyHost+escape(uri);}
  var success=(onComplete)?onComplete.bind(caller):OpenLayers.nullHandler;var failure=(onFailure)?onFailure.bind(caller):OpenLayers.nullHandler;new Ajax.Request(uri,{method:'get',parameters:params,onComplete:success,onFailure:failure});};OpenLayers.parseXMLString=function(text){var index=text.indexOf('<');if(index>0){text=text.substring(index);}
  var ajaxResponse=Try.these(function(){var xmldom=new ActiveXObject('Microsoft.XMLDOM');xmldom.loadXML(text);return xmldom;},function(){return new DOMParser().parseFromString(text,'text/xml');},function(){var req=new XMLHttpRequest();req.open("GET","data:"+"text/xml"+";charset=utf-8,"+encodeURIComponent(text),false);if(req.overrideMimeType){req.overrideMimeType("text/xml");}
  req.send(null);return req.responseXML;});return ajaxResponse;};OpenLayers.Pixel=Class.create();OpenLayers.Pixel.prototype={x:0.0,y:0.0,initialize:function(x,y){this.x=x;this.y=y;},toString:function(){return("x="+this.x+",y="+this.y);},clone:function(){return new OpenLayers.Pixel(this.x,this.y);},equals:function(px){var equals=false;if(px!=null){equals=((this.x==px.x&&this.y==px.y)||(isNaN(this.x)&&isNaN(this.y)&&isNaN(px.x)&&isNaN(px.y)));}
  return equals;},add:function(x,y){return new OpenLayers.Pixel(this.x+x,this.y+y);},offset:function(px){return this.add(px.x,px.y);},CLASS_NAME:"OpenLayers.Pixel"};OpenLayers.Size=Class.create();OpenLayers.Size.prototype={w:0.0,h:0.0,initialize:function(w,h){this.w=w;this.h=h;},toString:function(){return("w="+this.w+",h="+this.h);},clone:function(){return new OpenLayers.Size(this.w,this.h);},equals:function(sz){var equals=false;if(sz!=null){equals=((this.w==sz.w&&this.h==sz.h)||(isNaN(this.w)&&isNaN(this.h)&&isNaN(sz.w)&&isNaN(sz.h)));}
  return equals;},CLASS_NAME:"OpenLayers.Size"};OpenLayers.LonLat=Class.create();OpenLayers.LonLat.prototype={lon:0.0,lat:0.0,initialize:function(lon,lat){this.lon=lon;this.lat=lat;},toString:function(){return("lon="+this.lon+",lat="+this.lat);},toShortString:function(){return(this.lon+", "+this.lat);},clone:function(){return new OpenLayers.LonLat(this.lon,this.lat);},add:function(lon,lat){return new OpenLayers.LonLat(this.lon+lon,this.lat+lat);},equals:function(ll){var equals=false;if(ll!=null){equals=((this.lon==ll.lon&&this.lat==ll.lat)||(isNaN(this.lon)&&isNaN(this.lat)&&isNaN(ll.lon)&&isNaN(ll.lat)));}
  return equals;},CLASS_NAME:"OpenLayers.LonLat"};OpenLayers.LonLat.fromString=function(str){var pair=str.split(",");return new OpenLayers.LonLat(parseFloat(pair[0]),parseFloat(pair[1]));};OpenLayers.Bounds=Class.create();OpenLayers.Bounds.prototype={left:0.0,bottom:0.0,right:0.0,top:0.0,initialize:function(left,bottom,right,top){this.left=left;this.bottom=bottom;this.right=right;this.top=top;},clone:function(){return new OpenLayers.Bounds(this.left,this.bottom,this.right,this.top);},equals:function(bounds){var equals=false;if(bounds!=null){equals=((this.left==bounds.left)&&(this.right==bounds.right)&&(this.top==bounds.top)&&(this.bottom==bounds.bottom));}
  return equals;},toString:function(){return("left-bottom=("+this.left+","+this.bottom+")"
  +" right-top=("+this.right+","+this.top+")");},toBBOX:function(){return(this.left+","+this.bottom+","
  +this.right+","+this.top);},getWidth:function(){return(this.right-this.left);},getHeight:function(){return(this.top-this.bottom);},getSize:function(){return new OpenLayers.Size(this.getWidth(),this.getHeight());},getCenterPixel:function(){return new OpenLayers.Pixel((this.left+this.right)/2,(this.bottom+this.top)/2);},getCenterLonLat:function(){return new OpenLayers.LonLat((this.left+this.right)/2,(this.bottom+this.top)/2);},add:function(x,y){return new OpenLayers.Bounds(this.left+x,this.bottom+y,this.right+x,this.top+y);},contains:function(x,y,inclusive){if(inclusive==null){inclusive=true;}
  var contains=false;if(inclusive){contains=((x>=this.left)&&(x<=this.right)&&(y>=this.bottom)&&(y<=this.top));}else{contains=((x>this.left)&&(x<this.right)&&(y>this.bottom)&&(y<this.top));}
  return contains;},containsBounds:function(bounds,partial,inclusive){if(partial==null){partial=false;}
  if(inclusive==null){inclusive=true;}
  var inLeft;var inTop;var inRight;var inBottom;if(inclusive){inLeft=(bounds.left>=this.left)&&(bounds.left<=this.right);inTop=(bounds.top>=this.bottom)&&(bounds.top<=this.top);inRight=(bounds.right>=this.left)&&(bounds.right<=this.right);inBottom=(bounds.bottom>=this.bottom)&&(bounds.bottom<=this.top);}else{inLeft=(bounds.left>this.left)&&(bounds.left<this.right);inTop=(bounds.top>this.bottom)&&(bounds.top<this.top);inRight=(bounds.right>this.left)&&(bounds.right<this.right);inBottom=(bounds.bottom>this.bottom)&&(bounds.bottom<this.top);}
  return(partial)?(inTop||inBottom)&&(inLeft||inRight):(inTop&&inLeft&&inBottom&&inRight);},determineQuadrant:function(lonlat){var quadrant="";var center=this.getCenterLonLat();quadrant+=(lonlat.lat<center.lat)?"b":"t";quadrant+=(lonlat.lon<center.lon)?"l":"r";return quadrant;},CLASS_NAME:"OpenLayers.Bounds"};OpenLayers.Bounds.fromString=function(str){var bounds=str.split(",");return OpenLayers.Bounds.fromArray(bounds);};OpenLayers.Bounds.fromArray=function(bbox){return new OpenLayers.Bounds(parseFloat(bbox[0]),parseFloat(bbox[1]),parseFloat(bbox[2]),parseFloat(bbox[3]));};OpenLayers.Bounds.fromSize=function(size){return new OpenLayers.Bounds(0,size.h,size.w,0);};OpenLayers.Bounds.oppositeQuadrant=function(quadrant){var opp="";opp+=(quadrant.charAt(0)=='t')?'b':'t';opp+=(quadrant.charAt(1)=='l')?'r':'l';return opp;};String.prototype.startsWith=function(sStart){return(this.substr(0,sStart.length)==sStart);};String.prototype.contains=function(str){return(this.indexOf(str)!=-1);
 };String.prototype.trim=function(){var b=0;while(this.substr(b,1)==" "){b++;}
  var e=this.length-1;while(this.substr(e,1)==" "){e--;}
  return this.substring(b,e+1);};Array.prototype.remove=function(item){for(var i=0;i<this.length;i++){if(this[i]==item){this.splice(i,1);}}
  return this;}
  Array.prototype.clone=function(){var clone=new Array();for(var i=0;i<this.length;i++){clone[i]=this[i];}
  return clone;};Array.prototype.clear=function(){this.length=0;};Number.prototype.limitSigDigs=function(sig){var number=(sig>0)?this.toString():0;if(sig<number.length){var exp=number.length-sig;number=Math.round(this/Math.pow(10,exp))*Math.pow(10,exp);}
  return parseInt(number);}
  OpenLayers.Control=Class.create();OpenLayers.Control.prototype={map:null,div:null,position:null,mouseDragStart:null,initialize:function(options){Object.extend(this,options);},destroy:function(){this.map=null;},setMap:function(map){this.map=map;},draw:function(px){if(this.div==null){this.div=OpenLayers.Util.createDiv();}
  if(px!=null){this.position=px.clone();}
  this.moveTo(this.position);return this.div;},moveTo:function(px){if((px!=null)&&(this.div!=null)){this.div.style.left=px.x+"px";this.div.style.top=px.x+"px";}},CLASS_NAME:"OpenLayers.Control"};OpenLayers.Events=Class.create();OpenLayers.Events.prototype={BROWSER_EVENTS:["mouseover","mouseout","mousedown","mouseup","mousemove","click","dblclick","resize","focus","blur"],listeners:null,object:null,element:null,eventTypes:null,initialize:function(object,element,eventTypes){this.object=object;this.element=element;this.eventTypes=eventTypes;this.listeners=new Object();if(this.eventTypes!=null)
  for(var i=0;i<this.eventTypes.length;i++)
  this.listeners[this.eventTypes[i]]=new Array();if(this.element!=null)
  this.attachToElement(element);},attachToElement:function(element){for(var i=0;i<this.BROWSER_EVENTS.length;i++){var eventType=this.BROWSER_EVENTS[i];if(this.listeners[eventType]==null)
  this.listeners[eventType]=new Array();Event.observe(element,eventType,this.handleBrowserEvent.bindAsEventListener(this));}
  Event.observe(element,"dragstart",Event.stop);},register:function(type,obj,func){if(func!=null){if(obj==null){obj=this.object;}
  var listeners=this.listeners[type];if(listeners!=null){listeners.push({obj:obj,func:func});}}},unregister:function(type,obj,func){if(obj==null){obj=this.object;}
  var listeners=this.listeners[type];if(listeners!=null){for(var i=0;i<listeners.length;i++){if(listeners[i].obj==obj&&listeners[i].func==func){listeners.splice(i,1);break;}}}},remove:function(type){if(this.listeners[type]!=null){this.listeners[type]=new Array();}},triggerEvent:function(type,evt){if(evt==null){evt=new Object();}
  evt.object=this.object;evt.element=this.element;var listeners=this.listeners[type];if(listeners!=null){for(var i=0;i<listeners.length;i++){var callback=listeners[i];var continueChain;if(callback.obj!=null){continueChain=callback.func.call(callback.obj,evt);}else{continueChain=callback.func(evt);}
  if((continueChain!=null)&&(continueChain==false)){break;}}}},handleBrowserEvent:function(evt){evt.xy=this.getMousePosition(evt);this.triggerEvent(evt.type,evt)},getMousePosition:function(evt){if(!this.element.offsets){this.element.offsets=Position.page(this.element);}
  return new OpenLayers.Pixel(evt.clientX-this.element.offsets[0],evt.clientY-this.element.offsets[1]);},CLASS_NAME:"OpenLayers.Events"};OpenLayers.Icon=Class.create();OpenLayers.Icon.prototype={url:null,size:null,offset:null,calculateOffset:null,imageDiv:null,px:null,initialize:function(url,size,offset,calculateOffset){this.url=url;this.size=(size)?size:new OpenLayers.Size(20,20);this.offset=(offset)?offset:new OpenLayers.Pixel(0,0);this.calculateOffset=calculateOffset;this.imageDiv=OpenLayers.Util.createAlphaImageDiv();},destroy:function(){this.imageDiv=null;},clone:function(){return new OpenLayers.Icon(this.url,this.size,this.offset,this.calculateOffset);},setSize:function(size){if(size!=null){this.size=size;}
  this.draw();},draw:function(px){OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,null,this.size,this.url,"absolute");this.moveTo(px);return this.imageDiv;},moveTo:function(px){if(px!=null){this.px=px;}
  if(this.imageDiv!=null){if(this.px==null){this.display(false);}else{if(this.calculateOffset){this.offset=this.calculateOffset(this.size);}
  var offsetPx=this.px.offset(this.offset);OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,offsetPx);this.display(true);}}},display:function(display){this.imageDiv.style.display=(display)?"":"none";},CLASS_NAME:"OpenLayers.Icon"};OpenLayers.Layer=Class.create();OpenLayers.Layer.prototype={id:null,name:null,div:null,map:null,isBaseLayer:false,alpha:false,options:null,projection:null,maxExtent:null,maxResolution:null,numZoomLevels:null,minScale:null,maxScale:null,units:null,initialize:function(name,options){if(arguments.length>0){this.options=Object.extend(new Object(),options);Object.extend(this,this.options);this.name=name;this.id=OpenLayers.Util.createUniqueID("Layer_");if(this.div==null){this.div=OpenLayers.Util.createDiv();this.div.style.width="100%";this.div.style.height="100%";}}},destroy:function(){if(this.map!=null){this.map.removeLayer(this);}
  this.map=null;this.name=null;this.div=null;this.options=null;},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer(this.name,this.options);}
  OpenLayers.Util.applyDefaults(obj,this);obj.map=null;return obj;},setName:function(newName){this.name=newName;if(this.map!=null)
  this.map.events.triggerEvent("changelayer");},addOptions:function(newOptions){Object.extend(this.options,newOptions);Object.extend(this,this.options);},onMapResize:function(){},moveTo:function(bounds,zoomChanged,minor){},setMap:function(map){this.map=map;var properties=new Array('projection','units','scales','resolutions','maxScale','minScale','maxResolution','minResolution','minExtent','maxExtent','numZoomLevels');if(this.map.maxZoomLevel&&!this.numZoomLevels){this.numZoomLevels=this.map.maxZoomLevel+1;}
  for(var i=0;i<properties.length;i++){if(this[properties[i]]==null){this[properties[i]]=this.map[properties[i]];}}},getVisibility:function(){return(this.div.style.display!="none");},setVisibility:function(visible,noEvent){if(visible!=this.getVisibility()){this.div.style.display=(visible)?"block":"none";if((visible)&&(this.map!=null)){var extent=this.map.getExtent();if(extent!=null){this.moveTo(this.map.getExtent());}}
  if((this.map!=null)&&((noEvent==null)||(noEvent==false))){this.map.events.triggerEvent("changelayer");}}},setIsBaseLayer:function(isBaseLayer){this.isBaseLayer=isBaseLayer;if(this.map!=null){this.map.events.triggerEvent("changelayer");}},getProjection:function(){return this.projection;},getMaxExtent:function(){return this.maxExtent;},getMaxResolution:function(){return this.maxResolution;},getNumZoomLevels:function(){return this.numZoomLevels;},getResolution:function(){var viewSize=this.map.getSize();var extent=this.getExtent();return Math.max(extent.getWidth()/viewSize.w,extent.getHeight()/viewSize.h);},getExtent:function(){var extent=null;var size=this.map.getSize();var tlPx=new OpenLayers.Pixel(0,0);var tlLL=this.getLonLatFromViewPortPx(tlPx);var brPx=new OpenLayers.Pixel(size.w,size.h);var brLL=this.getLonLatFromViewPortPx(brPx);if((tlLL!=null)&&(brLL!=null)){extent=new OpenLayers.Bounds(tlLL.lon,brLL.lat,brLL.lon,tlLL.lat);}
  return extent;},getLonLatFromViewPortPx:function(viewPortPx){var size=this.map.getSize();var center=this.map.getCenter();var res=this.map.getResolution();var delta_x=viewPortPx.x-(size.w/2);var delta_y=viewPortPx.y-(size.h/2);return new OpenLayers.LonLat(center.lon+delta_x*res,center.lat-delta_y*res);},getViewPortPxFromLonLat:function(lonlat){var resolution=this.map.getResolution();var extent=this.map.getExtent();return new OpenLayers.Pixel(Math.round(1/resolution*(lonlat.lon-extent.left)),Math.round(1/resolution*(extent.top-lonlat.lat)));},getZoomForExtent:function(bounds){},CLASS_NAME:"OpenLayers.Layer"};OpenLayers.Marker=Class.create();OpenLayers.Marker.prototype={icon:null,lonlat:null,events:null,map:null,initialize:function(lonlat,icon){if(arguments.length>0){this.lonlat=lonlat;this.icon=(icon)?icon:OpenLayers.Marker.defaultIcon();this.events=new OpenLayers.Events(this,this.icon.imageDiv,null);}},destroy:function(){this.map=null;if(this.icon!=null){this.icon.destroy();
 this.icon=null;}},draw:function(px){return this.icon.draw(px);},moveTo:function(px){if((px!=null)&&(this.icon!=null)){this.icon.moveTo(px);}},onScreen:function(){var onScreen=false;if(this.map){var screenBounds=this.map.getExtent();onScreen=screenBounds.contains(this.lonlat.lon,this.lonlat.lat);}
  return onScreen;},inflate:function(inflate){if(this.icon){var newSize=new OpenLayers.Size(this.icon.size.w*inflate,this.icon.size.h*inflate);this.icon.setSize(newSize);}},display:function(display){this.icon.display(display);},CLASS_NAME:"OpenLayers.Marker"};OpenLayers.Marker.defaultIcon=function(){var url=OpenLayers.Util.getImagesLocation()+"marker.png";var size=new OpenLayers.Size(21,25);var calculateOffset=function(size){return new OpenLayers.Pixel(-(size.w/2),-size.h);};return new OpenLayers.Icon(url,size,null,calculateOffset);};OpenLayers.Popup=Class.create();OpenLayers.Popup.count=0;OpenLayers.Popup.WIDTH=200;OpenLayers.Popup.HEIGHT=200;OpenLayers.Popup.COLOR="white";OpenLayers.Popup.OPACITY=1;OpenLayers.Popup.BORDER="0px";OpenLayers.Popup.prototype={events:null,id:"",lonlat:null,div:null,size:null,contentHTML:"",backgroundColor:"",opacity:"",border:"",map:null,initialize:function(id,lonlat,size,contentHTML){OpenLayers.Popup.count+=1;this.id=(id!=null)?id:"Popup"+OpenL
 ayers.Popup.count;this.lonlat=lonlat;this.size=(size!=null)?size:new OpenLayers.Size(OpenLayers.Popup.WIDTH,OpenLayers.Popup.HEIGHT);if(contentHTML!=null){this.contentHTML=contentHTML;}
  this.backgroundColor=OpenLayers.Popup.COLOR;this.opacity=OpenLayers.Popup.OPACITY;this.border=OpenLayers.Popup.BORDER;this.div=OpenLayers.Util.createDiv(this.id+"_div",null,null,null,null,null,"hidden");this.events=new OpenLayers.Events(this,this.div,null);},destroy:function(){if(this.map!=null){this.map.removePopup(this);}
  this.div=null;this.map=null;},draw:function(px){if(px==null){if((this.lonlat!=null)&&(this.map!=null)){px=this.map.getLayerPxFromLonLat(this.lonlat);}}
  this.setSize();this.setBackgroundColor();this.setOpacity();this.setBorder();this.setContentHTML();this.moveTo(px);return this.div;},updatePosition:function(){if((this.lonlat)&&(this.map)){var px=this.map.getLayerPxFromLonLat(this.lonlat);this.moveTo(px);}},moveTo:function(px){if((px!=null)&&(this.div!=null)){this.div.style.left=px.x+"px";this.div.style.top=px.y+"px";}},visible:function(){return Element.visible(this.div);},toggle:function(){Element.toggle(this.div);},show:function(){Element.show(this.div);},hide:function(){Element.hide(this.div);},setSize:function(size){if(size!=undefined){this.size=size;}
  if(this.div!=null){this.div.style.width=this.size.w+"px";this.div.style.height=this.size.h+"px";}},setBackgroundColor:function(color){if(color!=undefined){this.backgroundColor=color;}
  if(this.div!=null){this.div.style.backgroundColor=this.backgroundColor;}},setOpacity:function(opacity){if(opacity!=undefined){this.opacity=opacity;}
  if(this.div!=null){this.div.style.opacity=this.opacity;this.div.style.filter='alpha(opacity='+this.opacity*100+')';}},setBorder:function(border){if(border!=undefined){this.border=border;}
  if(this.div!=null){this.div.style.border=this.border;}},setContentHTML:function(contentHTML){if(contentHTML!=null){this.contentHTML=contentHTML;}
  if(this.div!=null){this.div.innerHTML=this.contentHTML;}},CLASS_NAME:"OpenLayers.Popup"};OpenLayers.Tile=Class.create();OpenLayers.Tile.prototype={id:null,layer:null,url:null,bounds:null,size:null,position:null,drawn:false,initialize:function(layer,position,bounds,url,size){if(arguments.length>0){this.layer=layer;this.position=position;this.bounds=bounds;this.url=url;this.size=size;this.id=OpenLayers.Util.createUniqueID("Tile_");}},destroy:function(){this.layer=null;this.bounds=null;this.size=null;this.position=null;},draw:function(){this.drawn=true;},moveTo:function(bounds,position,redraw){if(redraw==null){redraw=true;}
  this.clear();this.bounds=bounds.clone();this.position=position.clone();if(redraw){this.draw();}},clear:function(){this.drawn=false;},CLASS_NAME:"OpenLayers.Tile"};OpenLayers.Util=new Object();OpenLayers.Util.modifyDOMElement=function(element,id,px,sz,position,border,overflow){if(id){element.id=id;}
  if(px){element.style.left=px.x+"px";element.style.top=px.y+"px";}
  if(sz){element.style.width=sz.w+"px";element.style.height=sz.h+"px";}
  if(position){element.style.position=position;}
  if(border){element.style.border=border;}
  if(overflow){element.style.overflow=overflow;}};OpenLayers.Util.createDiv=function(id,px,sz,imgURL,position,border,overflow){var dom=document.createElement('div');dom.style.padding="0";dom.style.margin="0";if(imgURL){dom.style.backgroundImage='url('+imgURL+')';}
  if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");}
  if(!position){position="absolute";}
  OpenLayers.Util.modifyDOMElement(dom,id,px,sz,position,border,overflow);return dom;};OpenLayers.Util.createImage=function(id,px,sz,imgURL,position,border,delayDisplay){image=document.createElement("img");if(delayDisplay){image.style.display="none";Event.observe(image,"load",OpenLayers.Util.onImageLoad.bindAsEventListener(image));Event.observe(image,"error",OpenLayers.Util.onImageLoadError.bindAsEventListener(image));}
  image.style.alt=id;image.galleryImg="no";if(imgURL){image.src=imgURL;}
  if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");}
  if(!position){position="relative";}
  OpenLayers.Util.modifyDOMElement(image,id,px,sz,position,border);return image;};OpenLayers.Util.onImageLoad=function(){this.style.backgroundColor=null;this.style.display="";};OpenLayers.Util.onImageLoadError=function(){this.style.backgroundColor="pink";};OpenLayers.Util.alphaHack=function(){var arVersion=navigator.appVersion.split("MSIE");var version=parseFloat(arVersion[1]);return((document.body.filters)&&(version>=5.5)&&(version<7));}
  OpenLayers.Util.modifyAlphaImageDiv=function(div,id,px,sz,imgURL,position,border,sizing){OpenLayers.Util.modifyDOMElement(div,id,px,sz);var img=div.childNodes[0];if(imgURL){img.src=imgURL;}
  OpenLayers.Util.modifyDOMElement(img,div.id+"_innerImage",null,sz,"relative",border);if(OpenLayers.Util.alphaHack()){div.style.display="inline-block";if(sizing==null){sizing="scale";}
  div.style.filter="progid:DXImageTransform.Microsoft"+".AlphaImageLoader(src='"+img.src+"', "+"sizingMethod='"+sizing+"')";img.style.filter="progid:DXImageTransform.Microsoft"+".Alpha(opacity=0)";}};OpenLayers.Util.createAlphaImageDiv=function(id,px,sz,imgURL,position,border,sizing,delayDisplay){var div=OpenLayers.Util.createDiv();var img=OpenLayers.Util.createImage(null,null,null,null,null,null,false);div.appendChild(img);if(delayDisplay){img.style.display="none";Event.observe(img,"load",OpenLayers.Util.onImageLoad.bindAsEventListener(div));Event.observe(img,"error",OpenLayers.Util.onImageLoadError.bindAsEventListener(div));}
  OpenLayers.Util.modifyAlphaImageDiv(div,id,px,sz,imgURL,position,border,sizing);return div;};OpenLayers.Util.upperCaseObject=function(object){var uObject=new Object();for(var key in object){uObject[key.toUpperCase()]=object[key];}
  return uObject;};OpenLayers.Util.applyDefaults=function(to,from){for(var key in from){if(to[key]==null){to[key]=from[key];}}};OpenLayers.Util.getParameterString=function(params){paramsArray=new Array();for(var key in params){var value=params[key];if((value!=null)&&(typeof value!='function')){paramsArray.push(key+"="+value);}}
  return paramsArray.join("&");};OpenLayers.Util.getImagesLocation=function(){return OpenLayers._getScriptLocation()+"img/";};OpenLayers.Util.getNodes=function(p,tagName){var nodes=Try.these(function(){return OpenLayers.Util._getNodes(p.documentElement.childNodes,tagName);},function(){return OpenLayers.Util._getNodes(p.childNodes,tagName);});return nodes;};OpenLayers.Util._getNodes=function(nodes,tagName){var retArray=new Array();for(var i=0;i<nodes.length;i++){if(nodes[i].nodeName==tagName){retArray.push(nodes[i]);}}
  return retArray;};OpenLayers.Util.getTagText=function(parent,item,index){var result=OpenLayers.Util.getNodes(parent,item);if(result&&(result.length>0))
  {if(!index){index=0;}
  if(result[index].childNodes.length>1){return result.childNodes[1].nodeValue;}
  else if(result[index].childNodes.length==1){return result[index].firstChild.nodeValue;}}else{return"";}};OpenLayers.Util.getXmlNodeValue=function(node){var val=null;Try.these(function(){val=node.text;if(!val)
  val=node.textContent;},function(){val=node.textContent;});return val;};OpenLayers.Util.mouseLeft=function(evt,div){var target=(evt.relatedTarget)?evt.relatedTarget:evt.toElement;while(target!=div&&target!=null){target=target.parentNode;}
  return(target!=div);};OpenLayers.Util.rad=function(x){return x*Math.PI/180;};OpenLayers.Util.distVincenty=function(p1,p2){var a=6378137,b=6356752.3142,f=1/298.257223563;var L=OpenLayers.Util.rad(p2.lon-p1.lon);var U1=Math.atan((1-f)*Math.tan(OpenLayers.Util.rad(p1.lat)));var U2=Math.atan((1-f)*Math.tan(OpenLayers.Util.rad(p2.lat)));var sinU1=Math.sin(U1),cosU1=Math.cos(U1);var sinU2=Math.sin(U2),cosU2=Math.cos(U2);var lambda=L,lambdaP=2*Math.PI;var iterLimit=20;while(Math.abs(lambda-lambdaP)>1e-12&&--iterLimit>0){var sinLambda=Math.sin(lambda),cosLambda=Math.cos(lambda);var sinSigma=Math.sqrt((cosU2*sinLambda)*(cosU2*sinLambda)+
  (cosU1*sinU2-sinU1*cosU2*cosLambda)*(cosU1*sinU2-sinU1*cosU2*cosLambda));if(sinSigma==0)return 0;var cosSigma=sinU1*sinU2+cosU1*cosU2*cosLambda;var sigma=Math.atan2(sinSigma,cosSigma);var alpha=Math.asin(cosU1*cosU2*sinLambda/sinSigma);var cosSqAlpha=Math.cos(alpha)*Math.cos(alpha);var cos2SigmaM=cosSigma-2*sinU1*sinU2/cosSqAlpha;var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));lambdaP=lambda;lambda=L+(1-C)*f*Math.sin(alpha)*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));}
  if(iterLimit==0)return NaN
  var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
  B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));var s=b*A*(sigma-deltaSigma);var d=s.toFixed(3)/1000;return d;};OpenLayers.Util.getArgs=function(){var args=new Object();var query=location.search.substring(1);var pairs=query.split("&");for(var i=0;i<pairs.length;i++){var pos=pairs[i].indexOf('=');if(pos==-1)continue;var argname=pairs[i].substring(0,pos);var value=pairs[i].substring(pos+1);args[argname]=unescape(value);}
  return args;};OpenLayers.Util.createUniqueID=function(prefix){if(prefix==null){prefix="id_";}
  return prefix+Math.round(Math.random()*10000);};OpenLayers.INCHES_PER_UNIT={'inches':1.0,'ft':12.0,'mi':63360.0,'m':39.3701,'km':39370.1,'dd':4374754};OpenLayers.INCHES_PER_UNIT["in"]=OpenLayers.INCHES_PER_UNIT.inches;OpenLayers.INCHES_PER_UNIT["degrees"]=OpenLayers.INCHES_PER_UNIT.dd;OpenLayers.DOTS_PER_INCH=72;OpenLayers.Util.normalizeScale=function(scale){var normScale=(scale>1.0)?(1.0/scale):scale;return normScale;};OpenLayers.Util.getResolutionFromScale=function(scale,units){if(units==null){units="degrees";}
  var normScale=OpenLayers.Util.normalizeScale(scale);var resolution=1/(normScale*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH);return resolution;};Rico.Color=Class.create();Rico.Color.prototype={initialize:function(red,green,blue){this.rgb={r:red,g:green,b:blue};},setRed:function(r){this.rgb.r=r;},setGreen:function(g){this.rgb.g=g;},setBlue:function(b){this.rgb.b=b;},setHue:function(h){var hsb=this.asHSB();hsb.h=h;this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},setSaturation:function(s){var hsb=this.asHSB();hsb.s=s;this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},setBrightness:function(b){var hsb=this.asHSB();hsb.b=b;this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},darken:function(percent){var hsb=this.asHSB();this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.max(hsb.b-percent,0));},brighten:function(percent){var hsb=this.asHSB();this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.min(hsb.b+percent,1));},blend:function(other){this.rgb.r=Math.floor((this.rgb.r+other.r
 gb.r)/2);this.rgb.g=Math.floor((this.rgb.g+other.rgb.g)/2);this.rgb.b=Math.floor((this.rgb.b+other.rgb.b)/2);},isBright:function(){var hsb=this.asHSB();return this.asHSB().b>0.5;},isDark:function(){return!this.isBright();},asRGB:function(){return"rgb("+this.rgb.r+","+this.rgb.g+","+this.rgb.b+")";},asHex:function(){return"#"+this.rgb.r.toColorPart()+this.rgb.g.toColorPart()+this.rgb.b.toColorPart();},asHSB:function(){return Rico.Color.RGBtoHSB(this.rgb.r,this.rgb.g,this.rgb.b);},toString:function(){return this.asHex();}};Rico.Color.createFromHex=function(hexCode){if(hexCode.length==4){var shortHexCode=hexCode;var hexCode='#';for(var i=1;i<4;i++)hexCode+=(shortHexCode.charAt(i)+
  shortHexCode.charAt(i));}
  if(hexCode.indexOf('#')==0)
  hexCode=hexCode.substring(1);var red=hexCode.substring(0,2);var green=hexCode.substring(2,4);var blue=hexCode.substring(4,6);return new Rico.Color(parseInt(red,16),parseInt(green,16),parseInt(blue,16));}
  Rico.Color.createColorFromBackground=function(elem){var actualColor=RicoUtil.getElementsComputedStyle($(elem),"backgroundColor","background-color");if(actualColor=="transparent"&&elem.parentNode)
  return Rico.Color.createColorFromBackground(elem.parentNode);if(actualColor==null)
  return new Rico.Color(255,255,255);if(actualColor.indexOf("rgb(")==0){var colors=actualColor.substring(4,actualColor.length-1);var colorArray=colors.split(",");return new Rico.Color(parseInt(colorArray[0]),parseInt(colorArray[1]),parseInt(colorArray[2]));}
  else if(actualColor.indexOf("#")==0){return Rico.Color.createFromHex(actualColor);}
  else
  return new Rico.Color(255,255,255);}
  Rico.Color.HSBtoRGB=function(hue,saturation,brightness){var red=0;var green=0;var blue=0;if(saturation==0){red=parseInt(brightness*255.0+0.5);green=red;blue=red;}
  else{var h=(hue-Math.floor(hue))*6.0;var f=h-Math.floor(h);var p=brightness*(1.0-saturation);var q=brightness*(1.0-saturation*f);var t=brightness*(1.0-(saturation*(1.0-f)));switch(parseInt(h)){case 0:red=(brightness*255.0+0.5);green=(t*255.0+0.5);blue=(p*255.0+0.5);break;case 1:red=(q*255.0+0.5);green=(brightness*255.0+0.5);blue=(p*255.0+0.5);break;case 2:red=(p*255.0+0.5);green=(brightness*255.0+0.5);blue=(t*255.0+0.5);break;case 3:red=(p*255.0+0.5);green=(q*255.0+0.5);blue=(brightness*255.0+0.5);break;case 4:red=(t*255.0+0.5);green=(p*255.0+0.5);blue=(brightness*255.0+0.5);break;case 5:red=(brightness*255.0+0.5);green=(p*255.0+0.5);blue=(q*255.0+0.5);break;}}
  return{r:parseInt(red),g:parseInt(green),b:parseInt(blue)};}
  Rico.Color.RGBtoHSB=function(r,g,b){var hue;var saturation;var brightness;var cmax=(r>g)?r:g;if(b>cmax)
  cmax=b;var cmin=(r<g)?r:g;if(b<cmin)
  cmin=b;brightness=cmax/255.0;if(cmax!=0)
  saturation=(cmax-cmin)/cmax;else
  saturation=0;if(saturation==0)
  hue=0;else{var redc=(cmax-r)/(cmax-cmin);var greenc=(cmax-g)/(cmax-cmin);var bluec=(cmax-b)/(cmax-cmin);if(r==cmax)
  hue=bluec-greenc;else if(g==cmax)
  hue=2.0+redc-bluec;else
  hue=4.0+greenc-redc;hue=hue/6.0;if(hue<0)
  hue=hue+1.0;}
  return{h:hue,s:saturation,b:brightness};}
  OpenLayers.Control.LayerSwitcher=Class.create();OpenLayers.Control.LayerSwitcher.prototype=Object.extend(new OpenLayers.Control(),{activeColor:"darkblue",layersDiv:null,baseLayersDiv:null,baseLayerInputs:null,dataLbl:null,dataLayersDiv:null,dataLayerInputs:null,minimizeDiv:null,maximizeDiv:null,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);this.map.events.register("addlayer",this,this.redraw);this.map.events.register("changelayer",this,this.redraw);this.map.events.register("removelayer",this,this.redraw);this.map.events.register("changebaselayer",this,this.redraw);},draw:function(){OpenLayers.Control.prototype.draw.apply(this);this.loadContents();this.minimizeControl();this.redraw();return this.div;},redraw:function(){this.baseLayersDiv.innerHTML="";this.baseLayerInputs=new Array();this.dataLayersDiv.innerHTML="";this.dataLayerInputs=new Array();var 
 containsOverlays=false;for(var i=0;i<this.map.layers.length;i++){var layer=this.map.layers[i];var baseLayer=layer.isBaseLayer;if(!baseLayer){containsOverlays=true;}
  var checked=(baseLayer)?(layer==this.map.baseLayer):layer.getVisibility();var inputElem=document.createElement("input");inputElem.id="input_"+layer.name;inputElem.name=(baseLayer)?"baseLayers":layer.name;inputElem.type=(baseLayer)?"radio":"checkbox";inputElem.value=layer.name;inputElem.checked=checked;inputElem.defaultChecked=checked;inputElem.layer=layer;inputElem.control=this;Event.observe(inputElem,"mouseup",this.onInputClick.bindAsEventListener(inputElem));var labelSpan=document.createElement("span");labelSpan.innerHTML=layer.name;labelSpan.style.verticalAlign=(baseLayer)?"bottom":"auto";Event.observe(labelSpan,"click",this.onInputClick.bindAsEventListener(inputElem));var br=document.createElement("br");var groupArray=(baseLayer)?this.baseLayerInputs:this.dataLayerInputs;groupArray.push(inputElem);var groupDiv=(baseLayer)?this.baseLayersDiv:this.dataLayersDiv;groupDiv.appendChild(inputElem);groupDiv.appendChild(labelSpan);groupDiv.appendChild(br);}
  this.dataLbl.style.display=(containsOverlays)?"":"none";return this.div;},onInputClick:function(e){if(this.type=="radio"){this.checked=true;this.layer.map.setBaseLayer(this.layer,true);this.layer.map.events.triggerEvent("changebaselayer");}else{this.checked=!this.checked;this.control.updateMap();}
  Event.stop(e);},onLayerClick:function(e){this.updateMap();},updateMap:function(){for(var i=0;i<this.baseLayerInputs.length;i++){var input=this.baseLayerInputs[i];if(input.checked){this.map.setBaseLayer(input.layer,false);}}
  for(var i=0;i<this.dataLayerInputs.length;i++){var input=this.dataLayerInputs[i];input.layer.setVisibility(input.checked,true);}},maximizeControl:function(e){this.div.style.width="20em";this.div.style.height="";this.showControls(false);if(e!=null){Event.stop(e);}},minimizeControl:function(e){this.div.style.width="0px";this.div.style.height="0px";this.showControls(true);if(e!=null){Event.stop(e);}},showControls:function(minimize){this.maximizeDiv.style.display=minimize?"":"none";this.minimizeDiv.style.display=minimize?"none":"";this.layersDiv.style.display=minimize?"none":"";},loadContents:function(){this.div.style.position="absolute";this.div.style.top="10px";this.div.style.right="0px";this.div.style.left="";this.div.style.fontFamily="sans-serif";this.div.style.fontWeight="bold";this.div.style.marginTop="3px";this.div.style.marginLeft="3px";this.div.style.marginBottom="3px";this.div.style.fontSize="smaller";this.div.style.color="white";this.div.style.backgroundColor="transp
 arent";Event.observe(this.div,"mouseup",this.mouseUp.bindAsEventListener(this));Event.observe(this.div,"click",this.ignoreEvent);Event.observe(this.div,"mousedown",this.mouseDown.bindAsEventListener(this));Event.observe(this.div,"dblclick",this.ignoreEvent);this.layersDiv=document.createElement("div");this.layersDiv.id="layersDiv";this.layersDiv.style.paddingTop="5px";this.layersDiv.style.paddingLeft="10px";this.layersDiv.style.paddingBottom="5px";this.layersDiv.style.paddingRight="75px";this.layersDiv.style.backgroundColor=this.activeColor;this.layersDiv.style.width="100%";this.layersDiv.style.height="100%";var baseLbl=document.createElement("div");baseLbl.innerHTML="<u>Base Layer</u>";baseLbl.style.marginTop="3px";baseLbl.style.marginLeft="3px";baseLbl.style.marginBottom="3px";this.layersDiv.appendChild(baseLbl);this.baseLayersDiv=document.createElement("div");this.baseLayersDiv.style.paddingLeft="10px";this.layersDiv.appendChild(this.baseLayersDiv);this.dataLbl=document.c
 reateElement("div");this.dataLbl.innerHTML="<u>Overlays</u>";this.dataLbl.style.marginTop="3px";this.dataLbl.style.marginLeft="3px";this.dataLbl.style.marginBottom="3px";this.layersDiv.appendChild(this.dataLbl);this.dataLayersDiv=document.createElement("div");this.dataLayersDiv.style.paddingLeft="10px";this.layersDiv.appendChild(this.dataLayersDiv);this.div.appendChild(this.layersDiv);Rico.Corner.round(this.div,{corners:"tl bl",bgColor:"transparent",color:this.activeColor,blend:false});Rico.Corner.changeOpacity(this.layersDiv,0.75);var imgLocation=OpenLayers.Util.getImagesLocation();var sz=new OpenLayers.Size(18,18);var img=imgLocation+'layer-switcher-maximize.png';this.maximizeDiv=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MaximizeDiv",null,sz,img,"absolute");this.maximizeDiv.style.top="5px";this.maximizeDiv.style.right="0px";this.maximizeDiv.style.left="";this.maximizeDiv.style.display="none";Event.observe(this.maximizeDiv,"click",this.maximizeControl.bindAsEv
 entListener(this));this.div.appendChild(this.maximizeDiv);var img=imgLocation+'layer-switcher-minimize.png';var sz=new OpenLayers.Size(18,18);this.minimizeDiv=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MinimizeDiv",null,sz,img,"absolute");this.minimizeDiv.style.top="5px";this.minimizeDiv.style.right="0px";this.minimizeDiv.style.left="";this.minimizeDiv.style.display="none";Event.observe(this.minimizeDiv,"click",this.minimizeControl.bindAsEventListener(this));this.div.appendChild(this.minimizeDiv);},ignoreEvent:function(evt){Event.stop(evt);},mouseDown:function(evt){this.mouseDown=true;this.ignoreEvent(evt);},mouseUp:function(evt){if(this.mouseDown){this.mouseDown=false;this.ignoreEvent(evt);}},CLASS_NAME:"OpenLayers.Control.LayerSwitcher"});OpenLayers.Control.LayerTabs=Class.create();OpenLayers.Control.LayerTabs.ACTIVE_COLOR="darkblue";OpenLayers.Control.LayerTabs.NONACTIVE_COLOR="lightblue";OpenLayers.Control.LayerTabs.prototype=Object.extend(new OpenLayers.Con
 trol(),{activeColor:"",nonActiveColor:"",mode:"checkbox",initialize:function(options){this.activeColor=OpenLayers.Control.LayerTabs.ACTIVE_COLOR;this.nonActiveColor=OpenLayers.Control.LayerTabs.NONACTIVE_COLOR;this.backdrops=[];OpenLayers.Control.prototype.initialize.apply(this,arguments);},draw:function(){OpenLayers.Control.prototype.draw.apply(this);this.div.style.position="absolute";this.div.style.top="10px";this.div.style.right="0px";this.div.style.left="";this.div.style.fontFamily="sans-serif";this.div.style.color="white";this.div.style.fontWeight="bold";this.div.style.marginTop="3px";this.div.style.marginLeft="3px";this.div.style.marginBottom="3px";this.div.style.fontSize="smaller";this.div.style.width="10em";this.map.events.register("addlayer",this,this.redraw);this.map.events.register("removelayer",this,this.redraw);return this.redraw();},redraw:function(){this.div.innerHTML="";var visible=false;for(var i=0;i<this.map.layers.length;i++){if(visible&&this.mode=="radio"
 ){this.map.layers[i].setVisibility(false);}else{visible=this.map.layers[i].getVisibility();}
  this.addTab(this.map.layers[i]);}
  return this.div;},singleClick:function(evt){var div=Event.element(evt);div=div.labelElement||div;var layer=div.layer;if(this.mode=="radio"){for(var i=0;i<this.backdrops.length;i++){this.setTabActivation(this.backdrops[i],false);this.backdrops[i].layer.setVisibility(false);}
  this.setTabActivation(div,true);layer.setVisibility(true);}else{var visible=layer.getVisibility();this.setTabActivation(div,!visible);layer.setVisibility(!visible);}
  Event.stop(evt);},ignoreEvent:function(evt){Event.stop(evt);return false;},addTab:function(layer){var backdropLabelOuter=document.createElement('div');backdropLabelOuter.id="LayerTabs_"+layer.name+"_Tab";backdropLabelOuter.style.marginTop="4px";backdropLabelOuter.style.marginBottom="4px";this._setEventHandlers(backdropLabelOuter);var backdropLabel=document.createElement('p');backdropLabel.innerHTML=layer.name;backdropLabel.style.marginTop="0px";backdropLabel.style.marginBottom="0px";backdropLabel.style.paddingLeft="10px";backdropLabel.style.paddingRight="10px";backdropLabel.layer=layer;this._setEventHandlers(backdropLabel);backdropLabelOuter.appendChild(backdropLabel);this.backdrops.push(backdropLabel);this.div.appendChild(backdropLabelOuter);Rico.Corner.round(backdropLabelOuter,{corners:"tl bl",bgColor:"transparent",color:"white",blend:false});var spanElements=backdropLabel.parentNode.getElementsByTagName("span");for(var currIdx=0;currIdx<spanElements.length;currIdx++){thi
 s._setEventHandlers(spanElements[currIdx],backdropLabel);}
  this.setTabActivation(backdropLabel,layer.getVisibility());},_setEventHandlers:function(element,labelDiv){element.onclick=this.singleClick.bindAsEventListener(this);element.ondblclick=this.singleClick.bindAsEventListener(this);element.onmouseup=this.ignoreEvent.bindAsEventListener(this);element.onmousedown=this.ignoreEvent.bindAsEventListener(this);if(labelDiv){element.labelElement=labelDiv;}},setTabActivation:function(div,activate){var color=(activate)?this.activeColor:this.nonActiveColor;Rico.Corner.changeColor(div,color);},CLASS_NAME:"OpenLayers.Control.LayerTabs"});OpenLayers.Control.MouseDefaults=Class.create();OpenLayers.Control.MouseDefaults.prototype=Object.extend(new OpenLayers.Control(),{performedDrag:false,initialize:function(){OpenLayers.Control.prototype.initialize.apply(this,arguments);Event.observe(window,"DOMMouseScroll",this.onWheelEvent.bindAsEventListener(this));Event.observe(window,"mousewheel",this.onWheelEvent.bindAsEventListener(this));Event.observe(d
 ocument,"mousewheel",this.onWheelEvent.bindAsEventListener(this));},draw:function(){this.map.events.register("click",this,this.defaultClick);this.map.events.register("dblclick",this,this.defaultDblClick);this.map.events.register("mousedown",this,this.defaultMouseDown);this.map.events.register("mouseup",this,this.defaultMouseUp);this.map.events.register("mousemove",this,this.defaultMouseMove);this.map.events.register("mouseout",this,this.defaultMouseOut);},defaultClick:function(evt){if(!Event.isLeftClick(evt))return;var notAfterDrag=!this.performedDrag;this.performedDrag=false;return notAfterDrag;},defaultDblClick:function(evt){var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom+1);Event.stop(evt);return false;},defaultMouseDown:function(evt){if(!Event.isLeftClick(evt))return;this.mouseDragStart=evt.xy.clone();this.performedDrag=false;if(evt.shiftKey){this.map.div.style.cursor="crosshair";this.zoomBox=OpenLayers.Util.createDiv('zo
 omBox',this.mouseDragStart,null,null,"absolute","2px solid red");this.zoomBox.style.backgroundColor="white";this.zoomBox.style.filter="alpha(opacity=50)";this.zoomBox.style.opacity="0.50";this.zoomBox.style.fontSize="1px";this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.viewPortDiv.appendChild(this.zoomBox);}
  document.onselectstart=function(){return false;}
  Event.stop(evt);},defaultMouseMove:function(evt){if(this.mouseDragStart!=null){if(this.zoomBox){var deltaX=Math.abs(this.mouseDragStart.x-evt.xy.x);var deltaY=Math.abs(this.mouseDragStart.y-evt.xy.y);this.zoomBox.style.width=Math.max(1,deltaX)+"px";this.zoomBox.style.height=Math.max(1,deltaY)+"px";if(evt.xy.x<this.mouseDragStart.x){this.zoomBox.style.left=evt.xy.x+"px";}
  if(evt.xy.y<this.mouseDragStart.y){this.zoomBox.style.top=evt.xy.y+"px";}}else{var deltaX=this.mouseDragStart.x-evt.xy.x;var deltaY=this.mouseDragStart.y-evt.xy.y;var size=this.map.getSize();var newXY=new OpenLayers.Pixel(size.w/2+deltaX,size.h/2+deltaY);var newCenter=this.map.getLonLatFromViewPortPx(newXY);this.map.setCenter(newCenter,null,true);this.mouseDragStart=evt.xy.clone();this.map.div.style.cursor="move";}
  this.performedDrag=true;}},defaultMouseUp:function(evt){if(!Event.isLeftClick(evt))return;if(this.zoomBox){this.zoomBoxEnd(evt);}else{if(this.performedDrag){this.map.setCenter(this.map.center);}}
  document.onselectstart=null;this.mouseDragStart=null;this.map.div.style.cursor="default";},defaultMouseOut:function(evt){if(this.mouseDragStart!=null&&OpenLayers.Util.mouseLeft(evt,this.map.div)){this.defaultMouseUp(evt);}},defaultWheelUp:function(){this.map.zoomIn();},defaultWheelDown:function(){this.map.zoomOut();},zoomBoxEnd:function(evt){if(this.mouseDragStart!=null){if(Math.abs(this.mouseDragStart.x-evt.xy.x)>5||Math.abs(this.mouseDragStart.y-evt.xy.y)>5){var start=this.map.getLonLatFromViewPortPx(this.mouseDragStart);var end=this.map.getLonLatFromViewPortPx(evt.xy);var top=Math.max(start.lat,end.lat);var bottom=Math.min(start.lat,end.lat);var left=Math.min(start.lon,end.lon);var right=Math.max(start.lon,end.lon);var bounds=new OpenLayers.Bounds(left,bottom,right,top);var zoom=this.map.getZoomForExtent(bounds);this.map.setCenter(new OpenLayers.LonLat((start.lon+end.lon)/2,(start.lat+end.lat)/2),zoom);}else{var end=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCe
 nter(new OpenLayers.LonLat((end.lon),(end.lat)),this.map.getZoom()+1);}
  this.map.viewPortDiv.removeChild(document.getElementById("zoomBox"));this.zoomBox=null;}},onWheelEvent:function(e){var inMap=false;var elem=Event.element(e);while(elem!=null){if(this.map&&elem==this.map.div){inMap=true;break;}
  elem=elem.parentNode;}
  if(inMap){var delta=0;if(!e){e=window.event;}
  if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera){delta=-delta;}}else if(e.detail){delta=-e.detail/3;}
  if(delta){if(delta<0){this.defaultWheelDown();}else{this.defaultWheelUp();}}
  Event.stop(e);}},CLASS_NAME:"OpenLayers.Control.MouseDefaults"});OpenLayers.Control.PanZoom=Class.create();OpenLayers.Control.PanZoom.X=4;OpenLayers.Control.PanZoom.Y=4;OpenLayers.Control.PanZoom.prototype=Object.extend(new OpenLayers.Control(),{slideFactor:50,buttons:null,position:null,initialize:function(){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.position=new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,OpenLayers.Control.PanZoom.Y);},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position;this.buttons=new Array();var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);this._addButton("panright","east-mini.png",px.add(sz.w,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,s
 z.h*3+5),sz);this._addButton("zoomworld","zoom-world-mini.png",centered.add(0,sz.h*4+5),sz);this._addButton("zoomout","zoom-minus-mini.png",centered.add(0,sz.h*5+5),sz);return this.div;},_addButton:function(id,img,xy,sz){var imgLocation=OpenLayers.Util.getImagesLocation()+img;var btn=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_PanZoom_"+id,xy,sz,imgLocation,"absolute");this.div.appendChild(btn);btn.onmousedown=this.buttonDown.bindAsEventListener(btn);btn.ondblclick=this.doubleClick.bindAsEventListener(btn);btn.onclick=this.doubleClick.bindAsEventListener(btn);btn.action=id;btn.map=this.map;btn.slideFactor=this.slideFactor;this.buttons.push(btn);return btn;},doubleClick:function(evt){Event.stop(evt);return false;},buttonDown:function(evt){if(!Event.isLeftClick(evt))return;switch(this.action){case"panup":this.map.pan(0,-50);break;case"pandown":this.map.pan(0,50);break;case"panleft":this.map.pan(-50,0);break;case"panright":this.map.pan(50,0);break;case"zoomin":this.
 map.zoomIn();break;case"zoomout":this.map.zoomOut();break;case"zoomworld":this.map.zoomToMaxExtent();break;}
  Event.stop(evt);},destroy:function(){OpenLayers.Control.prototype.destroy.apply(this,arguments);for(i=0;i<this.buttons.length;i++){this.buttons[i].map=null;}},CLASS_NAME:"OpenLayers.Control.PanZoom"});OpenLayers.Control.Permalink=Class.create();OpenLayers.Control.Permalink.prototype=Object.extend(new OpenLayers.Control(),{element:null,base:'',initialize:function(element,base){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.element=element;if(base)this.base=base;},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);var args=OpenLayers.Util.getArgs();if(args.lat&&args.lon){this.map.setCenter(new OpenLayers.LonLat(parseFloat(args.lon),parseFloat(args.lat)));}
  if(args.zoom){this.map.zoomTo(parseInt(args.zoom));}
  if(!this.element){this.element=document.createElement("a");this.div.style.right="3px";this.div.style.bottom="3px";this.div.style.left="";this.div.style.top="";this.div.style.display="block";this.div.style.position="absolute";this.element.style.fontSize="smaller";this.element.innerHTML="Permalink";this.element.href="";this.div.appendChild(this.element);}
  this.map.events.register('moveend',this,this.updateLink);return this.div;},updateLink:function(){var center=this.map.getCenter();var zoom=this.map.getZoom();var lat=Math.round(center.lat*100000)/100000;var lon=Math.round(center.lon*100000)/100000;this.element.href=this.base+"?lat="+lat+"&lon="+lon+"&zoom="+zoom;},CLASS_NAME:"OpenLayers.Control.Permalink"});OpenLayers.Control.Scale=Class.create();OpenLayers.Control.Scale.prototype=Object.extend(new OpenLayers.Control(),{element:null,initialize:function(element){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.element=element;},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.element){this.element=document.createElement("div");this.div.style.right="3px";this.div.style.bottom="2em";this.div.style.left="";this.div.style.top="";this.div.style.display="block";this.div.style.position="absolute";this.element.style.fontSize="smaller";this.div.appendChild(this.element);}
  this.map.events.register('moveend',this,this.updateScale);this.updateScale();return this.div;},updateScale:function(){var scale=this.map.getScale();if(!scale)return;if(scale>=9500&&scale<=950000){scale=Math.round(scale/1000)+"K";}else if(scale>=950000){scale=Math.round(scale/1000000)+"M";}else{scale=Math.round(scale/100)*100;}
  this.element.innerHTML="Scale = 1 : "+scale;},CLASS_NAME:"OpenLayers.Control.Scale"});OpenLayers.Feature=Class.create();OpenLayers.Feature.prototype={events:null,layer:null,id:null,lonlat:null,data:null,marker:null,popup:null,initialize:function(layer,lonlat,data){this.layer=layer;this.lonlat=lonlat;this.data=(data!=null)?data:new Object();this.id=OpenLayers.Util.createUniqueID('Feature_');},destroy:function(){if((this.layer!=null)&&(this.layer.map!=null)){if(this.popup!=null){this.layer.map.removePopup(this.popup);}}
  this.events=null;this.layer=null;this.id=null;this.lonlat=null;this.data=null;if(this.marker!=null){this.marker.destroy();this.marker=null;}
  if(this.popup!=null){this.popup.destroy();this.popup=null;}},createMarker:function(){var marker=null;if(this.lonlat!=null){this.marker=new OpenLayers.Marker(this.lonlat,this.data.icon);}
  return this.marker;},createPopup:function(){if(this.lonlat!=null){var id=this.id+"_popup";var anchor=(this.marker)?this.marker.icon:null;this.popup=new OpenLayers.Popup.AnchoredBubble(id,this.lonlat,this.data.popupSize,this.data.popupContentHTML,anchor);}
  return this.popup;},CLASS_NAME:"OpenLayers.Feature"};OpenLayers.Layer.EventPane=Class.create();OpenLayers.Layer.EventPane.prototype=Object.extend(new OpenLayers.Layer,{isBaseLayer:true,isFixed:true,pane:null,initialize:function(name,options){OpenLayers.Layer.prototype.initialize.apply(this,arguments);if(arguments.length>0){if(this.pane==null){this.pane=OpenLayers.Util.createDiv();}}},setMap:function(map){OpenLayers.Layer.prototype.setMap.apply(this,arguments);this.pane.style.zIndex=parseInt(this.div.style.zIndex)+1;this.pane.style.display=this.div.style.display;this.pane.style.width="100%";this.pane.style.height="100%";if(/MSIE/.test(navigator.userAgent)){this.pane.style.background="url("+OpenLayers.Util.getImagesLocation()+"blank.gif)";}
  if(this.isFixed){this.map.viewPortDiv.appendChild(this.pane);}else{this.map.layerContainerDiv.appendChild(this.pane);}},setVisibility:function(visible,noEvent){OpenLayers.Layer.prototype.setVisibility.apply(this,arguments);this.pane.style.display=this.div.style.display;},CLASS_NAME:"OpenLayers.Layer.EventPane"});OpenLayers.Layer.HTTPRequest=Class.create();OpenLayers.Layer.HTTPRequest.prototype=Object.extend(new OpenLayers.Layer(),{url:null,params:null,initialize:function(name,url,params,options){var newArguments=arguments;if(arguments.length>0){newArguments=[name,options];}
  OpenLayers.Layer.prototype.initialize.apply(this,newArguments);this.url=url;this.params=Object.extend(new Object(),params);},setMap:function(map){OpenLayers.Layer.prototype.setMap.apply(this,arguments);this.initResolutions();},destroy:function(){this.url=null;this.params=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.HTTPRequest(this.name,this.url,this.params,this.options);}
  obj=OpenLayers.Layer.prototype.clone.apply(this,[obj]);return obj;},setUrl:function(newUrl){this.url=newUrl;},mergeNewParams:function(newParams){this.params=Object.extend(this.params,newParams);},getFullRequestString:function(newParams,altUrl){var url=(altUrl==null)?this.url:altUrl;var requestString=url;var allParams=Object.extend(new Object(),this.params);var allParams=Object.extend(allParams,newParams);var paramsString=OpenLayers.Util.getParameterString(allParams);if(paramsString!=""){var lastServerChar=this.url.charAt(this.url.length-1);if((lastServerChar=="&")||(lastServerChar=="?")){requestString+=paramsString;}else{if(this.url.indexOf('?')==-1){requestString+='?'+paramsString;}else{requestString+='&'+paramsString;}}}
  return requestString;},initResolutions:function(){if((this.scales!=null)||(this.resolutions!=null)){if(this.scales!=null){this.resolutions=new Array();for(var i=0;i<this.scales.length;i++){this.resolutions[i]=OpenLayers.Util.getResolutionFromScale(this.scales[i],this.units);}}
  this.numZoomLevels=this.resolutions.length;}else{this.resolutions=new Array();if(this.minScale){this.maxResolution=OpenLayers.Util.getResolutionFromScale(this.minScale,this.units);}else if(this.maxResolution=="auto"){var viewSize=this.map.getSize();var wRes=this.maxExtent.getWidth()/viewSize.w;var hRes=this.maxExtent.getHeight()/viewSize.h;this.maxResolution=Math.max(wRes,hRes);}
  if(this.maxScale!=null){this.minResolution=OpenLayers.Util.getResolutionFromScale(this.maxScale);}else if((this.minResolution=="auto")&&(this.minExtent!=null)){var viewSize=this.map.getSize();var wRes=this.minExtent.getWidth()/viewSize.w;var hRes=this.minExtent.getHeight()/viewSize.h;this.minResolution=Math.max(wRes,hRes);}
  if(this.minResolution!=null){var ratio=this.maxResolution/this.minResolution;this.numZoomLevels=Math.floor(Math.log(ratio)/Math.log(2))+1;}
  for(var i=0;i<this.numZoomLevels;i++){this.resolutions.push(this.maxResolution/Math.pow(2,i));}}},getResolution:function(){var zoom=this.map.getZoom();return this.resolutions[zoom];},CLASS_NAME:"OpenLayers.Layer.HTTPRequest"});OpenLayers.Layer.Markers=Class.create();OpenLayers.Layer.Markers.prototype=Object.extend(new OpenLayers.Layer(),{isBaseLayer:false,markers:null,initialize:function(name,options){OpenLayers.Layer.prototype.initialize.apply(this,arguments);this.markers=new Array();},destroy:function(){this.clearMarkers();markers=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},moveTo:function(bounds,zoomChanged,minor){if(zoomChanged){this.redraw();}},addMarker:function(marker){this.markers.push(marker);if(this.map&&this.map.getExtent()){marker.map=this.map;this.drawMarker(marker);}},removeMarker:function(marker){this.markers.remove(marker);if((marker.icon!=null)&&(marker.icon.imageDiv!=null)&&(marker.icon.imageDiv.parentNode==this.div)){this.div.removeChi
 ld(marker.icon.imageDiv);}},clearMarkers:function(){if(this.markers!=null){while(this.markers.length>0){this.removeMarker(this.markers[0]);}}},redraw:function(){for(i=0;i<this.markers.length;i++){this.drawMarker(this.markers[i]);}},drawMarker:function(marker){var px=this.map.getLayerPxFromLonLat(marker.lonlat);if(px==null){marker.display(false);}else{var markerImg=marker.draw(px);if(!marker.drawn){this.div.appendChild(markerImg);marker.drawn=true;}}},CLASS_NAME:"OpenLayers.Layer.Markers"});OpenLayers.Map=Class.create();OpenLayers.Map.TILE_WIDTH=256;OpenLayers.Map.TILE_HEIGHT=256;OpenLayers.Map.prototype={Z_INDEX_BASE:{BaseLayer:100,Overlay:325,Popup:750,Control:1000},EVENT_TYPES:["addlayer","removelayer","changelayer","movestart","move","moveend","zoomend","popupopen","popupclose","addmarker","removemarker","clearmarkers","mouseover","mouseout","mousemove","dragstart","drag","dragend","changebaselayer"],events:null,div:null,size:null,viewPortDiv:null,layerContainerOrigin:nul
 l,layerContainerDiv:null,layers:null,controls:null,popups:null,baseLayer:null,center:null,zoom:0,tileSize:null,projection:"EPSG:4326",units:'degrees',maxResolution:1.40625,minResolution:null,maxScale:null,minScale:null,maxExtent:null,minExtent:null,numZoomLevels:16,initialize:function(div,options){this.div=div=$(div);var id=div.id+"_OpenLayers_ViewPort";this.viewPortDiv=OpenLayers.Util.createDiv(id,null,null,null,"relative",null,"hidden");this.viewPortDiv.style.width="100%";this.viewPortDiv.style.height="100%";this.div.appendChild(this.viewPortDiv);id=div.id+"_OpenLayers_Container";this.layerContainerDiv=OpenLayers.Util.createDiv(id);this.layerContainerDiv.style.zIndex=this.Z_INDEX_BASE['Popup']-1;this.viewPortDiv.appendChild(this.layerContainerDiv);this.events=new OpenLayers.Events(this,div,this.EVENT_TYPES);this.updateSize();if(navigator.appName.contains("Microsoft")){this.events.register("resize",this,this.updateSize);}else{Event.observe(window,'resize',this.updateSize.bi
 ndAsEventListener(this));}
  this.setOptions(options);this.layers=[];if(this.controls==null){this.controls=[new OpenLayers.Control.MouseDefaults(),new OpenLayers.Control.PanZoom()];}
  for(var i=0;i<this.controls.length;i++){this.addControlToMap(this.controls[i]);}
  this.popups=new Array();Event.observe(window,'unload',this.destroy.bindAsEventListener(this));},destroy:function(){if(this.layers!=null){for(var i=0;i<this.layers.length;i++){this.layers[i].destroy();}
  this.layers=null;}
  if(this.controls!=null){for(var i=0;i<this.controls.length;i++){this.controls[i].destroy();}
  this.controls=null;}},setOptions:function(options){this.tileSize=new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH,OpenLayers.Map.TILE_HEIGHT);this.maxExtent=new OpenLayers.Bounds(-180,-90,180,90);Object.extend(this,options);},getTileSize:function(){return this.tileSize;},getLayer:function(id){var foundLayer=null;for(var i=0;i<this.layers.length;i++){var layer=this.layers[i];if(layer.id==id){foundLayer=layer;}}
  return foundLayer;},addLayer:function(layer){layer.div.style.overflow="";layer.div.style.zIndex=this.Z_INDEX_BASE[layer.isBaseLayer?'BaseLayer':'Overlay']
  +this.layers.length*5;if(layer.isFixed){this.viewPortDiv.appendChild(layer.div);}else{this.layerContainerDiv.appendChild(layer.div);}
  this.layers.push(layer);layer.setMap(this);this.events.triggerEvent("addlayer");if(this.center!=null){var bounds=this.getExtent();layer.moveTo(bounds,true);}
  if(layer.isBaseLayer){if(this.baseLayer==null){this.setBaseLayer(layer);this.events.triggerEvent("changebaselayer");}else{layer.setVisibility(false);}}},addLayers:function(layers){for(var i=0;i<layers.length;i++){this.addLayer(layers[i]);}},removeLayer:function(layer){if(layer.isFixed){this.viewPortDiv.removeChild(layer.div);}else{this.layerContainerDiv.removeChild(layer.div);}
  layer.map=null;this.layers.remove(layer);if(this.baseLayer==layer){this.baseLayer=null;for(i=0;i<this.layers.length;i++){var iLayer=this.layers[i];if(iLayer.isBaseLayer){this.setBaseLayer(iLayer);break;}}}
  this.events.triggerEvent("removelayer");},setBaseLayer:function(newBaseLayer,noEvent){if(newBaseLayer!=this.baseLayer){var foundLayer=(this.layers.indexOf(newBaseLayer)!=-1);if(foundLayer){if(this.baseLayer!=null){this.baseLayer.setVisibility(false,noEvent);}
  this.baseLayer=newBaseLayer;this.baseLayer.setVisibility(true,noEvent);var center=this.getCenter();if(center!=null){var zoom=this.getZoom();this.zoom=null;if(zoom>this.baseLayer.numZoomLevels-1){zoom=this.baseLayer.numZoomLevels-1;}
  this.setCenter(center,zoom);}
  if((noEvent==null)||(noEvent==false)){this.events.triggerEvent("changebaselayer");}}}},addControl:function(control,px){this.controls.push(control);this.addControlToMap(control,px);},addControlToMap:function(control,px){control.setMap(this);var div=control.draw(px);if(div){div.style.zIndex=this.Z_INDEX_BASE['Control']+
  this.controls.length;this.viewPortDiv.appendChild(div);}},addPopup:function(popup,exclusive){if(exclusive){for(var i=0;i<this.popups.length;i++){this.removePopup(this.popups[i]);}}
  popup.map=this;this.popups.push(popup);var popupDiv=popup.draw();if(popupDiv){popupDiv.style.zIndex=this.Z_INDEX_BASE['Popup']+
  this.popups.length;this.layerContainerDiv.appendChild(popupDiv);}},removePopup:function(popup){this.popups.remove(popup);if(popup.div){this.layerContainerDiv.removeChild(popup.div);}
  popup.map=null;},getSize:function(){return this.size;},updateSize:function(){var newSize=this.getCurrentSize();var oldSize=this.getSize();if(oldSize==null)
  this.size=oldSize=newSize;if(!newSize.equals(oldSize)){for(var i=0;i<this.layers.length;i++){this.layers[i].onMapResize();}
  var center=new OpenLayers.Pixel(newSize.w/2,newSize.h/2);var zoom=this.getZoom();this.zoom=null;this.setCenter(center,zoom);this.size=newSize;this.events.element.offsets=null;}},getCurrentSize:function(){var size=new OpenLayers.Size(this.div.clientWidth,this.div.clientHeight);if(size.w==0&&size.h==0){var dim=Element.getDimensions(this.div);size.w=dim.width;size.h=dim.height;}
  if(size.w==0&&size.h==0){size.w=parseInt(this.div.style.width);size.h=parseInt(this.div.style.height);}
  return size;},getCenter:function(){return this.center;},getZoom:function(){return this.zoom;},pan:function(dx,dy){var centerPx=this.getViewPortPxFromLonLat(this.getCenter());var newCenterPx=centerPx.add(dx,dy);if(!newCenterPx.equals(centerPx)){var newCenterLonLat=this.getLonLatFromViewPortPx(newCenterPx);this.setCenter(newCenterLonLat);}},setCenter:function(lonlat,zoom,minor){var zoomChanged=(this.isValidZoomLevel(zoom))&&(zoom!=this.getZoom());var centerChanged=(this.isValidLonLat(lonlat))&&(!lonlat.equals(this.center));if(zoomChanged||centerChanged||!minor){if(!minor){this.events.triggerEvent("movestart");}
  if(centerChanged){if((!zoomChanged)&&(this.center)){this.centerLayerContainer(lonlat);}
  this.center=lonlat.clone();}
  if((zoomChanged)||(this.layerContainerOrigin==null)){this.layerContainerOrigin=this.center.clone();this.layerContainerDiv.style.left="0px";this.layerContainerDiv.style.top="0px";}
  if(zoomChanged){this.zoom=zoom;for(var i=0;i<this.popups.length;i++){this.popups[i].updatePosition();}}
  var bounds=this.getExtent();for(var i=0;i<this.layers.length;i++){var layer=this.layers[i];if((layer==this.baseLayer)||!layer.isBaseLayer){layer.moveTo(bounds,zoomChanged,minor);}}
  this.events.triggerEvent("move");if(zoomChanged){this.events.triggerEvent("zoomend");}}
  if(!minor){this.events.triggerEvent("moveend");}},centerLayerContainer:function(lonlat){var originPx=this.getViewPortPxFromLonLat(this.layerContainerOrigin);var newPx=this.getViewPortPxFromLonLat(lonlat);this.layerContainerDiv.style.left=(originPx.x-newPx.x)+"px";this.layerContainerDiv.style.top=(originPx.y-newPx.y)+"px";},isValidZoomLevel:function(zoomLevel){return((zoomLevel!=null)&&(zoomLevel>=0)&&(zoomLevel<this.getNumZoomLevels()));},isValidLonLat:function(lonlat){var valid=false;if(lonlat!=null){var maxExtent=this.getMaxExtent();valid=maxExtent.contains(lonlat.lon,lonlat.lat);}
  return valid;},getProjection:function(){var projection=null;if(this.baseLayer!=null){projection=this.baseLayer.getProjection();}
  return projection;},getMaxResolution:function(){var maxResolution=null;if(this.baseLayer!=null){maxResolution=this.baseLayer.getMaxResolution();}
  return maxResolution;},getMaxExtent:function(){var maxExtent=null;if(this.baseLayer!=null){maxExtent=this.baseLayer.getMaxExtent();}
  return maxExtent;},getNumZoomLevels:function(){var numZoomLevels=null;if(this.baseLayer!=null){numZoomLevels=this.baseLayer.getNumZoomLevels();}
  return numZoomLevels;},getExtent:function(){var extent=null;if(this.baseLayer!=null){extent=this.baseLayer.getExtent();}
  return extent;},getResolution:function(){var resolution=null;if(this.baseLayer!=null){resolution=this.baseLayer.getResolution();}
  return resolution;},getScale:function(){var scale=null;if(this.baseLayer!=null){var res=this.getResolution();var units=this.baseLayer.units;scale=res*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH;}
  return scale;},getZoomForExtent:function(bounds){zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForExtent(bounds);}
  return zoom;},zoomTo:function(zoom){if(this.isValidZoomLevel(zoom)){this.setCenter(null,zoom);}},zoomIn:function(){this.zoomTo(this.getZoom()+1);},zoomOut:function(){this.zoomTo(this.getZoom()-1);},zoomToExtent:function(bounds){this.setCenter(bounds.getCenterLonLat(),this.getZoomForExtent(bounds));},zoomToMaxExtent:function(){this.zoomToExtent(this.getMaxExtent());},zoomToScale:function(scale){var res=OpenLayers.Util.getResolutionFromScale(scale,this.baseLayer.units);var size=this.getSize();var w_deg=size.w*res;var h_deg=size.h*res;var center=this.getCenter();var extent=new OpenLayers.Bounds(center.lon-w_deg/2,center.lat-h_deg/2,center.lon+w_deg/2,center.lat+h_deg/2);this.zoomToExtent(extent);},getLonLatFromViewPortPx:function(viewPortPx){var lonlat=null;if(this.baseLayer!=null){lonlat=this.baseLayer.getLonLatFromViewPortPx(viewPortPx);}
  return lonlat;},getViewPortPxFromLonLat:function(lonlat){var px=null;if(this.baseLayer!=null){px=this.baseLayer.getViewPortPxFromLonLat(lonlat);}
  return px;},getLonLatFromPixel:function(px){return this.getLonLatFromViewPortPx(px);},getPixelFromLonLat:function(lonlat){return this.getViewPortPxFromLonLat(lonlat);},getViewPortPxFromLayerPx:function(layerPx){var viewPortPx=null;if(layerPx!=null){var dX=parseInt(this.layerContainerDiv.style.left);var dY=parseInt(this.layerContainerDiv.style.top);viewPortPx=layerPx.add(dX,dY);}
  return viewPortPx;},getLayerPxFromViewPortPx:function(viewPortPx){var layerPx=null;if(viewPortPx!=null){var dX=-parseInt(this.layerContainerDiv.style.left);var dY=-parseInt(this.layerContainerDiv.style.top);layerPx=viewPortPx.add(dX,dY);}
  if(!isNaN(layerPx.x)&&!isNaN(layerPx.y)){return layerPx;}
  return null;},getLonLatFromLayerPx:function(px){px=this.getViewPortPxFromLayerPx(px);return this.getLonLatFromViewPortPx(px);},getLayerPxFromLonLat:function(lonlat){var px=this.getViewPortPxFromLonLat(lonlat);return this.getLayerPxFromViewPortPx(px);},CLASS_NAME:"OpenLayers.Map"};OpenLayers.Marker.Box=Class.create();OpenLayers.Marker.Box.prototype=Object.extend(new OpenLayers.Marker(),{bounds:null,div:null,initialize:function(bounds,borderColor,borderWidth){if(arguments.length>0){this.bounds=bounds;this.div=OpenLayers.Util.createDiv();this.events=new OpenLayers.Events(this,this.div,null);this.setBorder(borderColor,borderWidth);}},setBorder:function(color,width){if(!color)color="red";if(!width)width=2;this.div.style.border=width+"px solid "+color;},draw:function(px,sz){OpenLayers.Util.modifyDOMElement(this.div,null,px,sz);return this.div;},onScreen:function(){var onScreen=false;if(this.map){var screenBounds=this.map.getExtent();onScreen=screenBounds.containsBounds(this.bound
 s,true,true);}
  return onScreen;},display:function(display){this.div.style.display=(display)?"":"none";},CLASS_NAME:"OpenLayers.Marker.Box"});OpenLayers.Popup.Anchored=Class.create();OpenLayers.Popup.Anchored.prototype=Object.extend(new OpenLayers.Popup(),{relativePosition:null,anchor:null,initialize:function(id,lonlat,size,contentHTML,anchor){var newArguments=new Array(id,lonlat,size,contentHTML);OpenLayers.Popup.prototype.initialize.apply(this,newArguments);this.anchor=(anchor!=null)?anchor:{size:new OpenLayers.Size(0,0),offset:new OpenLayers.Pixel(0,0)};},draw:function(px){if(px==null){if((this.lonlat!=null)&&(this.map!=null)){px=this.map.getLayerPxFromLonLat(this.lonlat);}}
  this.relativePosition=this.calculateRelativePosition(px);return OpenLayers.Popup.prototype.draw.apply(this,arguments);},calculateRelativePosition:function(px){var lonlat=this.map.getLonLatFromLayerPx(px);var extent=this.map.getExtent();var quadrant=extent.determineQuadrant(lonlat);return OpenLayers.Bounds.oppositeQuadrant(quadrant);},moveTo:function(px){var newPx=this.calculateNewPx(px);var newArguments=new Array(newPx);OpenLayers.Popup.prototype.moveTo.apply(this,newArguments);},setSize:function(size){OpenLayers.Popup.prototype.setSize.apply(this,arguments);if((this.lonlat)&&(this.map)){var px=this.map.getLayerPxFromLonLat(this.lonlat);this.moveTo(px);}},calculateNewPx:function(px){var newPx=px.offset(this.anchor.offset);var top=(this.relativePosition.charAt(0)=='t');newPx.y+=(top)?-this.size.h:this.anchor.size.h;var left=(this.relativePosition.charAt(1)=='l');newPx.x+=(left)?-this.size.w:this.anchor.size.w;return newPx;},CLASS_NAME:"OpenLayers.Popup.Anchored"});OpenLayers
 .Tile.Image=Class.create();OpenLayers.Tile.Image.prototype=Object.extend(new OpenLayers.Tile(),{imgDiv:null,initialize:function(layer,position,bounds,url,size){OpenLayers.Tile.prototype.initialize.apply(this,arguments);},destroy:function(){if((this.imgDiv!=null)&&(this.imgDiv.parentNode==this.layer.div)){this.layer.div.removeChild(this.imgDiv);}
  this.imgDiv=null;OpenLayers.Tile.prototype.destroy.apply(this,arguments);},draw:function(){OpenLayers.Tile.prototype.draw.apply(this,arguments);if(this.imgDiv==null){this.initImgDiv();}
  this.imgDiv.style.display="none";if(this.layer.alpha){OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,null,this.position,this.size,this.url);}else{this.imgDiv.src=this.url;OpenLayers.Util.modifyDOMElement(this.imgDiv,null,this.position,this.size);}},clear:function(){OpenLayers.Tile.prototype.clear.apply(this,arguments);if(this.imgDiv){this.imgDiv.style.display="none";}},moveTo:function(bounds,position,redraw){this.url=this.layer.getURL(bounds);OpenLayers.Tile.prototype.moveTo.apply(this,arguments);},initImgDiv:function(){if(this.layer.alpha){this.imgDiv=OpenLayers.Util.createAlphaImageDiv(null,this.position,this.size,null,"absolute",null,null,true);}else{this.imgDiv=OpenLayers.Util.createImage(null,this.position,this.size,null,"absolute",null,true);}
  this.layer.div.appendChild(this.imgDiv);},CLASS_NAME:"OpenLayers.Tile.Image"});OpenLayers.Tile.WFS=Class.create();OpenLayers.Tile.WFS.prototype=Object.extend(new OpenLayers.Tile(),{features:null,urls:null,initialize:function(layer,position,bounds,urls,size){var newArguments=arguments;if(arguments.length>0){newArguments=[layer,position,bounds,null,size];}
  OpenLayers.Tile.prototype.initialize.apply(this,newArguments);this.urls=urls;this.features=new Array();},destroy:function(){OpenLayers.Tile.prototype.destroy.apply(this,arguments);this.destroyAllFeatures();this.features=null;this.urls=null;},clear:function(){OpenLayers.Tile.prototype.clear.apply(this,arguments);this.destroyAllFeatures();},draw:function(){if(this.drawn){this.clear();}
  OpenLayers.Tile.prototype.draw.apply(this,arguments);this.loadFeaturesForRegion(this.requestSuccess);},loadFeaturesForRegion:function(success,failure){if(this.urls!=null){for(var i=0;i<this.urls.length;i++){var params={BBOX:this.bounds.toBBOX()};var url=this.urls[i]+"&"+
  OpenLayers.Util.getParameterString(params);OpenLayers.loadURL(url,null,this,success,failure);}}},requestSuccess:function(request){var doc=request.responseXML;if(!doc||request.fileType!="XML"){doc=OpenLayers.parseXMLString(request.responseText);}
  var resultFeatures=doc.getElementsByTagName("featureMember");this.addResults(resultFeatures);},addResults:function(results){for(var i=0;i<results.length;i++){var feature=new this.layer.featureClass(this.layer,results[i]);this.features.push(feature);}},destroyAllFeatures:function(){while(this.features.length>0){var feature=this.features.shift();feature.destroy();}},CLASS_NAME:"OpenLayers.Tile.WFS"});OpenLayers.Control.MouseToolbar=Class.create();OpenLayers.Control.MouseToolbar.X=6;OpenLayers.Control.MouseToolbar.Y=300;OpenLayers.Control.MouseToolbar.prototype=Object.extend(new OpenLayers.Control(),Object.extend(new OpenLayers.Control.MouseDefaults(),{mode:null,buttons:null,direction:"vertical",initialize:function(position,direction){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.position=new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,OpenLayers.Control.MouseToolbar.Y);if(position){this.position=position;}
  if(direction){this.direction=direction;}
  this.measureDivs=[];},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);this.buttons=new Object();this.map.events.register("click",this,this.defaultClick);this.map.events.register("dblclick",this,this.defaultDblClick);this.map.events.register("mousedown",this,this.defaultMouseDown);this.map.events.register("mouseup",this,this.defaultMouseUp);this.map.events.register("mousemove",this,this.defaultMouseMove);this.map.events.register("mouseout",this,this.defaultMouseOut);var sz=new OpenLayers.Size(28,28);var centered=this.position;this._addButton("zoombox","drag-rectangle-off.png","drag-rectangle-on.png",centered,sz,"Shift->Drag to zoom to area");centered=centered.add((this.direction=="vertical"?0:sz.w),(this.direction=="vertical"?sz.h:0));this._addButton("pan","panning-hand-off.png","panning-hand-on.png",centered,sz,"Drag the map to pan.");centered=centered.add((this.direction=="vertical"?0:sz.w),(this.direction=="vertical"?sz.h:0));this.switchModeTo("pan
 ");return this.div;},_addButton:function(id,img,activeImg,xy,sz,title){var imgLocation=OpenLayers.Util.getImagesLocation()+img;var activeImgLocation=OpenLayers.Util.getImagesLocation()+activeImg;var btn=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MouseToolbar_"+id,xy,sz,imgLocation,"absolute");this.div.appendChild(btn);btn.imgLocation=imgLocation;btn.activeImgLocation=activeImgLocation;btn.events=new OpenLayers.Events(this,btn);btn.events.register("mousedown",this,this.buttonClick);btn.events.register("mouseup",this,Event.stop);btn.events.register("click",this,Event.stop);btn.action=id;btn.title=title;btn.alt=title;btn.map=this.map;this.buttons[id]=btn;return btn;},buttonClick:function(evt){if(!Event.isLeftClick(evt))return;this.switchModeTo(evt.element.action);Event.stop(evt);},defaultDblClick:function(evt){this.switchModeTo("pan");this.performedDrag=false;var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom+2);Event.
 stop(evt);return false;},defaultMouseDown:function(evt){if(!Event.isLeftClick(evt))return;this.mouseDragStart=evt.xy.clone();this.performedDrag=false;this.startViaKeyboard=false;if(evt.shiftKey&&this.mode!="zoombox"){this.switchModeTo("zoombox");this.startViaKeyboard=true;}else if(evt.altKey&&this.mode!="measure"){this.switchModeTo("measure");}else if(!this.mode){this.switchModeTo("pan");}
  switch(this.mode){case"zoombox":this.map.div.style.cursor="crosshair";this.zoomBox=OpenLayers.Util.createDiv('zoomBox',this.mouseDragStart,null,null,"absolute","2px solid red");this.zoomBox.style.backgroundColor="white";this.zoomBox.style.filter="alpha(opacity=50)";this.zoomBox.style.opacity="0.50";this.zoomBox.style.fontSize="1px";this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.viewPortDiv.appendChild(this.zoomBox);this.performedDrag=true;break;case"measure":var distance="";if(this.measureStart){measureEnd=this.map.getLonLatFromViewPortPx(this.mouseDragStart);distance=OpenLayers.Util.distVincenty(this.measureStart,measureEnd);distance=Math.round(distance*100)/100;distance=distance+"km";this.measureStartBox=this.measureBox;}
  this.measureStart=this.map.getLonLatFromViewPortPx(this.mouseDragStart);;this.measureBox=OpenLayers.Util.createDiv(null,this.mouseDragStart.add(-2-parseInt(this.map.layerContainerDiv.style.left),-2-parseInt(this.map.layerContainerDiv.style.top)),null,null,"absolute");this.measureBox.style.width="4px";this.measureBox.style.height="4px";this.measureBox.style.fontSize="1px";this.measureBox.style.backgroundColor="red";this.measureBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBox);if(distance){this.measureBoxDistance=OpenLayers.Util.createDiv(null,this.mouseDragStart.add(-2-parseInt(this.map.layerContainerDiv.style.left),2-parseInt(this.map.layerContainerDiv.style.top)),null,null,"absolute");this.measureBoxDistance.innerHTML=distance;this.measureBoxDistance.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBoxDistance);this.measureDivs.push(this.measureBoxDistance);}
  this.measureBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBox);this.measureDivs.push(this.measureBox);break;default:this.map.div.style.cursor="move";break;}
  document.onselectstart=function(){return false;}
  Event.stop(evt);},switchModeTo:function(mode){if(mode!=this.mode){if(this.mode&&this.buttons[this.mode]){OpenLayers.Util.modifyAlphaImageDiv(this.buttons[this.mode],null,null,null,this.buttons[this.mode].imgLocation);}
  if(this.mode=="measure"&&mode!="measure"){for(var i=0;i<this.measureDivs.length;i++){if(this.measureDivs[i]){this.map.layerContainerDiv.removeChild(this.measureDivs[i]);}}
  this.measureDivs=[];this.measureStart=null;}
  this.mode=mode;if(this.buttons[mode]){OpenLayers.Util.modifyAlphaImageDiv(this.buttons[mode],null,null,null,this.buttons[mode].activeImgLocation);}}},leaveMode:function(){this.switchModeTo("pan");},defaultMouseMove:function(evt){if(this.mouseDragStart!=null){switch(this.mode){case"zoombox":var deltaX=Math.abs(this.mouseDragStart.x-evt.xy.x);var deltaY=Math.abs(this.mouseDragStart.y-evt.xy.y);this.zoomBox.style.width=Math.max(1,deltaX)+"px";this.zoomBox.style.height=Math.max(1,deltaY)+"px";if(evt.xy.x<this.mouseDragStart.x){this.zoomBox.style.left=evt.xy.x+"px";}
  if(evt.xy.y<this.mouseDragStart.y){this.zoomBox.style.top=evt.xy.y+"px";}
  break;default:var deltaX=this.mouseDragStart.x-evt.xy.x;var deltaY=this.mouseDragStart.y-evt.xy.y;var size=this.map.getSize();var newXY=new OpenLayers.Pixel(size.w/2+deltaX,size.h/2+deltaY);var newCenter=this.map.getLonLatFromViewPortPx(newXY);this.map.setCenter(newCenter,null,true);this.mouseDragStart=evt.xy.clone();}
  this.performedDrag=true;}},defaultMouseUp:function(evt){if(!Event.isLeftClick(evt))return;switch(this.mode){case"zoombox":this.zoomBoxEnd(evt);if(this.startViaKeyboard)this.leaveMode();break;case"pan":if(this.performedDrag){this.map.setCenter(this.map.center);}}
  document.onselectstart=null;this.mouseDragStart=null;this.map.div.style.cursor="default";},defaultMouseOut:function(evt){if(this.mouseDragStart!=null&&OpenLayers.Util.mouseLeft(evt,this.map.div)){this.defaultMouseUp(evt);}},defaultClick:function(evt){if(this.performedDrag){this.performedDrag=false;return false;}}}));OpenLayers.Control.PanZoomBar=Class.create();OpenLayers.Control.PanZoomBar.X=4;OpenLayers.Control.PanZoomBar.Y=4;OpenLayers.Control.PanZoomBar.prototype=Object.extend(new OpenLayers.Control.PanZoom(),{buttons:null,zoomStopWidth:18,zoomStopHeight:11,initialize:function(){OpenLayers.Control.PanZoom.prototype.initialize.apply(this,arguments);this.position=new OpenLayers.Pixel(OpenLayers.Control.PanZoomBar.X,OpenLayers.Control.PanZoomBar.Y);},setMap:function(map){OpenLayers.Control.PanZoom.prototype.setMap.apply(this,arguments);this.map.events.register("changebaselayer",this,this.redraw);},redraw:function(){if(this.div!=null){this.div.innerHTML="";}
  this.draw();},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position.clone();this.buttons=new Array();var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);this._addButton("panright","east-mini.png",px.add(sz.w,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);centered=this._addZoomBar(centered.add(0,sz.h*4+5));this._addButton("zoomout","zoom-minus-mini.png",centered,sz);return this.div;},_addZoomBar:function(centered){var imgLocation=OpenLayers.Util.getImagesLocation();var id="OpenLayers_Control_PanZoomBar_Slider"+this.map.id;var zoomsToEnd=this.map.getNumZoomLevels()-1-this.map.getZoom();var slider=OpenLayers.Util.createAlphaImageDiv(id,centered.add(-1,zoomsToEnd*this.zoomStopHeight)
 ,new OpenLayers.Size(20,9),imgLocation+"slider.png","absolute");this.slider=slider;this.sliderEvents=new OpenLayers.Events(this,slider);this.sliderEvents.register("mousedown",this,this.zoomBarDown);this.sliderEvents.register("mousemove",this,this.zoomBarDrag);this.sliderEvents.register("mouseup",this,this.zoomBarUp);this.sliderEvents.register("dblclick",this,this.doubleClick);this.sliderEvents.register("click",this,this.doubleClick);sz=new OpenLayers.Size();sz.h=this.zoomStopHeight*this.map.getNumZoomLevels();sz.w=this.zoomStopWidth;var div=null
  if(OpenLayers.Util.alphaHack()){var id="OpenLayers_Control_PanZoomBar"+this.map.id;div=OpenLayers.Util.createAlphaImageDiv(id,centered,new OpenLayers.Size(sz.w,this.zoomStopHeight),imgLocation+"zoombar.png","absolute",null,"crop");div.style.height=sz.h;}else{div=OpenLayers.Util.createDiv('OpenLayers_Control_PanZoomBar_Zoombar'+this.map.id,centered,sz,imgLocation+"zoombar.png");}
  this.zoombarDiv=div;this.divEvents=new OpenLayers.Events(this,div);this.divEvents.register("mousedown",this,this.divClick);this.divEvents.register("mousemove",this,this.passEventToSlider);this.divEvents.register("dblclick",this,this.doubleClick);this.divEvents.register("click",this,this.doubleClick);this.div.appendChild(div);this.startTop=parseInt(div.style.top);this.div.appendChild(slider);this.map.events.register("zoomend",this,this.moveZoomBar);centered=centered.add(0,this.zoomStopHeight*this.map.getNumZoomLevels());return centered;},passEventToSlider:function(evt){this.sliderEvents.handleBrowserEvent(evt);},divClick:function(evt){if(!Event.isLeftClick(evt))return;var y=evt.xy.y;var top=Position.page(evt.object)[1];var levels=Math.floor((y-top)/this.zoomStopHeight);this.map.zoomTo((this.map.getNumZoomLevels()-1)-levels);Event.stop(evt);},zoomBarDown:function(evt){if(!Event.isLeftClick(evt))return;this.map.events.register("mousemove",this,this.passEventToSlider);this.map.
 events.register("mouseup",this,this.passEventToSlider);this.mouseDragStart=evt.xy.clone();this.zoomStart=evt.xy.clone();this.div.style.cursor="move";Event.stop(evt);},zoomBarDrag:function(evt){if(this.mouseDragStart!=null){var deltaY=this.mouseDragStart.y-evt.xy.y
  var offsets=Position.page(this.zoombarDiv);if((evt.clientY-offsets[1])>0&&(evt.clientY-offsets[1])<parseInt(this.zoombarDiv.style.height)-2){var newTop=parseInt(this.slider.style.top)-deltaY;this.slider.style.top=newTop+"px";}
  this.mouseDragStart=evt.xy.clone();Event.stop(evt);}},zoomBarUp:function(evt){if(!Event.isLeftClick(evt))return;if(this.zoomStart){this.div.style.cursor="default";this.map.events.unregister("mouseup",this,this.passEventToSlider);this.map.events.unregister("mousemove",this,this.passEventToSlider);var deltaY=this.zoomStart.y-evt.xy.y
  this.map.zoomTo(this.map.zoom+Math.round(deltaY/this.zoomStopHeight));this.moveZoomBar();this.mouseDragStart=null;Event.stop(evt);}},moveZoomBar:function(){var newTop=((this.map.getNumZoomLevels()-1)-this.map.getZoom())*this.zoomStopHeight+this.startTop+1;this.slider.style.top=newTop+"px";},CLASS_NAME:"OpenLayers.Control.PanZoomBar"});OpenLayers.Feature.WFS=Class.create();OpenLayers.Feature.WFS.prototype=Object.extend(new OpenLayers.Feature(),{initialize:function(layer,xmlNode){var newArguments=arguments;if(arguments.length>0){var data=this.processXMLNode(xmlNode);newArguments=new Array(layer,data.lonlat,data)}
  OpenLayers.Feature.prototype.initialize.apply(this,newArguments);if(arguments.length>0){this.createMarker();this.layer.addMarker(this.marker);}},destroy:function(){if(this.marker!=null){this.layer.removeMarker(this.marker);}
  OpenLayers.Feature.prototype.destroy.apply(this,arguments);},processXMLNode:function(xmlNode){var point=xmlNode.getElementsByTagName("Point");var text=OpenLayers.Util.getXmlNodeValue(point[0].getElementsByTagName("coordinates")[0]);var floats=text.split(",");return{lonlat:new OpenLayers.LonLat(parseFloat(floats[0]),parseFloat(floats[1])),id:null};},CLASS_NAME:"OpenLayers.Feature.WFS"});OpenLayers.Layer.Boxes=Class.create();OpenLayers.Layer.Boxes.prototype=Object.extend(new OpenLayers.Layer.Markers(),{initialize:function(){OpenLayers.Layer.Markers.prototype.initialize.apply(this,arguments);},drawMarker:function(marker){var bounds=marker.bounds;var topleft=this.map.getLayerPxFromLonLat(new OpenLayers.LonLat(bounds.left,bounds.top));var botright=this.map.getLayerPxFromLonLat(new OpenLayers.LonLat(bounds.right,bounds.bottom));if(botright==null||topleft==null){marker.display(false);}else{var sz=new OpenLayers.Size(botright.x-topleft.x,botright.y-topleft.y);var markerDiv=marker.d
 raw(topleft,sz);if(!marker.drawn){this.div.appendChild(markerDiv);marker.drawn=true;}}},CLASS_NAME:"OpenLayers.Layer.Boxes"});OpenLayers.Layer.GeoRSS=Class.create();OpenLayers.Layer.GeoRSS.prototype=Object.extend(new OpenLayers.Layer.Markers(),{location:null,features:null,selectedFeature:null,initialize:function(name,location){OpenLayers.Layer.Markers.prototype.initialize.apply(this,[name]);this.location=location;this.features=new Array();OpenLayers.loadURL(location,null,this,this.parseData);},destroy:function(){this.clearFeatures();this.features=null;OpenLayers.Layer.Markers.prototype.destroy.apply(this,arguments);},parseData:function(ajaxRequest){var doc=ajaxRequest.responseXML;if(!doc||ajaxRequest.fileType!="XML"){doc=OpenLayers.parseXMLString(ajaxRequest.responseText);}
  this.name=doc.getElementsByTagName("title")[0].firstChild.nodeValue;var itemlist=doc.getElementsByTagName('item');for(var i=0;i<itemlist.length;i++){var data={};var point=OpenLayers.Util.getNodes(itemlist[i],'georss:point');var lat=OpenLayers.Util.getNodes(itemlist[i],'geo:lat');var lon=OpenLayers.Util.getNodes(itemlist[i],'geo:long');if(point.length>0){var location=point[0].firstChild.nodeValue.split(" ");if(location.length!=2){var location=point[0].firstChild.nodeValue.split(",");}}else if(lat.length>0&&lon.length>0){var location=[parseFloat(lat[0].firstChild.nodeValue),parseFloat(lon[0].firstChild.nodeValue)];}else{continue;}
  location=new OpenLayers.LonLat(parseFloat(location[1]),parseFloat(location[0]));var title=OpenLayers.Util.getNodes(itemlist[i],"title")[0].firstChild.nodeValue;var description=OpenLayers.Util.getNodes(itemlist[i],"description")[0].firstChild.nodeValue;try{var link=OpenLayers.Util.getNodes(itemlist[i],"link")[0].firstChild.nodeValue;}catch(e){}
  data.icon=OpenLayers.Marker.defaultIcon();data.popupSize=new OpenLayers.Size(250,100);if((title!=null)&&(description!=null)){contentHTML="<br />";contentHTML+="<div style='margin: -0.5em 0.5em 0.5em 0.5em'>"
  contentHTML+="<div style='height: 1.3em; overflow: hidden'>";contentHTML+="<span style='font-size: 1.2em; font-weight: bold'>";if(link)contentHTML+="<a href='"+link+"' target='_blank'>";contentHTML+=title;if(link)contentHTML+="</a>";contentHTML+="</span>";contentHTML+="</div>";contentHTML+="<span style='font-size: 0.7em; align:center'>";contentHTML+=description;contentHTML+="</span>";contentHTML+="</div>"
  data['popupContentHTML']=contentHTML;}
  var feature=new OpenLayers.Feature(this,location,data);this.features.push(feature);var marker=feature.createMarker();marker.events.register('click',feature,this.markerClick);this.addMarker(marker);}},markerClick:function(evt){sameMarkerClicked=(this==this.layer.selectedFeature);this.layer.selectedFeature=(!sameMarkerClicked)?this:null;for(var i=0;i<this.layer.map.popups.length;i++){this.layer.map.removePopup(this.layer.map.popups[i]);}
  if(!sameMarkerClicked){var popup=this.createPopup();Event.observe(popup.div,"click",function(){for(var i=0;i<this.layer.map.popups.length;i++){this.layer.map.removePopup(this.layer.map.popups[i]);}}.bindAsEventListener(this));this.layer.map.addPopup(popup);}
  Event.stop(evt);},clearFeatures:function(){if(this.features!=null){while(this.features.length>0){var feature=this.features[0];this.features.remove(feature);feature.destroy();}}},CLASS_NAME:"OpenLayers.Layer.GeoRSS"});OpenLayers.Layer.Google=Class.create();OpenLayers.Layer.Google.prototype=Object.extend(new OpenLayers.Layer.EventPane(),{isFixed:true,gmap:null,type:null,minZoomLevel:0,maxZoomLevel:16,initialize:function(name,options){OpenLayers.Layer.EventPane.prototype.initialize.apply(this,arguments);if(this.maxExtent==null){this.maxExtent=new OpenLayers.Bounds(-180,-90,180,90);}
  this.addContainerPxFunction();this.numZoomLevels=this.maxZoomLevel-this.minZoomLevel+1;},destroy:function(){this.gmap=null;OpenLayers.Layer.EventPane.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Layer.EventPane.prototype.setMap.apply(this,arguments);this.loadGMap();},moveTo:function(bounds,zoomChanged,minor){if((this.gmap!=null)&&(!this.dragging)){var newOLCenter=this.map.getCenter();var newOLZoom=this.map.getZoom();if(newOLCenter!=null){var oldGCenter=this.gmap.getCenter();var oldOLCenter=this.getOLLonLatFromGLatLng(oldGCenter);var oldGZoom=this.gmap.getZoom();var oldOLZoom=this.getOLZoomFromGZoom(oldGZoom);if(!(newOLCenter.equals(oldOLCenter))||!(newOLZoom==oldOLZoom)){var newGCenter=this.getGLatLngFromOLLonLat(newOLCenter);var newGZoom=this.getGZoomFromOLZoom(newOLZoom);this.gmap.setCenter(newGCenter,newGZoom);if(this.type!=null){this.gmap.setMapType(this.type);this.type=null;}}}}},loadGMap:function(){try{this.gmap=new GMap2(this.div);this.gm
 ap.disableDragging();this.moveTo();}catch(e){this.loadWarningMessage();}},onMapResize:function(){this.gmap.checkResize();},loadWarningMessage:function(){this.div.style.backgroundColor="darkblue";var html="";html+="The Google Layer was unable to load correctly.<br>";html+="<br>";html+="To get rid of this message, click on the Google Layer's "
  html+="tab in the layer switcher in the upper-right corner.<br>";html+="<br>";html+="Most likely, this is because the Google Maps library";html+=" script was either not included, or does not contain the";html+=" correct API key for your site.<br>";html+="<br>";html+="Developers: For help getting this working correctly, ";html+="<a href='http://trac.openlayers.org/wiki/GoogleMapsLayer' "
  html+="target='_blank'>";html+="click here";html+="</a>";var viewSize=this.map.getSize();msgW=Math.min(viewSize.w,300);msgH=Math.min(viewSize.h,200);var size=new OpenLayers.Size(msgW,msgH);var centerPx=new OpenLayers.Pixel(viewSize.w/2,viewSize.h/2);var topLeft=centerPx.add(-size.w/2,-size.h/2);var div=OpenLayers.Util.createDiv("gmapsWarning",topLeft,size,null,null,null,"auto");div.style.padding="7px";div.style.backgroundColor="yellow";div.innerHTML=html;this.div.appendChild(div);},getLonLatFromViewPortPx:function(viewPortPx){var lonlat=null;if((this.gmap!=null)&&(this.gmap.getCenter()!=null)){var gPoint=this.getGPointFromOLPixel(viewPortPx);var gLatLng=this.gmap.fromContainerPixelToLatLng(gPoint)
  lonlat=this.getOLLonLatFromGLatLng(gLatLng);}
  return lonlat;},getViewPortPxFromLonLat:function(lonlat){var viewPortPx=null;if((this.gmap!=null)&&(this.gmap.getCenter()!=null)){var gLatLng=this.getGLatLngFromOLLonLat(lonlat);var gPoint=this.gmap.fromLatLngToContainerPixel(gLatLng);viewPortPx=this.getOLPixelFromGPoint(gPoint);}
  return viewPortPx;},getZoomForExtent:function(bounds){var zoom=null;if((this.gmap!=null)&&(this.gmap.getCenter()!=null)){var gBounds=this.getGLatLngBoundsFromOLBounds(bounds);var gZoom=this.gmap.getBoundsZoomLevel(gBounds);var gZoom=Math.min(Math.max(gZoom,this.minZoomLevel),this.maxZoomLevel);zoom=this.getOLZoomFromGZoom(gZoom);}
  return zoom;},getOLZoomFromGZoom:function(gZoom){var zoom=null;if(gZoom!=null){zoom=gZoom-this.minZoomLevel;}
  return zoom;},getGZoomFromOLZoom:function(olZoom){var zoom=null;if(olZoom!=null){zoom=olZoom+this.minZoomLevel;}
  return zoom;},getOLLonLatFromGLatLng:function(gLatLng){var olLonLat=null;if(gLatLng!=null){olLonLat=new OpenLayers.LonLat(gLatLng.lng(),gLatLng.lat());}
  return olLonLat;},getGLatLngFromOLLonLat:function(olLonLat){var gLatLng=null;if(olLonLat!=null){gLatLng=new GLatLng(olLonLat.lat,olLonLat.lon);}
  return gLatLng;},getOLPixelFromGPoint:function(gPoint){var olPixel=null;if(gPoint!=null){olPixel=new OpenLayers.Pixel(gPoint.x,gPoint.y);}
  return olPixel;},getGPointFromOLPixel:function(olPixel){var gPoint=null;if(olPixel!=null){gPoint=new GPoint(olPixel.x,olPixel.y);}
  return gPoint;},getOLBoundsFromGLatLngBounds:function(gLatLngBounds){var olBounds=null;if(gLatLngBounds!=null){var sw=gLatLngBounds.getSouthWest();var ne=gLatLngBounds.getNorthEast();olBounds=new OpenLayers.Bounds(sw.lng(),sw.lat(),ne.lng(),ne.lat());}
  return olBounds;},getGLatLngBoundsFromOLBounds:function(olBounds){var gLatLngBounds=null;if(olBounds!=null){var sw=new GLatLng(olBounds.bottom,olBounds.left);var ne=new GLatLng(olBounds.top,olBounds.right);gLatLngBounds=new GLatLngBounds(sw,ne);}
  return gLatLngBounds;},addContainerPxFunction:function(){if(typeof GMap2!="undefined"&&!GMap2.fromLatLngToContainerPixel){GMap2.prototype.fromLatLngToContainerPixel=function(gLatLng){var gPoint=this.fromLatLngToDivPixel(gLatLng);var div=this.b.firstChild.firstChild;gPoint.x+=div.offsetLeft;gPoint.y+=div.offsetTop;return gPoint;};}},CLASS_NAME:"OpenLayers.Layer.Google"});OpenLayers.Layer.Grid=Class.create();OpenLayers.Layer.Grid.prototype=Object.extend(new OpenLayers.Layer.HTTPRequest(),{tileSize:null,grid:null,buffer:2,initialize:function(name,url,params,options){OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this,arguments);this.grid=new Array();},destroy:function(){this.clearGrid();this.grid=null;this.tileSize=null;OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.Grid(this.name,this.url,this.params,this.options);}
  obj=OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this,[obj]);if(this.tileSize!=null){obj.tileSize=this.tileSize.clone();}
  obj.grid=null;return obj;},setMap:function(map){OpenLayers.Layer.HTTPRequest.prototype.setMap.apply(this,arguments);if(this.tileSize==null){this.tileSize=this.map.getTileSize();}},moveTo:function(bounds,zoomChanged,dragging){if(bounds==null){bounds=this.map.getExtent();}
  if(bounds!=null){if(!this.grid.length||zoomChanged||!this.getGridBounds().containsBounds(bounds,true)){this._initTiles();}else{while(true){var tlLayer=this.grid[0][0].position;var tlViewPort=this.map.getViewPortPxFromLayerPx(tlLayer);if(tlViewPort.x>-this.tileSize.w*(this.buffer-1)){this.shiftColumn(true);}else if(tlViewPort.x<-this.tileSize.w*this.buffer){this.shiftColumn(false);}else if(tlViewPort.y>-this.tileSize.h*(this.buffer-1)){this.shiftRow(true);}else if(tlViewPort.y<-this.tileSize.h*this.buffer){this.shiftRow(false);}else{break;}}}}},getGridBounds:function(){var bottom=this.grid.length-1;var bottomLeftTile=this.grid[bottom][0];var right=this.grid[0].length-1;var topRightTile=this.grid[0][right];return new OpenLayers.Bounds(bottomLeftTile.bounds.left,bottomLeftTile.bounds.bottom,topRightTile.bounds.right,topRightTile.bounds.top);},_initTiles:function(){var viewSize=this.map.getSize();var bounds=this.map.getExtent();var extent=this.map.getMaxExtent();var resolution=
 this.map.getResolution();var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left-extent.left;var tilecol=Math.floor(offsetlon/tilelon)-this.buffer;var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=extent.left+tilecol*tilelon;var offsetlat=bounds.top-(extent.bottom+tilelat);var tilerow=Math.ceil(offsetlat/tilelat)+this.buffer;var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=-tilerowremain*this.tileSize.h;var tileoffsetlat=extent.bottom+tilerow*tilelat;tileoffsetx=Math.round(tileoffsetx);tileoffsety=Math.round(tileoffsety);this.origin=new OpenLayers.Pixel(tileoffsetx,tileoffsety);var startX=tileoffsetx;var startLon=tileoffsetlon;var rowidx=0;do{var row=this.grid[rowidx++];if(!row){row=new Array();this.grid.push(row);}
  tileoffsetlon=startLon;tileoffsetx=startX;var colidx=0;do{var tileBounds=new OpenLayers.Bounds(tileoffsetlon,tileoffsetlat,tileoffsetlon+tilelon,tileoffsetlat+tilelat);var x=tileoffsetx;x-=parseInt(this.map.layerContainerDiv.style.left);var y=tileoffsety;y-=parseInt(this.map.layerContainerDiv.style.top);var px=new OpenLayers.Pixel(x,y);var tile=row[colidx++];if(!tile){tile=this.addTile(tileBounds,px);row.push(tile);}else{tile.moveTo(tileBounds,px,false);}
  tileoffsetlon+=tilelon;tileoffsetx+=this.tileSize.w;}while(tileoffsetlon<=bounds.right+tilelon*this.buffer)
  tileoffsetlat-=tilelat;tileoffsety+=this.tileSize.h;}while(tileoffsetlat>=bounds.bottom-tilelat*this.buffer)
  this.spiralTileLoad();},spiralTileLoad:function(){var tileQueue=new Array();var directions=["right","down","left","up"];var iRow=0;var iCell=-1;var direction=directions.indexOf("right");var directionsTried=0;while(directionsTried<directions.length){var testRow=iRow;var testCell=iCell;switch(directions[direction]){case"right":testCell++;break;case"down":testRow++;break;case"left":testCell--;break;case"up":testRow--;break;}
  var tile=null;if((testRow<this.grid.length)&&(testCell<this.grid[0].length)){tile=this.grid[testRow][testCell];}
  if((tile!=null)&&(!tile.queued)){tileQueue.unshift(tile);tile.queued=true;directionsTried=0;iRow=testRow;iCell=testCell;}else{direction=(direction+1)%4;directionsTried++;}}
  for(var i=0;i<tileQueue.length;i++){var tile=tileQueue[i]
  tile.draw();tile.queued=false;}},addTile:function(bounds,position){},clearGrid:function(){if(this.grid){for(var iRow=0;iRow<this.grid.length;iRow++){var row=this.grid[iRow];for(var iCol=0;iCol<row.length;iCol++){row[iCol].clear();}}}},shiftRow:function(prepend){var modelRowIndex=(prepend)?0:(this.grid.length-1);var modelRow=this.grid[modelRowIndex];var resolution=this.map.getResolution();var deltaY=(prepend)?-this.tileSize.h:this.tileSize.h;var deltaLat=resolution*-deltaY;var row=(prepend)?this.grid.pop():this.grid.shift();for(var i=0;i<modelRow.length;i++){var modelTile=modelRow[i];var bounds=modelTile.bounds.clone();var position=modelTile.position.clone();bounds.bottom=bounds.bottom+deltaLat;bounds.top=bounds.top+deltaLat;position.y=position.y+deltaY;row[i].moveTo(bounds,position);}
  if(prepend){this.grid.unshift(row);}else{this.grid.push(row);}},shiftColumn:function(prepend){var deltaX=(prepend)?-this.tileSize.w:this.tileSize.w;var resolution=this.map.getResolution();var deltaLon=resolution*deltaX;for(var i=0;i<this.grid.length;i++){var row=this.grid[i];var modelTileIndex=(prepend)?0:(row.length-1);var modelTile=row[modelTileIndex];var bounds=modelTile.bounds.clone();var position=modelTile.position.clone();bounds.left=bounds.left+deltaLon;bounds.right=bounds.right+deltaLon;position.x=position.x+deltaX;var tile=prepend?this.grid[i].pop():this.grid[i].shift()
  tile.moveTo(bounds,position);if(prepend){this.grid[i].unshift(tile);}else{this.grid[i].push(tile);}}},getExtent:function(){var extent=null;var center=this.map.getCenter();if(center!=null){var res=this.map.getResolution();var size=this.map.getSize();var w_deg=size.w*res;var h_deg=size.h*res;extent=new OpenLayers.Bounds(center.lon-w_deg/2,center.lat-h_deg/2,center.lon+w_deg/2,center.lat+h_deg/2);}
  return extent;},getZoomForExtent:function(bounds){var maxRes=this.map.getMaxResolution();var viewSize=this.map.getSize();var width=bounds.getWidth();var height=bounds.getHeight();var degPerPixel=(width>height)?width/viewSize.w:height/viewSize.h;var zoom=Math.floor((Math.log(maxRes/degPerPixel))/Math.log(2));zoom=Math.min(Math.max(zoom,0),this.getNumZoomLevels()-1);return zoom;},CLASS_NAME:"OpenLayers.Layer.Grid"});OpenLayers.Layer.Text=Class.create();OpenLayers.Layer.Text.prototype=Object.extend(new OpenLayers.Layer.Markers(),{location:null,features:null,selectedFeature:null,initialize:function(name,options){OpenLayers.Layer.Markers.prototype.initialize.apply(this,arguments);this.features=new Array();if(this.location!=null){OpenLayers.loadURL(this.location,null,this,this.parseData);}},destroy:function(){this.clearFeatures();this.features=null;OpenLayers.Layer.Markers.prototype.destroy.apply(this,arguments);},parseData:function(ajaxRequest){var text=ajaxRequest.responseText;
 var lines=text.split('\n');var columns;for(var lcv=0;lcv<(lines.length-1);lcv++){var currLine=lines[lcv].replace(/^\s*/,'').replace(/\s*$/,'');if(currLine.charAt(0)!='#'){if(!columns){columns=currLine.split('\t');}else{var vals=currLine.split('\t');var location=new OpenLayers.LonLat(0,0);var title;var url;var icon,iconSize,iconOffset;var set=false;for(var valIndex=0;valIndex<vals.length;valIndex++){if(vals[valIndex]){if(columns[valIndex]=='point'){var coords=vals[valIndex].split(',');location.lat=parseFloat(coords[0]);location.lon=parseFloat(coords[1]);set=true;}else if(columns[valIndex]=='lat'){location.lat=parseFloat(vals[valIndex]);set=true;}else if(columns[valIndex]=='lon'){location.lon=parseFloat(vals[valIndex]);set=true;}else if(columns[valIndex]=='title')
  title=vals[valIndex];else if(columns[valIndex]=='image'||columns[valIndex]=='icon')
  url=vals[valIndex];else if(columns[valIndex]=='iconSize'){var size=vals[valIndex].split(',');iconSize=new OpenLayers.Size(parseFloat(size[0]),parseFloat(size[1]));}else if(columns[valIndex]=='iconOffset'){var offset=vals[valIndex].split(',');iconOffset=new OpenLayers.Pixel(parseFloat(offset[0]),parseFloat(offset[1]));}else if(columns[valIndex]=='title'){title=vals[valIndex];}else if(columns[valIndex]=='description'){description=vals[valIndex];}}}
  if(set){var data=new Object();if(url!=null){data.icon=new OpenLayers.Icon(url,iconSize,iconOffset);}else{data.icon=OpenLayers.Marker.defaultIcon();if(iconSize!=null){data.icon.setSize(iconSize);}}
  if((title!=null)&&(description!=null)){data['popupContentHTML']='<h2>'+title+'</h2><p>'+description+'</p>';}
  var feature=new OpenLayers.Feature(this,location,data);this.features.push(feature);var marker=feature.createMarker();marker.events.register('click',feature,this.markerClick);this.addMarker(marker);}}}}},markerClick:function(evt){sameMarkerClicked=(this==this.layer.selectedFeature);this.layer.selectedFeature=(!sameMarkerClicked)?this:null;for(var i=0;i<this.layer.map.popups.length;i++){this.layer.map.removePopup(this.layer.map.popups[i]);}
  if(!sameMarkerClicked){this.layer.map.addPopup(this.createPopup());}
  Event.stop(evt);},clearFeatures:function(){if(this.features!=null){while(this.features.length>0){var feature=this.features[0];this.features.remove(feature);feature.destroy();}}},CLASS_NAME:"OpenLayers.Text"});OpenLayers.Layer.VirtualEarth=Class.create();OpenLayers.Layer.VirtualEarth.prototype=Object.extend(new OpenLayers.Layer.EventPane(),{vemap:null,minZoomLevel:1,maxZoomLevel:17,initialize:function(name){OpenLayers.Layer.EventPane.prototype.initialize.apply(this,arguments);this.numZoomLevels=this.maxZoomLevel-this.minZoomLevel+1;},setMap:function(map){OpenLayers.Layer.EventPane.prototype.setMap.apply(this,arguments);this.loadVEMap();},moveTo:function(bounds,zoomChanged,minor){if(this.vemap!=null){var olCenter=this.map.getCenter();var veCenter=this.getVELatLongFromOLLonLat(olCenter);if(zoomChanged){var olZoom=this.map.getZoom();var veZoom=this.getVEZoomFromOLZoom(olZoom);this.vemap.SetCenterAndZoom(veCenter,veZoom);}else{this.vemap.PanToLatLong(veCenter);}}},loadVEMap:func
 tion(){var veDiv=OpenLayers.Util.createDiv(this.name);var sz=this.map.getSize();veDiv.style.width=sz.w;veDiv.style.height=sz.h;this.div.appendChild(veDiv);try{this.vemap=new VEMap(this.name);}catch(e){}
  if(this.vemap==null){this.loadWarningMessage();}else{try{this.vemap.LoadMap();}catch(e){}
  this.vemap.HideDashboard();}},loadWarningMessage:function(){this.div.style.backgroundColor="darkblue";var html="";html+="The VE Layer was unable to load correctly.<br>";html+="<br>";html+="To get rid of this message, click on the VE Layer's "
  html+="tab in the layer switcher in the upper-right corner.<br>";html+="<br>";html+="Most likely, this is because the VE library";html+=" script was either not correctly included.<br>";html+="<br>";html+="Developers: For help getting this working correctly, ";html+="<a href='http://trac.openlayers.org/wiki/VirtualEarthLayer' "
  html+="target='_blank'>";html+="click here";html+="</a>";var viewSize=this.map.getSize();msgW=Math.min(viewSize.w,300);msgH=Math.min(viewSize.h,200);var size=new OpenLayers.Size(msgW,msgH);var centerPx=new OpenLayers.Pixel(viewSize.w/2,viewSize.h/2);var topLeft=centerPx.add(-size.w/2,-size.h/2);var div=OpenLayers.Util.createDiv("veWarning",topLeft,size,null,null,null,"auto");div.style.padding="7px";div.style.backgroundColor="yellow";div.innerHTML=html;this.div.appendChild(div);},getLonLatFromViewPortPx:function(viewPortPx){var lonlat=null;if(this.vemap!=null){var pixel=this.getPixelFromOLPixel(viewPortPx);var zoom=this.vemap.GetZoomLevel();var veLatLong=this.vemap.PixelToLatLong(pixel.x,pixel.y,zoom);lonlat=this.getOLLonLatFromVELatLong(veLatLong);}
  return lonlat;},getViewPortPxFromLonLat:function(lonlat){var viewPortPx=null;if(this.vemap!=null){var veLatLong=this.getVELatLongFromOLLonLat(lonlat);var pixel=this.vemap.LatLongToPixel(veLatLong);viewPortPx=this.getOLPixelFromPixel(pixel);}
  return viewPortPx;},getZoomForExtent:function(bounds){var zoom=null;if(this.vemap!=null){var maxRes=this.map.getMaxResolution();var viewSize=this.map.getSize();var width=bounds.getWidth();var height=bounds.getHeight();var degPerPixel=(width>height)?width/viewSize.w:height/viewSize.h;var veZoom=Math.floor((Math.log(maxRes/degPerPixel))/Math.log(2));var veZoom=Math.min(Math.max(veZoom,this.minZoomLevel),this.maxZoomLevel);zoom=this.getOLZoomFromVEZoom(veZoom);}
  return zoom;},getOLZoomFromVEZoom:function(veZoom){var zoom=null;if(veZoom!=null){zoom=veZoom-this.minZoomLevel;}
  return zoom;},getVEZoomFromOLZoom:function(olZoom){var zoom=null;if(olZoom!=null){zoom=olZoom+this.minZoomLevel;}
  return zoom;},getOLLonLatFromVELatLong:function(veLatLong){var olLonLat=null;if(veLatLong!=null){olLonLat=new OpenLayers.LonLat(veLatLong.Longitude,veLatLong.Latitude);}
  return olLonLat;},getVELatLongFromOLLonLat:function(olLonLat){var veLatLong=null;if(olLonLat!=null){veLatLong=new VELatLong(olLonLat.lat,olLonLat.lon);}
  return veLatLong;},getOLPixelFromPixel:function(pixel){var olPixel=null;if(pixel!=null){olPixel=new OpenLayers.Pixel(pixel.x,pixel.y);}
  return olPixel;},getPixelFromOLPixel:function(olPixel){var pixel=null;if(olPixel!=null){pixel=new Msn.VE.Pixel(olPixel.x,olPixel.y);}
  return pixel;},CLASS_NAME:"OpenLayers.Layer.VirtualEarth"});OpenLayers.Popup.AnchoredBubble=Class.create();OpenLayers.Popup.AnchoredBubble.CORNER_SIZE=5;OpenLayers.Popup.AnchoredBubble.prototype=Object.extend(new OpenLayers.Popup.Anchored(),{contentDiv:null,initialize:function(id,lonlat,size,contentHTML,anchor){OpenLayers.Popup.Anchored.prototype.initialize.apply(this,arguments);},draw:function(px){OpenLayers.Popup.Anchored.prototype.draw.apply(this,arguments);var contentSize=this.size.clone();contentSize.h-=(2*OpenLayers.Popup.AnchoredBubble.CORNER_SIZE);var id=this.div.id+"-contentDiv";this.contentDiv=OpenLayers.Util.createDiv(id,null,contentSize,null,"relative",null,"hidden");this.div.appendChild(this.contentDiv);this.setContentHTML();this.setRicoCorners(true);this.setBackgroundColor();this.setOpacity();return this.div;},setSize:function(size){OpenLayers.Popup.Anchored.prototype.setSize.apply(this,arguments);if(this.contentDiv!=null){var contentSize=this.size.clone();con
 tentSize.h-=(2*OpenLayers.Popup.AnchoredBubble.CORNER_SIZE);this.contentDiv.style.height=contentSize.h+"px";this.setRicoCorners(false);}},setBackgroundColor:function(color){if(color!=undefined){this.backgroundColor=color;}
  if(this.div!=null){if(this.contentDiv!=null){this.div.style.background="transparent";Rico.Corner.changeColor(this.contentDiv,this.backgroundColor);}}},setOpacity:function(opacity){if(opacity!=undefined){this.opacity=opacity;}
  if(this.div!=null){if(this.contentDiv!=null){Rico.Corner.changeOpacity(this.contentDiv,this.opacity);}}},setBorder:function(border){this.border=0;},setContentHTML:function(contentHTML){if(contentHTML!=null){this.contentHTML=contentHTML;}
  if(this.contentDiv!=null){this.contentDiv.innerHTML=this.contentHTML;}},setRicoCorners:function(firstTime){var corners=this.getCornersToRound(this.relativePosition);var options={corners:corners,color:this.backgroundColor,bgColor:"transparent",blend:false};if(firstTime){Rico.Corner.round(this.div,options);}else{Rico.Corner.reRound(this.contentDiv,options);this.setBackgroundColor();this.setOpacity();}},getCornersToRound:function(){var corners=['tl','tr','bl','br'];var corner=OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);corners.remove(corner);return corners.join(" ");},CLASS_NAME:"OpenLayers.Popup.AnchoredBubble"});OpenLayers.Layer.KaMap=Class.create();OpenLayers.Layer.KaMap.prototype=Object.extend(new OpenLayers.Layer.Grid(),{isBaseLayer:true,units:null,resolution:OpenLayers.DOTS_PER_INCH,DEFAULT_PARAMS:{i:'jpeg',map:''},initialize:function(name,url,params,options){var newArguments=new Array();newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.proto
 type.initialize.apply(this,newArguments);this.params=(params?params:{});if(arguments.length>0&&params){OpenLayers.Util.applyDefaults(this.params,this.DEFAULT_PARAMS);}},getURL:function(bounds){var mapRes=this.map.getResolution();var scale=Math.round((this.map.getScale()*10000))/10000;var cellSize=new OpenLayers.Size(mapRes*this.tileSize.w,mapRes*this.tileSize.h);var pX=Math.round(((bounds.left)/cellSize.w)*this.tileSize.w);var pY=-Math.round(((bounds.top)/cellSize.h)*this.tileSize.h);return this.getFullRequestString({t:pY,l:pX,s:scale});},addTile:function(bounds,position){var url=this.getURL(bounds);return new OpenLayers.Tile.Image(this,position,bounds,url,this.tileSize);},_initTiles:function(){var viewSize=this.map.getSize();var bounds=this.map.getExtent();var extent=this.map.getMaxExtent();var resolution=this.map.getResolution();var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left;var tilecol=Math.floor(offsetlon/tilelon);
 var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=tilecol*tilelon;var offsetlat=bounds.top;var tilerow=Math.ceil(offsetlat/tilelat);var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=-(tilerowremain+1)*this.tileSize.h;var tileoffsetlat=tilerow*tilelat;tileoffsetx=Math.round(tileoffsetx);tileoffsety=Math.round(tileoffsety);this.origin=new OpenLayers.Pixel(tileoffsetx,tileoffsety);var startX=tileoffsetx;var startLon=tileoffsetlon;var rowidx=0;do{var row;row=this.grid[rowidx++];if(!row){row=new Array();this.grid.push(row);}
  tileoffsetlon=startLon;tileoffsetx=startX;var colidx=0;do{var tileBounds=new OpenLayers.Bounds(tileoffsetlon,tileoffsetlat,tileoffsetlon+tilelon,tileoffsetlat+tilelat);var x=tileoffsetx;x-=parseInt(this.map.layerContainerDiv.style.left);var y=tileoffsety;y-=parseInt(this.map.layerContainerDiv.style.top);var px=new OpenLayers.Pixel(x,y);var tile;tile=row[colidx++];if(!tile){tile=this.addTile(tileBounds,px);row.push(tile);}else{tile.moveTo(tileBounds,px,false);}
  tileoffsetlon+=tilelon;tileoffsetx+=this.tileSize.w;}while(tileoffsetlon<=bounds.right+tilelon*this.buffer)
  tileoffsetlat-=tilelat;tileoffsety+=this.tileSize.h;}while(tileoffsetlat>=bounds.bottom-tilelat*this.buffer)
  this.spiralTileLoad();},CLASS_NAME:"OpenLayers.Layer.KaMap"});OpenLayers.Layer.WFS=Class.create();OpenLayers.Layer.WFS.prototype=Object.extend(new OpenLayers.Layer.Grid(),Object.extend(new OpenLayers.Layer.Markers(),{isBaseLayer:false,buffer:1,featureClass:OpenLayers.Feature.WFS,tileClass:OpenLayers.Tile.WFS,DEFAULT_PARAMS:{service:"WFS",version:"1.0.0",request:"GetFeature",typename:"docpoint"},initialize:function(name,url,params,options){var newArguments=new Array();if(arguments.length>0){params=OpenLayers.Util.upperCaseObject(params);newArguments.push(name,url,params,options);}
  OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);var newArguments=new Array();if(arguments.length>0){newArguments.push(name,options);}
  OpenLayers.Layer.Markers.prototype.initialize.apply(this,newArguments);if(arguments.length>0){OpenLayers.Util.applyDefaults(this.params,OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));}},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);OpenLayers.Layer.Markers.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Layer.Grid.prototype.setMap.apply(this,arguments);OpenLayers.Layer.Markers.prototype.setMap.apply(this,arguments);},moveTo:function(bounds,zoomChanged,minor){OpenLayers.Layer.Grid.prototype.moveTo.apply(this,arguments);OpenLayers.Layer.Markers.prototype.moveTo.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WFS(this.name,this.url,this.params,this.options);}
  obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},addTile:function(bounds,position){var urls=new Array();urls.push(this.getFullRequestString());if(this.urls!=null){for(var i=0;i<this.urls.length;i++){urls.push(this.getFullRequestString(null,this.urls[i]));}}
  return new this.tileClass(this,position,bounds,urls,this.tileSize);},mergeNewParams:function(newParams){var upperParams=OpenLayers.Util.upperCaseObject(newParams);var newArguments=[upperParams];OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,newArguments);if(this.grid!=null){this._initTiles();}},getFullRequestString:function(newParams){var projection=this.map.getProjection();this.params.SRS=(projection=="none")?null:projection;return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this,arguments);},getFeature:function(featureID){var foundFeature=null;if(featureID!=null){if(this.grid){for(var iRow=0;iRow<this.grid.length;iRow++){var row=this.grid[iRow];for(var iCol=0;iCol<row.length;iCol++){var tile=row[iCol];for(var i=0;i<tile.features.length;i++){var feature=tile.features[i];if(feature.id==featureID){foundFeature=feature;}}}}}}
  return foundFeature;},CLASS_NAME:"OpenLayers.Layer.WFS"}));OpenLayers.Layer.WMS=Class.create();OpenLayers.Layer.WMS.prototype=Object.extend(new OpenLayers.Layer.Grid(),{DEFAULT_PARAMS:{service:"WMS",version:"1.1.1",request:"GetMap",styles:"",exceptions:"application/vnd.ogc.se_inimage",format:"image/jpeg"},isBaseLayer:null,initialize:function(name,url,params,options){var newArguments=new Array();if(arguments.length>0){params=OpenLayers.Util.upperCaseObject(params);newArguments.push(name,url,params,options);}
  OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);if(arguments.length>0){OpenLayers.Util.applyDefaults(this.params,OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));}
  this.isBaseLayer=((this.params.TRANSPARENT!="true")&&(this.params.TRANSPARENT!=true));},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WMS(this.name,this.url,this.params,this.options);}
  obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){return this.getFullRequestString({BBOX:bounds.toBBOX(),WIDTH:this.tileSize.w,HEIGHT:this.tileSize.h});},addTile:function(bounds,position){url=this.getURL(bounds);return new OpenLayers.Tile.Image(this,position,bounds,url,this.tileSize);},mergeNewParams:function(newParams){var upperParams=OpenLayers.Util.upperCaseObject(newParams);var newArguments=[upperParams];OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,newArguments);if(this.map!=null){this._initTiles();}},getFullRequestString:function(newParams){var projection=this.map.getProjection();this.params.SRS=(projection=="none")?null:projection;return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this,arguments);},CLASS_NAME:"OpenLayers.Layer.WMS"});OpenLayers.Layer.WorldWind=Class.create();OpenLayers.Layer.WorldWind.prototype=Object.extend(new OpenLayers.Layer.Grid(),{DEFAULT_PARAMS:{},isBaseLayer:true,lzd:nu
 ll,zoomLevels:null,initialize:function(name,url,lzd,zoomLevels,params,options){this.lzd=lzd;this.zoomLevels=zoomLevels;var newArguments=new Array();newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);this.params=(params?params:{});if(arguments.length>0&&params){OpenLayers.Util.applyDefaults(this.params,this.DEFAULT_PARAMS);}},addTile:function(bounds,position){if(this.map.getResolution()<=(this.lzd/512)&&this.getZoom()<=this.zoomLevels){return new OpenLayers.Tile.Image(this,position,bounds,url,this.tileSize);}else{var tile=new Object();tile.draw=function(){};tile.destroy=function(){};tile.bounds=bounds;tile.bounds=position;return tile;}},getZoom:function(){var zoom=this.map.getZoom();var extent=this.map.getMaxExtent();zoom=zoom-Math.log(this.map.maxResolution/(this.lzd/512))/Math.log(2);return zoom;},getURL:function(bounds){var deg=this.lzd/Math.pow(2,this.getZoom());var x=Math.floor((bounds.left-extent.left)/deg);var
  y=Math.floor((bounds.bottom-extent.bottom)/deg);return this.getFullRequestString({L:zoom,X:x,Y:y});},CLASS_NAME:"OpenLayers.Layer.WorldWind"});OpenLayers.Layer.WMS.Untiled=Class.create();OpenLayers.Layer.WMS.Untiled.prototype=Object.extend(new OpenLayers.Layer.HTTPRequest(),{DEFAULT_PARAMS:{service:"WMS",version:"1.1.1",request:"GetMap",styles:"",exceptions:"application/vnd.ogc.se_inimage",format:"image/jpeg"},isBaseLayer:null,imgDiv:null,initialize:function(name,url,params){var newArguments=new Array();if(arguments.length>0){params=OpenLayers.Util.upperCaseObject(params);newArguments.push(name,url,params);}
  OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this,newArguments);if(arguments.length>0){OpenLayers.Util.applyDefaults(this.params,OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));}
  this.isBaseLayer=((this.params.TRANSPARENT!="true")&&(this.params.TRANSPARENT!=true));},destroy:function(){this.imgDiv=null;OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WMS.Untiled(this.name,this.url,this.params,this.options);}
  obj=OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this,[obj]);return obj;},setMap:function(map){OpenLayers.Layer.HTTPRequest.prototype.setMap.apply(this,arguments);this.loadImageDiv();},moveTo:function(bounds,zoomChanged,minor){if(!minor){if(bounds==null){bounds=this.map.getExtent();}
  var size=this.map.getSize().clone();var url=this.getFullRequestString({BBOX:bounds.toBBOX(),WIDTH:size.w,HEIGHT:size.h});var tl=new OpenLayers.Pixel(0,0);var pos=this.map.getLayerPxFromViewPortPx(tl);Element.hide(this.imgDiv);var img=this.imgDiv;if(this.params.TRANSPARENT=='true'){OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,null,pos,size,url);img=this.imgDiv.childNodes[0];}else{OpenLayers.Util.modifyDOMElement(this.imgDiv,null,pos,size);this.imgDiv.src=url;}
  Event.observe(img,"load",this.showDiv.bindAsEventListener(this));}},showDiv:function(){Element.show(this.imgDiv);},setUrl:function(newUrl){OpenLayers.Layer.HTTPRequest.prototype.setUrl.apply(this,arguments);this.moveTo();},mergeNewParams:function(newParams){var upperParams=OpenLayers.Util.upperCaseObject(newParams);var newArguments=[upperParams];OpenLayers.Layer.HTTPRequest.prototype.mergeNewParams.apply(this,newArguments);this.moveTo();},loadImageDiv:function(){var size=this.map.getSize().clone();var bounds=this.map.getExtent();var url="";if(bounds!=null){url=this.getFullRequestString({BBOX:bounds.toBBOX(),WIDTH:size.w,HEIGHT:size.h});}
  this.div.innerHTML="";var tl=new OpenLayers.Pixel(0,0);var pos=this.map.getLayerPxFromViewPortPx(tl);if(this.params.TRANSPARENT=='true'){this.imgDiv=OpenLayers.Util.createAlphaImageDiv(null,pos,size,url,"absolute");}else{this.imgDiv=OpenLayers.Util.createImage(null,pos,size,url,"absolute");}
  this.div.appendChild(this.imgDiv);},CLASS_NAME:"OpenLayers.Layer.WMS.Untiled"});
  
  
  1.1                  metacat/lib/spatial/openlayers/build/README.txt
  
  Index: README.txt
  ===================================================================
  
  ## HowTo: Build & deploy "Shrunk" Single File Library version of OpenLayers ##
  
   * Build:
  
       cd build
       ./build.sh
       cd ..
  
   * Upload the result to the server: e.g.
  
    scp build/OpenLayers.js openlayers at openlayers.org:openlayers.org/htdocs/code/
  
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/build/build.sh
  
  Index: build.sh
  ===================================================================
  #!/bin/sh
  
  #
  # Script to build compressed single file version of OpenLayers library
  #
  
  OUTPUT_FILENAME=OpenLayers.js
  TMP_OUTPUT_FILENAME=tmp.${OUTPUT_FILENAME}
  
  TOOLS_DIR=../tools
  
  CFG_FILENAME=library.cfg
  
  SRC_DIR=../lib
  
  CMD_MERGE_JS=${TOOLS_DIR}/mergejs.py
  
  CMD_SHRINKSAFE=${TOOLS_DIR}/shrinksafe.py
  CMD_JSMIN=${TOOLS_DIR}/jsmin.py
  
  LICENSE_HEADER_FILENAME=license.txt
  
  
  ## Generate "fat" single file library version
  ${CMD_MERGE_JS} -c ${CFG_FILENAME} ${TMP_OUTPUT_FILENAME} ${SRC_DIR}
  
  
  ## Compress ("shrink") the single file library version
  
  echo
  echo Shrinking and post-processing...
  # (We also append the license header here.)
  cat ${LICENSE_HEADER_FILENAME} > ${OUTPUT_FILENAME}
  ${CMD_JSMIN} <${TMP_OUTPUT_FILENAME} >> ${OUTPUT_FILENAME}
  
  echo Cleaning up...
  rm $TMP_OUTPUT_FILENAME
  
  echo
  echo Done.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/build/docs.sh
  
  Index: docs.sh
  ===================================================================
  #!/bin/sh
  
  rm ../doc/reference.html
  CLASSES="Map Layer Layer.HTTPRequest Layer.Grid Layer.WMS Layer.KaMap Layer.EventPane Layer.Google Layer.VirtualEarth Layer.Markers Layer.Text Layer.GeoRSS Layer.Boxes Icon Marker Marker.Box Tile Tile.Image Tile.WFS Control Control.LayerSwitcher Control.MouseDefaults Control.MouseToolbar Control.PanZoom Control.PanZoomBar Control.Permalink Control.Scale LonLat Size Pixel Bounds"
  echo "<html>
    <head>
      <title>OpenLayers Class Reference Documentation</title>
      <style type='text/css'> 
          .type { background-color: #ddd } 
          td { border: black solid 1px; padding: 3px;  } 
          table { border-collapse: collapse; margin: 5px 10px; } 
          .classref { margin-left: 20px; }
          div.index { float:left;  width: 300px; }
      </style>
    </head>
    <body>" >> ../doc/reference.html
  
  for i in $CLASSES; do
  echo "<div class='index'><a href='#OpenLayers.$i'>OpenLayers.$i</a></div>" >> ../doc/reference.html
  done
  
  echo "<br style='clear:both' />" >> ../doc/reference.html
  
  for i in $CLASSES; do
  cat ../doc/$i.txt | \
  perl -pe 's!^(.*?) -- (.*?) -- (.*?)$!  <tr><td>$1</td><td>$2</td><td>$3</td></tr>!g; 
    s!^(  \* )?(.*?) -- (.*?)$!  <tr><td>$2</td><td>$3</td></tr>!g;
    s!^  \* (.*)$!  </table>\n\n<h3>$1</h3>\n  <table>!;
    s!{OpenLayers.(.*?)\|(.*?)}!<a href="#OpenLayers.$1" title="OpenLayers.$1">\2</a>!g;
    s!{OpenLayers.(.*?)}!<a href="#OpenLayers.$1" title="OpenLayers.$1">OpenLayers.$1</a>!;
    s!{([A-Za-z]+?)\|(.+?)}!<span class="type" title="$1">\2<\/span>!g;
    s!{([A-Za-z]+?)}!<span class="type" title="$1">$1<\/span>!g;
    s!^\* (.*)$!</table>\n<h2>$1</h2>\n<table>!;
    s!^OpenLayers\.(.*)$!<h1><a name="OpenLayers.$1">OpenLayers.$1</a></h1><div class="classref">!' \
  >> ../doc/reference.html 
  echo '</table></div>' >> ../doc/reference.html
  done
  echo "  </body>
  </html>" >> ../doc/reference.html
  
  
  
  1.1                  metacat/lib/spatial/openlayers/build/library.cfg
  
  Index: library.cfg
  ===================================================================
  [first]
  Prototype.js
  Rico/Corner.js
  OpenLayers/SingleFile.js
  OpenLayers.js
  
  [last]
  
  [exclude]
  OpenLayers/Layer/Yahoo.js
  OpenLayers/Control/KeyboardDefaults.js
  
  
  
  1.1                  metacat/lib/spatial/openlayers/build/license.txt
  
  Index: license.txt
  ===================================================================
  /*
  
    OpenLayers.js -- OpenLayers Map Viewer Library
  
    Copyright 2005-2006 MetaCarta, Inc., released under the BSD License.
    Please see http://svn.openlayers.org/trunk/openlayers/license.txt
    for the full text of the license.
  
    Includes compressed code under the following licenses:
  
    (For uncompressed versions of the code used please see the
    OpenLayers SVN repository: <http://openlayers.org/>)
  
  */
  
  /*  Prototype JavaScript framework, version 1.4.0
   *  (c) 2005 Sam Stephenson <sam at conio.net>
   *
   *  Prototype is freely distributable under the terms of an MIT-style license.
   *  For details, see the Prototype web site: http://prototype.conio.net/
   *
  /*--------------------------------------------------------------------------*/
  
  /**  
  *  
  *  Contains portions of Rico <http://openrico.org/>
  * 
  *  Copyright 2005 Sabre Airline Solutions  
  *  
  *  Licensed under the Apache License, Version 2.0 (the "License"); you
  *  may not use this file except in compliance with the License. You
  *  may obtain a copy of the License at
  *  
  *         http://www.apache.org/licenses/LICENSE-2.0  
  *  
  *  Unless required by applicable law or agreed to in writing, software
  *  distributed under the License is distributed on an "AS IS" BASIS,
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  *  implied. See the License for the specific language governing
  *  permissions and limitations under the License. 
  *
  **/
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Ajax.txt
  
  Index: Ajax.txt
  ===================================================================
  OpenLayers contains a number of helper functions for working with AJAX. 
  
  * Methods
    OpenLayers.loadURL({String|uri}, {String|params}, {Object|caller}, {function|onComplete}, {function|onFailure}) -- none -- This function sends an XMLHTTPRequest to a remote site, specified by URI, with the params string given as the params argument. Caller is bound as 'this' to the function specified by either onComplete or onFailure.
    OpenLayers.parseXMLString({String|text}) -- {AJAXResponse} -- Accepts a block of text, and creates a DOM response document from the text.
  
  * Parameters
    OpenLayers.ProxyHost -- When initiating an AJAX request, any URL that is absolute is prefixed with OpenLayers.ProxyHost. The ProxyHost is designed to accept a URL and return the content, in an effort to work around cross-browser security restrictions. This defaults to null, but if you wish to access content from another domain that Javascript would restrict access to, you must set this to be the URL which will accept a URL encoded version of the passed URL and return the content at that URL. An example is available as proxy.txt in the examples/ directory.
    
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Bounds.txt
  
  Index: Bounds.txt
  ===================================================================
  OpenLayers.Bounds
  
  This class represents a bounding box. Data stores as left, bottom, right, top floats.
  
  * Constructor
    OpenLayers.Bounds(left, bottom, right, top) -- Create new Bounds.
  
  * Methods
    clone() -- {OpenLayers.Bounds} -- Return copy of the current bounds.
    toString() -- {String} -- Return bounds as string. 
    toBBOX() -- {String} -- Return bounds as simple string, usable for WMS.
    getWidth() -- {float} -- Return width of bounds.
    getHeight() -- {float} -- Return height of bounds.
    getSize() -- {OpenLayers.Size} -- Return size of bounds.
    getCenterPixel() -- {OpenLayers.Pixel} -- Return center of bounds as pixel.
    getCenterLonLat() -- {OpenLayers.LonLat} -- Return center of bounds as LonLat.
    equals({OpenLayers.Bounds|bounds}) -- {Boolean} -- whether or not the bounds are equivilant.
    add({float|x}, {float|y}) -- {OpenLayers.Bounds} -- Shift bounds by x and y. 
    contains({float|x}, {float|y}, {Boolean|inclusive}) -- {Boolean} -- Return Whether or not the passed-in coordinates are within this bounds 
    containsBounds({OpenLayers.Bounds|bounds}, {Boolean|partial}, {Boolean|inclusive}) -- {Boolean} -- Returns whether or not the passed-in OpenLayers.Bounds object is contained within this bounds. partial indicates whether bounds must be contained or only overlap. Inclusive determines whether border is included.
    determineQuadrant({OpenLayers.LonLat|lonlat}) -- {String} -- Determine which quadrant the LonLat is in. Returns combination of "b" or "t" and "l" or "r".
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Control.LayerSwitcher.txt
  
  Index: Control.LayerSwitcher.txt
  ===================================================================
  OpenLayers.Control.LayerSwitcher
  
  This control will by default display a small image in the upper right corner of the map. When clicked, this image expands into a control which allows one to select between multiple types of layers, seperated into two types: Base Layers and Overlays. Only one base layer can be selected at a time, and is enforced by a radio button control being used. Multiple overlays can be selected at once, and a checkbox control is visible for this functionality.
  * Constructor
    OpenLayers.Control.LayerSwitcher({Object|options}?) -- Creates a new control.
  
  * Methods
    maximizeControl() -- none -- Expand the layer switcher control.
    minimizeControl() -- none -- Close the layer switcher control.
  
  * Parameters
    position -- (inherited from {OpenLayers.Control}) {OpenLayers.Pixel} to use as the top-left corner of the control div, relative to the map area.
    activeColor -- The color to use for the background of the layer switcher div.
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Control.MouseDefaults.txt
  
  Index: Control.MouseDefaults.txt
  ===================================================================
  OpenLayers.Control.MouseDefaults
  
  Control to set up mouse handling. This includes clicks, double clicks, scrollwheel events, and mouse movement. There are a number of functions which act as the default handlers for these events: if you wish to create your own mouse control which behaves differently, you should create a subclass of MouseDefaults, replacing the functions whose behavior you wish to change.
  
  
  * Constructor
    OpenLayers.Control() -- Creates a new control. No options available. 
  
  * Methods
    defaultClick -- none -- This event takes place when a click event occurs on the map.
    defaultDblClick -- none -- This event re-centers the map on the clicked location.
    defaultMouseDown -- none -- This event starts a dragging event, so that the map can be dragged. If the shift key is held, it starts a 'zoombox' or rubber-band-zoom action instead.
    defaultMouseMove -- none -- If a mouseDrag is in operation, this function causes the map to move to follow the cursor. If a zoombox is in place, this increases the size of the zoombox element to match the cursor.
    defaultMouseUp -- none -- This function is called when a mouseup event is received, and either sets the center of the map to be the final location or zooms to the zoombox if enabled.
    defaultMouseOut -- none -- This calls defaultMouseUp, so that when you mouse out of the map div, the events are stopped.
    defaultWheelUp -- none -- Zooms in one level. Called by onWheelEvent
    defaultWheelDown -- none -- Zooms out one level. Called by onWheelEvent.
    onWheelEvent -- none -- catches the map wheel event, and handles it, zooming appropriately. 
    
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Control.MouseToolbar.txt
  
  Index: Control.MouseToolbar.txt
  ===================================================================
  OpenLayers.Control.MouseToolbar
  
  Control to set up mouse handling. This includes clicks, double clicks, scrollwheel events, and mouse movement. There are a number of functions which act as the default handlers for these events: if you wish to create your own mouse control which behaves differently, you should create a subclass of MouseToolbar, replacing the functions whose behavior you wish to change. Additionally, a toolbar of images can be clicked to start events, as well as using the keyboard shortcuts.
  
  * Constructor
    OpenLayers.Control.MouseToolbar({OpenLayers.Pixel|position}, {String|direction}) -- Creates a new control. The direction of the control can be either "vertical" or "horizontal". The default is vertical.
  
  * Methods
    defaultClick -- none -- This event takes place when a click event occurs on the map.
    defaultDblClick -- none -- This event re-centers the map on the clicked location.
    defaultMouseDown -- none -- This event starts a dragging event, so that the map can be dragged. If the shift key is held, it starts a 'zoombox' or rubber-band-zoom action instead.
    defaultMouseMove -- none -- If a mouseDrag is in operation, this function causes the map to move to follow the cursor. If a zoombox is in place, this increases the size of the zoombox element to match the cursor.
    defaultMouseUp -- none -- This function is called when a mouseup event is received, and either sets the center of the map to be the final location or zooms to the zoombox if enabled.
    defaultMouseOut -- none -- This calls defaultMouseUp, so that when you mouse out of the map div, the events are stopped.
    
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Control.PanZoom.txt
  
  Index: Control.PanZoom.txt
  ===================================================================
  OpenLayers.Control.PanZoom
  
  Creates a small toolset for controlling the location of the map with panning and zooming, including four directional arrows, a zoom in and zoom out, and one button which zooms to the max extent of the map.
  
  * Constructor
    OpenLayers.Control.PanZoom({Object|options}) -- Creates a new panzoom control.
  
  * Parameters
    slideFactor -- Number of pixels by which to slide the map when a pan arrow is clicked.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Control.PanZoomBar.txt
  
  Index: Control.PanZoomBar.txt
  ===================================================================
  OpenLayers.Control.PanZoom
  
  Creates a small toolset for controlling the location of the map with panning and zooming, including four directional arrows, a zoom in and zoom out, and a bar on which a slider can be moved to zoom in or out by multiple stops at once.
  
  * Constructor
    OpenLayers.Control.PanZoomBar() -- Creates a new panzoombar control.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Control.Permalink.txt
  
  Index: Control.Permalink.txt
  ===================================================================
  OpenLayers.Control.Permalink
  
  A small control which updates a "Permalink" to the map every time the viewport changes. This allows users to copy a link to a specfic map view. By default, it places itself in the lower right corner of the map. This control must be added to the map after a baselayer has been set.  
  
  * Constructor
    OpenLayers.Control.Scale({DOMElement|element}?, {String|base}) -- Creates a new permalink control. The DOMElement is used, if passed, as the element on which the 'href' is set. If you prefer to put this link on an element outside of the map, set this element to an anchor element to have its href updated when the map moves. If you wish to make the link go to some other URL (for example, an editing interface rather than the current URL), the 'base' property can be used, to which the ?lat=&lon=&zoom= will be appended after the map has moved.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Control.Scale.txt
  
  Index: Control.Scale.txt
  ===================================================================
  OpenLayers.Control.Scale
  
  A small control which displays an informative scale value, a la "1:50K" , by defualt in the lower right of the map viewport.
  
  * Constructor
    OpenLayers.Control.Scale({DOMElement|element}?) -- Creates a new scale control. The DOMElement is used, if passed, to put the scale inside -- this allows you to have the scale displayed in some location outside the map. 
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Control.txt
  
  Index: Control.txt
  ===================================================================
  OpenLayers.Control
  
  Base class from which controls are derived. Controls are elements of the map used to control things like zoom, layer status, or to provide information to the user about the status of the map, such as scale or copyright information.
  
  * Constructor
    OpenLayers.Control({Object|options}?) -- Creates a new control. The options here are used to control parameters of the control. The base control defines only "position", which is designed to be an {OpenLayers.Pixel} which is the top-left of the location of the control relative to the map div. 
  
  * Parameters
    position -- {OpenLayers.Pixel} to use as the top-left corner of the control div, relative to the map area.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Icon.txt
  
  Index: Icon.txt
  ===================================================================
  OpenLayers.Icon
  
  Icon is used as the visual representation of a Marker. Creating such a representation requres up to three parts: An Icon URL, a size, and an offset. The icon URL is a pointer to an image to use as an icon. The size is the size of the image, as an {OpenLayers.Size} object, and the offset is the position of the top left corner of the image in pixels, relative to the latitude and longitude of the Marker.
  
  * Constructor
    OpenLayers.Icon({String|url}, {OpenLayers.Size|size}, {OpenLayers.Pixel|offset}) -- creates a new icon.
  
  * Methods
    clone() -- {OpenLayers.Icon} -- Create an exact copy of the icon.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.Boxes.txt
  
  Index: Layer.Boxes.txt
  ===================================================================
  OpenLayers.Layer.Boxes
  
  A subclass of the markers layer, this layer draws boxes using div elements
  instead of icons using images.
  
  * Constructor
    OpenLayers.Layer.Boxes(name, options) -- Same as OpenLayers.Layer.Markers.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.EventPane.txt
  
  Index: Layer.EventPane.txt
  ===================================================================
  OpenLayers.Layer.EventPane
  
  Designed to act as a super-class for layers which need OpenLayers to intercept click events. Google Maps and Microsoft Virtual Earth both use this functionality, in order to allow for actions like the rubber-band-zoom/zoombox functionality. This Layer is not designed to be used on its own, but instead to act as an intermediary between the user and layers which have their own click handlers.
  
  * Constructor
    OpenLayers.Layer.EventPane(name, options) -- Only designed to be used by subclasses.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.GeoRSS.txt
  
  Index: Layer.GeoRSS.txt
  ===================================================================
  OpenLayers.Layer.GeoRSS
  
  GeoRSS layer. Pass a name and location of a GeoRSS file on the web, and a marker will be added to the map for each item in the GeoRSS feed. Uses OpenLayers.loadURL to load the XML, parses the data, and adds markers to the map. The GeoRSS layer supports 1.0 and 2.0 in IE and Firefox, and supports 2.0 in Safari. (Ticket #111 explains the reason for this difference.)
  
  
  * Constructor
    OpenLayers.Layer.GeoRSS(name, url) -- Name and location of GeoRSS XML file.
  
  * Methods
    parseData(ajaxResponse) -- none -- Callback for the loadURL call. This function parses the XML for the GeoRSS feed, creating markers for the data and adding a popup to each marker. It populates an array of features as 'this.features'.
    markerClick(Event) -- none -- Action to perform when a marker is clicked.
    clearFeatures() -- none -- Removes all features and markers from the map.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.Google.txt
  
  Index: Layer.Google.txt
  ===================================================================
  OpenLayers.Layer.Google
  
  The Google Layer in OpenLayers allows you to include Google Maps functionality in your OpenLayers maps. In order to use the Google Layer, you must first obtain an API key for Google Maps, and include the Google Maps API script in your page. Once you have done this, 
  
  * Constructor
    OpenLayers.Layer.Google(name, options?) -- Constructor for Google layer. Accepts name and options.
  
  * Methods
    getOLLonLatFromGLatLng(GLonLat) -- {OpenLayers.LonLat} -- Convert from GLatLon to OpenLayers LonLat
    getGLatLngFromOLLonLat({OpenLayers.LonLat|lonlat}) -- GLatLon -- Convert From OpenLayers LonLat to GLatLon
    getOLPixelFromGPoint(GPoint) -- {OpenLayers.Pixel} -- Convert from GPoint to OpenLayers.Pixel
    getGPointFromOLPixel({OpenLayers.Pixel|pixel}) -- GPoint -- Create GPoint from OpenLayers Pixel.
    
  * Parameters
    type -- one of G_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, used to choose the type of map to display.
    
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.Grid.txt
  
  Index: Layer.Grid.txt
  ===================================================================
  OpenLayers.Layer.Grid
  
  The Grid layer is the base layer for almost all image layers. This is a subclass of HTTPRequest.
  
  * Constructor
    OpenLayers.Layer.Grid(name, url, params, options) -- URL is the base URL to the layer. Params is a set of params to be included in the HTTP Request. Options is a set of options, extending the parameters of the layer.
  
  * Methods
    getGridBounds() -- {OpenLayers.Bounds} -- return geographic extent of the grid of tiles.
    _initTiles() -- none -- Used to initialize the tile grid, creating image elements as neccesary and filling them with the correct images.
    spiralTileLoad() -- none -- Called from _initTiles. Rotates through the grid filling in the images for the grid.
    clone() -- {OpenLayers.Layer.Grid} -- create a clone of the layer. Subclassed from {OpenLayers.Layer}.
    setMap(map) -- none -- Set the map property of the layer. Also set the parameters which are inherited from the map. This is also where the tileSize is retrieved from the map. Subclassed from {OpenLayers.Layer}.
    moveTo({OpenLayers.Bounds|bounds}, {Boolean|zoomChanged}) -- none -- Not implemented here, but the general function called on dragging or setCenter, to move the Layer to a new geographic location. Subclassed from {OpenLayers.Layer}.
    getResolution() -- {float} -- Return the current resolution of the map, in units/pixel. Subclassed from {OpenLayers.Layer}.
    getExtent() -- {OpenLayers.Bounds} -- Return the geographic extent of the current map viewport. Subclassed from {OpenLayers.Layer}.
    getZoomForExtent({OpenLayers.Bounds|bounds}) -- {Integer} -- return the integer zoom which most closely matches the passed bounds. Subclassed from {OpenLayers.Layer}.
    getLonLatFromViewPortPx({OpenLayers.Pixel|pixel}) -- {OpenLayers.LonLat} -- Returns an OpenLayers.LonLat which is the passed-in view port OpenLayers.Pixel, translated into lon/lat by the layer. Subclassed from {OpenLayers.Layer}.
    getViewPortPxFromLonLat({OpenLayers.LonLat|lonlat}) -- {OpenLayers.Pixel} -- Returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, translated into view port pixels. Subclassed from {OpenLayers.Layer}.
  
  * Parameters
    buffer -- Default 2. Number of tiles around the central map area which OpenLayers will preload so that dragging goes more smoothly.
    * Subclassed from OpenLayers.Layer
    isBaseLayer -- This determines whether the layer is a base layer or an overlay. Only one Base Layer can be displayed on the map at once. Default is false.
    projection -- SRS string to describe the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    maxExtent -- an OpenLayers.Bounds for the layer. This is the maximum geographic extent of the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    maxResolution -- The number of degrees per pixel at zoom level 0. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    maxZoomLevel -- The maximum zoom level for the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    minScale -- The scale at zoom level 0. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    maxScale -- The scale at the highest zoom level. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    units -- The units the map is projected into. If this is set on the map before the Layer is added to the map, it will inherit from the map.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.HTTPRequest.txt
  
  Index: Layer.HTTPRequest.txt
  ===================================================================
  OpenLayers.Layer.HTTPRequest
  
  Sublass of Layer used for services which require initiating multiple HTTPRequests.
  
  * Constructor
    OpenLayers.Layer.HTTPRequest(name, url, params, options) -- URL is the base URL to the layer. Params is a set of params to be included in the HTTP Request. Options is a set of options, extending the parameters of the layer.
  
  * Methods
    initResolutions() -- none -- Based on the current minScale/maxScale/maxResolution/maxZoomLevels/scales/resolutions parameters, initializes an array of 'zoom levels' as this.resolutions, which are then used as an index into when zooming.
    getFullRequestString(newParams) -- {String} -- Returns the full request string for a combination of the defaults on this layer and the parameters passed via newParams.
    
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.KaMap.txt
  
  Index: Layer.KaMap.txt
  ===================================================================
  OpenLayers.Layer.KaMap
  
  ka-Map is a Mapserver wrapper which performs caching and works around many of the deficiencies with tiling when using Mapserver as a WMS client.
  
  * Construtor
    OpenLayers.Layer.KaMap(name, url, params, options) -- URL is the url of the tile.php for KaMap.
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.Markers.txt
  
  Index: Layer.Markers.txt
  ===================================================================
  OpenLayers.Layer.Markers
  
  The base class for all vector drawing, The OpenLayers.Layer.Markers layer is the primary way to get annotations into your map. 
  
  * Constructor
    OpenLayers.Layer.Markers(name, options) -- Name and options for layer.
  
  * Methods
    addMarker({OpenLayers.Marker|Marker}) -- none -- Adds a marker to the layer, sets the map object on the marker, and calls drawMarker on the marker.
    removeMarker({OpenLayers.Marker|Marker}) -- none -- Remove the marker from the layer and map.
    clearMarkers() -- none -- Remove all markers from the layer with removeMarker.
    redraw() -- none -- Redraw all markers. Used so that markers can change their position when a base layer changes.
    drawMarker -- none -- Call marker.draw(px), which passes the Pixel of the latitude/longitude in the map viewport to the marker. adds the marker to the div, and marks the marker as drawn.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.Text.txt
  
  Index: Layer.Text.txt
  ===================================================================
  OpenLayers.Layer.Text
  
  Subclass of Markers layer which retrieves CSV file from the web, and parses content to create markers and popups.
  
  * Constructor
    OpenLayers.Layer.Text(name, options) -- Pass in name, and set location: 'URL of CSV file' in the options hash.
  
  * Methods
    parseData(ajaxRequest) -- none -- Parses returned CSV file. 
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.VirtualEarth.txt
  
  Index: Layer.VirtualEarth.txt
  ===================================================================
  OpenLayers.Layer.VirtualEarth
  
  The Virtual Earth Layer in OpenLayers allows you to include Virtual Earth Maps in your OpenLayers maps. In order to use the Virtual Earth Layer, you must first include the Virtual Earth API script in your page. Once you have done this, simply add the layer to your map.
  
  * Constructor
    OpenLayers.Layer.VirtualEarth(name) -- Constructor for Virtual Earth layer. Accepts name.
  
  * Methods
    getOLLonLatFromVELatLng(VELatLon) -- {OpenLayers.LonLat} -- Convert from VELatLon to OpenLayers LonLat
    getVELatLngFromOLLonLat({OpenLayers.LonLat|lonlat}) -- VELatLon -- Convert From OpenLayers LonLat to VELatLon
    getOLPixelFromVEPoint(Msn.VE.Pixel) -- {OpenLayers.Pixel} -- Convert from VEPoint to OpenLayers.Pixel
    getGPointFromOLPixel({OpenLayers.Pixel|pixel}) -- Msn.VE.Pixel -- Create Msvn.VE.Pixel from OpenLayers Pixel.
    
    
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.WMS.txt
  
  Index: Layer.WMS.txt
  ===================================================================
  OpenLayers.Layer.WMS
  
  The WMS layer allows one to connect to a WMS server to obtain images. Params are available as a hash on the layer object, however, all keys are upper-cased automatically for maximum compatibility with WMS servers, so a parameter which is set as 'layers' will be uppercased to LAYERS. Where 'layer' is your Javscript variable for the layer, layer.params.LAYERS is the value of the layers param as set by the constructor.
  
  If you wish to change params, you should use mergeNewParams, rather than accessing the parameters directly.
  
  * Constructor
    OpenLayers.Layer.WMS(name, url, params, options) -- URL is the base URL to the layer. Params is a set of params to be included in the HTTP Request. Options is a set of options, extending the parameters of the layer.
  
  * Methods
    getURL({OpenLayers.Bounds|bounds}) -- {String} -- Returns a WMS URL for the given bounds based on the properties of the layer.
    All other methods are inherited from {OpenLayers.Layer.Grid}
    
  * Options 
    isBaseLayer -- WMS layers default to being base layers unless one of their parameters is 'transparent':'true'.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Layer.txt
  
  Index: Layer.txt
  ===================================================================
  OpenLayers.Layer
  
  Layers are the most important and central aspect of OpenLayers. They are the 
  core functionality for the software: Everything that ends up on the map comes
  from a layer. The base layer class is designed to be subclassed by any number
  of different layers.
  
  * Constructor
    OpenLayers.Layer(name, options) -- All layers have a name as their first param. This name is used to display the layer in the LayerSwitcher, and for other purposes. The options parameter is used to replace any parameters of the Layer which need to be different.
  
  * Methods
    clone() -- {OpenLayers.Layer} -- create a clone of the layer.
    setName({String|name}) -- none -- Set the name of the layer to something different.
    moveTo({OpenLayers.Bounds|bounds}, {Boolean|zoomChanged}) -- none -- Not implemented here, but the general function called on dragging or setCenter, to move the Layer to a new geographic location.
    reproject() -- none -- Subclassed by vector layers to redraw vectors when base layer changes.
    setMap(map) -- none -- Set the map property of the layer. Also set the parameters which are inherited from the map.
    getVisibility() -- {Boolean} -- Return true or false based on visibility of the layer.
    setVisibility({Boolean|visible}) -- none -- Set the layer visibility, and trigger the appropriate events.
    getResolution() -- {float} -- Return the current resolution of the map, in units/pixel.
    getExtent() -- {OpenLayers.Bounds} -- Return the geographic extent of the current map viewport.
    getZoomForExtent({OpenLayers.Bounds|bounds}) -- {Integer} -- return the integer zoom which most closely matches the passed bounds.
    getLonLatFromViewPortPx({OpenLayers.Pixel|pixel}) -- {OpenLayers.LonLat} -- Returns an OpenLayers.LonLat which is the passed-in view port OpenLayers.Pixel, translated into lon/lat by the laye
    getViewPortPxFromLonLat({OpenLayers.LonLat|lonlat}) -- {OpenLayers.Pixel} -- Returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, translated into view port pixels
    
  * Parameters
    isBaseLayer -- This determines whether the layer is a base layer or an overlay. Only one Base Layer can be displayed on the map at once. Default is false.
    projection -- SRS string to describe the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    maxExtent -- an OpenLayers.Bounds for the layer. This is the maximum geographic extent of the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    maxResolution -- The number of degrees per pixel at zoom level 0. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    maxZoomLevel -- The maximum zoom level for the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    minScale -- The scale at zoom level 0. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    maxScale -- The scale at the highest zoom level. If this is set on the map before the Layer is added to the map, it will inherit from the map.
    units -- The units the map is projected into. If this is set on the map before the Layer is added to the map, it will inherit from the map.
  
   
   
  
    
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/LonLat.txt
  
  Index: LonLat.txt
  ===================================================================
  OpenLayers.LonLat
  
  This class represents a geographic coordinate pair, either projected or unprojected.
  
  * Constructor
    OpenLayers.LonLat({float|lon}, {float|lat}) -- Create LonLat.
  
  * Methods
    toString() -- {String} -- Converts to human readable string.
    toShortString() -- {String} -- Converts to short human readable string.
    clone() -- {OpenLayers.Size} -- Returns a copy of the pixel.
    equals({OpenLayers.LonLat|ll}) -- {Boolean} -- Compares two LonLats. 
    add({int|lon}, {int|lat}) -- {OpenLayers.LonLat} -- add x and y to the current coordinates.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Map.txt
  
  Index: Map.txt
  ===================================================================
  OpenLayers.Map
  
  Instantiate class {OpenLayers.Map} in order to create a map. This is the central class in the API. Everything else is auxiliary.
  
  * Constructor
    OpenLayers.Map(container,  opts?) -- Creates a new map inside of the given HTML container, which is typically a DIV element. The opts variable is an object with various options, as described in the options section below.
    
  * Methods
    * Layer Management 
    addLayer({OpenLayers.Layer|layer}) -- none -- adds a layer to the list currently set for the map. 
    addLayers([ {OpenLayers.Layer|layer}, {OpenLayers.Layer|layer} ]) -- none -- Adds multiple layers to a map.
    removeLayer({OpenLayers.Layer|layer}) -- none -- Remove a layer from the map.
    setBaseLayer({OpenLayers.Layer|layer}) -- none -- Sets a new base layer for the map. The provided layer should have already been added to the map. Changing the base layer causes all other base layers to be turned off, and all overlays to reproject themselves. 
    
    * Control Management
    addControl({OpenLayers.Control|control}) -- none -- Adds a control to the map.
    
    * Popup Management
    addPopup({OpenLayers.Popup|popup}, {Boolean|exclusive}) -- none -- adds a popup to the map. If exclusive is set to true, then all other popups are closed first.
    removePopup({OpenLayers.Popup|popup}) -- none -- removes an existing popup from the map.
  
    * Center management
    setCenter({OpenLayers.LonLat|lonlat}, {int|zoom}) -- none -- Set the center point of the map. This then moves all the layers to the new center location as well, using each layer's 'moveTo' function. The 'zoom' is an integer from 0 to maxZoomLevel.
    pan({Integer|dx}, {Integer|dy}) -- none -- Allows user to pan by a value of screen pixels
    
    * Zoom Management
    zoomTo({int|zoom}) -- none -- zoom to the given zoom level.
    zoomIn() -- none -- zoom in one level.
    zoomOut() -- none -- zoom out one level.
    zoomToExtent({OpenLayers.Bounds|bounds}) -- none -- Set the map such that the bounds fits within the current viewport area.
    zoomToMaxExtent() -- none -- Zoom such that the entire bounds of the map is contained in the viewport.
    zoomToScale({float}) -- none -- Zoom as close to the given scale as possible. Scale can be given as a ratio (1/24000) or as the denominator of the scale value (24000). zoomToScale will find the zoom level which most closely fits the requested scale and set that as the current zoom level.
  
    * Current Map Information
    getLonLatFromPixel({OpenLayers.Pixel|pixel}) -- {OpenLayers.LonLat} -- Returns OpenLayers.LonLat corresponding to the given OpenLayers.Pixel, translated into lon/lat by the current base layer
    getPixelFromLonLat({OpenLayers.LonLat|lonlat}) -- {OpenLayers.Pixel} -- Returns OpenLayers.Pixel corresponding to the given OpenLayers.LonLat, translated by the current base layer  
    getCenter() -- {OpenLayers.LonLat} -- Returns a LonLat for the current center of the map
    getZoom() -- {Integer} -- Returns the current zoom level as an integer
    getExtent() -- {OpenLayers.Bounds} -- Returns a Bounds object which represents the geographic bounds of the current viewPort. 
    getSize() -- {OpenLayers.Pixel} -- Returns the pixel size of the current map window.
    getTileSize() -- {OpenLayers.Size} -- Returns tile size currently set for map.
    getResolution() -- {float} -- Returns the current resolution (units/pixel) of the map
    getZoomForExtent({OpenLayers.Bounds|bounds}) -- Zoom level in which the given bounds will fit -- zooming to this level and setting the center of the map in the center of the bounds will always fit the given bounds in the map.
    
    * Default Map Information 
    getMaxResolution() -- {float} -- returns The Map's Maximum Resolution, the units/pixel at zoom level 0. The default is 1.40625, to match the approximate MaxResolution used by the commercial providers. 
    getMaxExtent() -- {OpenLayers.Bounds} -- Return the max extent of the current base layer as defined on the layer. The default maxExtent for OpenLayers is -180,-90,180,90
    getMaxZoomLevel() -- {int} -- Returns the maximum zoom level that can be reached in the map for the current base layer
    getMinZoomLevel() -- {int} -- Returns the minimum zoom level that can be reached in the map for the current base layer
  
  * Events
    addlayer -- a layer is added to the map
    removelayer -- a layer is removed from the map
    changelayer -- a layer has some property of it, typically visibility, changed.
    changebaselayer -- the current base layer changes
    movestart -- start of a movement in the map       
    zoomend -- end of a zoom action
    mouseover -- map is moused over
    mouseout -- map is no longer mousedout
    mousemove -- mouse moves inside map
    dragstart -- drag action starts
    dragend -- drag action ends
    
  * Options:
    * controls -- an array of control objects to be added to the map. The default is [new OpenLayers.Control.MouseDefaults(), new OpenLayers.Control.PanZoom()] 
    * projection -- used by WMS layers, should be an SRS identifier.
    * maxZoomLevel -- The number of zoom levels to use in the map.
    * maxExtent -- {OpenLayers.Bounds} to be used as the maximum extent of a map. The center of the map can not leave the maxExtent of the map when dragging.
    * maxResolution -- The units/pixel measurement at zoom level 0. Default is 1.40625
    * resolutions -- An array of resolutions to be used as an index when zooming. Overrides maxZoomLevel and maxResolution if present.
    * minScale -- The smallest scale value. minScale is preferred over maxResolution, if present.
    * maxScale -- The maximum scale the map should include. Overrides maxZoomLevel if present.
    * units -- The units of the map. Defaults to degrees. Neccesary when using scale in any way.
    * scales -- An array of scale values. Overrides maxResolution, maxZoomLevel, resolutions, and min/max scale if present.
    
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Marker.Box.txt
  
  Index: Marker.Box.txt
  ===================================================================
  OpenLayers.Marker.Box
  
  A different kind of Marker, designed to be added to a Boxes layer instead of a Markers layer.
  
  * Constructor
    OpenLayers.Marker.Box({OpenLayers.Bounds|bounds}, borderColor, borderWidth) -- Set up a box. Defaults are red, with a width of 2.
  
  * Methods
    setBorder(color, width) -- sets properties of border color and width.
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Marker.txt
  
  Index: Marker.txt
  ===================================================================
  OpenLayers.Marker
  
  Instantiate class {OpenLayers.Marker} in order to create a marker.
  
  * Constructor
    OpenLayers.Marker({OpenLayers.LonLat|lonlat}, {OpenLayers.Icon|icon}?  ) -- Creates a new marker object. This object must be added to a Marker layer and will then be displayed. The icon can be left null -- if this is the case, then the default OpenLayers icon will be used.
    
  * Methods
    onScreen() -- {boolean} -- Returns whether or not the marker is currently visible on screen.
    inflate({float}) -- none -- Changes the size of the Icon by a factor of the passed float.
    display({string}) -- none -- Sets the style.display property of the Icon.
  
  * Events
    Standard browser events are available.
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Pixel.txt
  
  Index: Pixel.txt
  ===================================================================
  OpenLayers.Pixel
  
  This class represents a screen coordinate in x and y coordinates.
  
  * Constructor
    OpenLayers.Pixel({float|x}, {float|y}) -- Create Pixel.
  
  * Methods
    toString() -- {String} -- Converts to human readable string.
    clone() -- {OpenLayers.Pixel} -- Returns a copy of the pixel.
    equals({OpenLayers.Pixel|px}) -- {Boolean} -- Tests for equivilance.
    add({int|x}, {int|y}) -- {OpenLayers.Pixel} -- add x and y to the current coordinates.
    offset({OpenLayers.Pixel|pixel}) -- {OpenLayers.Pixel} -- Add pixels together.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Size.txt
  
  Index: Size.txt
  ===================================================================
  OpenLayers.Size
  
  This class represents a width/height pair.
  
  * Constructor
    OpenLayers.Size({float|h}, {float|w}) -- Create Size.
  
  * Methods
    toString() -- {String} -- Converts to human readable string.
    clone() -- {OpenLayers.Size} -- Returns a copy of the pixel.
    add({int|x}, {int|y}) -- {OpenLayers.Size} -- add x and y to the current coordinates.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Tile.Image.txt
  
  Index: Tile.Image.txt
  ===================================================================
  OpenLayers.Tile.Image
  
  The image tile is designed to hold images for all types of layers, from WMS to KaMap to WorldWind.
  
  * Constructor
    OpenLayers.Tile.Image({OpenLayers.Layer|layer}, {OpenLayers.Pixel|position}, {OpenLayers.Bounds|bounds}, {String|url}, {OpenLayers.Size|size}) -- Create a new tile, with properties passed.
    
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Tile.WFS.txt
  
  Index: Tile.WFS.txt
  ===================================================================
  OpenLayers.Tile.WFS
  
  The WFS tile allows you to load any number of WFS URLs into a single tile. 
  
  * Constructor
    OpenLayers.Tile.WFS({OpenLayers.Layer|layer}, {OpenLayers.Pixel|position}, {OpenLayers.Bounds|bounds}, {String|urls}, {OpenLayers.Size|size}) -- Create a new tile, with properties passed. The major difference between this tile and other tiles is what it does with results: The WFS tile is designed to parse XML responses, and create features for each item in the response. 
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/Tile.txt
  
  Index: Tile.txt
  ===================================================================
  OpenLayers.Tile
  
  This is a class designed to designate a single tile, however
  it is explicitly designed to do relatively little. Tiles store information
  about themselves -- such as the URL that they are related to, and their 
  size - but do not add themselves to the layer div automatically, for 
  example.
  
  * Constructor
    OpenLayers.Tile({OpenLayers.Layer|layer}, {OpenLayers.Pixel|position}, {OpenLayers.Bounds|bounds}, {String|url}, {OpenLayers.Size|size}) -- Create a new tile, with properties passed.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/authors.txt
  
  Index: authors.txt
  ===================================================================
  OpenLayers core development team
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  Erik Uzureau
  Christopher R. Schmidt
  Philip Lindsay
  John Frank
  Schuyler Erle
  
  Patch contributors
  ------------------
  Corey Puffault
  Tim Schaub
  
  OpenLayers is graciously supported by MetaCarta, Inc.
  <http://www.metacarta.com>.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/doc/reference.html
  
  Index: reference.html
  ===================================================================
  <html>
    <head>
      <title>OpenLayers Class Reference Documentation</title>
      <style type='text/css'> 
          .type { background-color: #ddd } 
          td { border: black solid 1px; padding: 3px;  } 
          table { border-collapse: collapse; margin: 5px 10px; } 
          .classref { margin-left: 20px; }
          div.index { float:left;  width: 300px; }
      </style>
    </head>
    <body>
  <div class='index'><a href='#OpenLayers.Map'>OpenLayers.Map</a></div>
  <div class='index'><a href='#OpenLayers.Layer'>OpenLayers.Layer</a></div>
  <div class='index'><a href='#OpenLayers.Layer.HTTPRequest'>OpenLayers.Layer.HTTPRequest</a></div>
  <div class='index'><a href='#OpenLayers.Layer.Grid'>OpenLayers.Layer.Grid</a></div>
  <div class='index'><a href='#OpenLayers.Layer.WMS'>OpenLayers.Layer.WMS</a></div>
  <div class='index'><a href='#OpenLayers.Layer.KaMap'>OpenLayers.Layer.KaMap</a></div>
  <div class='index'><a href='#OpenLayers.Layer.EventPane'>OpenLayers.Layer.EventPane</a></div>
  <div class='index'><a href='#OpenLayers.Layer.Google'>OpenLayers.Layer.Google</a></div>
  <div class='index'><a href='#OpenLayers.Layer.VirtualEarth'>OpenLayers.Layer.VirtualEarth</a></div>
  <div class='index'><a href='#OpenLayers.Layer.Markers'>OpenLayers.Layer.Markers</a></div>
  <div class='index'><a href='#OpenLayers.Layer.Text'>OpenLayers.Layer.Text</a></div>
  <div class='index'><a href='#OpenLayers.Layer.GeoRSS'>OpenLayers.Layer.GeoRSS</a></div>
  <div class='index'><a href='#OpenLayers.Layer.Boxes'>OpenLayers.Layer.Boxes</a></div>
  <div class='index'><a href='#OpenLayers.Icon'>OpenLayers.Icon</a></div>
  <div class='index'><a href='#OpenLayers.Marker'>OpenLayers.Marker</a></div>
  <div class='index'><a href='#OpenLayers.Marker.Box'>OpenLayers.Marker.Box</a></div>
  <div class='index'><a href='#OpenLayers.Tile'>OpenLayers.Tile</a></div>
  <div class='index'><a href='#OpenLayers.Tile.Image'>OpenLayers.Tile.Image</a></div>
  <div class='index'><a href='#OpenLayers.Tile.WFS'>OpenLayers.Tile.WFS</a></div>
  <div class='index'><a href='#OpenLayers.Control'>OpenLayers.Control</a></div>
  <div class='index'><a href='#OpenLayers.Control.LayerSwitcher'>OpenLayers.Control.LayerSwitcher</a></div>
  <div class='index'><a href='#OpenLayers.Control.MouseDefaults'>OpenLayers.Control.MouseDefaults</a></div>
  <div class='index'><a href='#OpenLayers.Control.MouseToolbar'>OpenLayers.Control.MouseToolbar</a></div>
  <div class='index'><a href='#OpenLayers.Control.PanZoom'>OpenLayers.Control.PanZoom</a></div>
  <div class='index'><a href='#OpenLayers.Control.PanZoomBar'>OpenLayers.Control.PanZoomBar</a></div>
  <div class='index'><a href='#OpenLayers.Control.Permalink'>OpenLayers.Control.Permalink</a></div>
  <div class='index'><a href='#OpenLayers.Control.Scale'>OpenLayers.Control.Scale</a></div>
  <div class='index'><a href='#OpenLayers.LonLat'>OpenLayers.LonLat</a></div>
  <div class='index'><a href='#OpenLayers.Size'>OpenLayers.Size</a></div>
  <div class='index'><a href='#OpenLayers.Pixel'>OpenLayers.Pixel</a></div>
  <div class='index'><a href='#OpenLayers.Bounds'>OpenLayers.Bounds</a></div>
  <br style='clear:both' />
  <h1><a name="OpenLayers.Map">OpenLayers.Map</a></h1><div class="classref">
  
  Instantiate class <a href="#OpenLayers.Map" title="OpenLayers.Map">OpenLayers.Map</a> in order to create a map. This is the central class in the API. Everything else is auxiliary.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Map(container,  opts?)</td><td>Creates a new map inside of the given HTML container, which is typically a DIV element. The opts variable is an object with various options, as described in the options section below.</td></tr>
    
  </table>
  <h2>Methods</h2>
  <table>
    </table>
  
  <h3>Layer Management </h3>
    <table>
    <tr><td>  addLayer(<a href="#OpenLayers.Layer" title="OpenLayers.Layer">layer</a>)</td><td>none</td><td>adds a layer to the list currently set for the map. </td></tr>
    <tr><td>  addLayers([ <a href="#OpenLayers.Layer" title="OpenLayers.Layer">layer</a>, <a href="#OpenLayers.Layer" title="OpenLayers.Layer">layer</a> ])</td><td>none</td><td>Adds multiple layers to a map.</td></tr>
    <tr><td>  removeLayer(<a href="#OpenLayers.Layer" title="OpenLayers.Layer">layer</a>)</td><td>none</td><td>Remove a layer from the map.</td></tr>
    <tr><td>  setBaseLayer(<a href="#OpenLayers.Layer" title="OpenLayers.Layer">layer</a>)</td><td>none</td><td>Sets a new base layer for the map. The provided layer should have already been added to the map. Changing the base layer causes all other base layers to be turned off, and all overlays to reproject themselves. </td></tr>
    
    </table>
  
  <h3>Control Management</h3>
    <table>
    <tr><td>  addControl(<a href="#OpenLayers.Control" title="OpenLayers.Control">control</a>)</td><td>none</td><td>Adds a control to the map.</td></tr>
    
    </table>
  
  <h3>Popup Management</h3>
    <table>
    <tr><td>  addPopup(<a href="#OpenLayers.Popup" title="OpenLayers.Popup">popup</a>, <span class="type" title="Boolean">exclusive</span>)</td><td>none</td><td>adds a popup to the map. If exclusive is set to true, then all other popups are closed first.</td></tr>
    <tr><td>  removePopup(<a href="#OpenLayers.Popup" title="OpenLayers.Popup">popup</a>)</td><td>none</td><td>removes an existing popup from the map.</td></tr>
  
    </table>
  
  <h3>Center management</h3>
    <table>
    <tr><td>  setCenter(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">lonlat</a>, <span class="type" title="int">zoom</span>)</td><td>none</td><td>Set the center point of the map. This then moves all the layers to the new center location as well, using each layer's 'moveTo' function. The 'zoom' is an integer from 0 to maxZoomLevel.</td></tr>
    <tr><td>  pan(<span class="type" title="Integer">dx</span>, <span class="type" title="Integer">dy</span>)</td><td>none</td><td>Allows user to pan by a value of screen pixels</td></tr>
    
    </table>
  
  <h3>Zoom Management</h3>
    <table>
    <tr><td>  zoomTo(<span class="type" title="int">zoom</span>)</td><td>none</td><td>zoom to the given zoom level.</td></tr>
    <tr><td>  zoomIn()</td><td>none</td><td>zoom in one level.</td></tr>
    <tr><td>  zoomOut()</td><td>none</td><td>zoom out one level.</td></tr>
    <tr><td>  zoomToExtent(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>)</td><td>none</td><td>Set the map such that the bounds fits within the current viewport area.</td></tr>
    <tr><td>  zoomToMaxExtent()</td><td>none</td><td>Zoom such that the entire bounds of the map is contained in the viewport.</td></tr>
    <tr><td>  zoomToScale(<span class="type" title="float">float</span>)</td><td>none</td><td>Zoom as close to the given scale as possible. Scale can be given as a ratio (1/24000) or as the denominator of the scale value (24000). zoomToScale will find the zoom level which most closely fits the requested scale and set that as the current zoom level.</td></tr>
  
    </table>
  
  <h3>Current Map Information</h3>
    <table>
    <tr><td>  getLonLatFromPixel(<a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">pixel</a>)</td><td><a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">OpenLayers.LonLat</a></td><td>Returns OpenLayers.LonLat corresponding to the given OpenLayers.Pixel, translated into lon/lat by the current base layer</td></tr>
    <tr><td>  getPixelFromLonLat(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">lonlat</a>)</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Returns OpenLayers.Pixel corresponding to the given OpenLayers.LonLat, translated by the current base layer  </td></tr>
    <tr><td>  getCenter()</td><td><a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">OpenLayers.LonLat</a></td><td>Returns a LonLat for the current center of the map</td></tr>
    <tr><td>  getZoom()</td><td><span class="type" title="Integer">Integer</span></td><td>Returns the current zoom level as an integer</td></tr>
    <tr><td>  getExtent()</td><td><a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">OpenLayers.Bounds</a></td><td>Returns a Bounds object which represents the geographic bounds of the current viewPort. </td></tr>
    <tr><td>  getSize()</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Returns the pixel size of the current map window.</td></tr>
    <tr><td>  getTileSize()</td><td><a href="#OpenLayers.Size" title="OpenLayers.Size">OpenLayers.Size</a></td><td>Returns tile size currently set for map.</td></tr>
    <tr><td>  getResolution()</td><td><span class="type" title="float">float</span></td><td>Returns the current resolution (units/pixel) of the map</td></tr>
    <tr><td>  getZoomForExtent(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>)</td><td>Zoom level in which the given bounds will fit</td><td>zooming to this level and setting the center of the map in the center of the bounds will always fit the given bounds in the map.</td></tr>
    
    </table>
  
  <h3>Default Map Information </h3>
    <table>
    <tr><td>  getMaxResolution()</td><td><span class="type" title="float">float</span></td><td>returns The Map's Maximum Resolution, the units/pixel at zoom level 0. The default is 1.40625, to match the approximate MaxResolution used by the commercial providers. </td></tr>
    <tr><td>  getMaxExtent()</td><td><a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">OpenLayers.Bounds</a></td><td>Return the max extent of the current base layer as defined on the layer. The default maxExtent for OpenLayers is -180,-90,180,90</td></tr>
    <tr><td>  getMaxZoomLevel()</td><td><span class="type" title="int">int</span></td><td>Returns the maximum zoom level that can be reached in the map for the current base layer</td></tr>
    <tr><td>  getMinZoomLevel()</td><td><span class="type" title="int">int</span></td><td>Returns the minimum zoom level that can be reached in the map for the current base layer</td></tr>
  
  </table>
  <h2>Events</h2>
  <table>
    <tr><td>  addlayer</td><td>a layer is added to the map</td></tr>
    <tr><td>  removelayer</td><td>a layer is removed from the map</td></tr>
    <tr><td>  changelayer</td><td>a layer has some property of it, typically visibility, changed.</td></tr>
    <tr><td>  changebaselayer</td><td>the current base layer changes</td></tr>
    <tr><td>  movestart</td><td>start of a movement in the map       </td></tr>
    <tr><td>  zoomend</td><td>end of a zoom action</td></tr>
    <tr><td>  mouseover</td><td>map is moused over</td></tr>
    <tr><td>  mouseout</td><td>map is no longer mousedout</td></tr>
    <tr><td>  mousemove</td><td>mouse moves inside map</td></tr>
    <tr><td>  dragstart</td><td>drag action starts</td></tr>
    <tr><td>  dragend</td><td>drag action ends</td></tr>
    
  </table>
  <h2>Options:</h2>
  <table>
    <tr><td>controls</td><td>an array of control objects to be added to the map. The default is [new OpenLayers.Control.MouseDefaults(), new OpenLayers.Control.PanZoom()] </td></tr>
    <tr><td>projection</td><td>used by WMS layers, should be an SRS identifier.</td></tr>
    <tr><td>maxZoomLevel</td><td>The number of zoom levels to use in the map.</td></tr>
    <tr><td>maxExtent</td><td><a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">OpenLayers.Bounds</a> to be used as the maximum extent of a map. The center of the map can not leave the maxExtent of the map when dragging.</td></tr>
    <tr><td>maxResolution</td><td>The units/pixel measurement at zoom level 0. Default is 1.40625</td></tr>
    <tr><td>resolutions</td><td>An array of resolutions to be used as an index when zooming. Overrides maxZoomLevel and maxResolution if present.</td></tr>
    <tr><td>minScale</td><td>The smallest scale value. minScale is preferred over maxResolution, if present.</td></tr>
    <tr><td>maxScale</td><td>The maximum scale the map should include. Overrides maxZoomLevel if present.</td></tr>
    <tr><td>units</td><td>The units of the map. Defaults to degrees. Neccesary when using scale in any way.</td></tr>
    <tr><td>scales</td><td>An array of scale values. Overrides maxResolution, maxZoomLevel, resolutions, and min/max scale if present.</td></tr>
    </table></div>
  <h1><a name="OpenLayers.Layer">OpenLayers.Layer</a></h1><div class="classref">
  
  Layers are the most important and central aspect of OpenLayers. They are the 
  core functionality for the software: Everything that ends up on the map comes
  from a layer. The base layer class is designed to be subclassed by any number
  of different layers.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer(name, options)</td><td>All layers have a name as their first param. This name is used to display the layer in the LayerSwitcher, and for other purposes. The options parameter is used to replace any parameters of the Layer which need to be different.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  clone()</td><td><a href="#OpenLayers.Layer" title="OpenLayers.Layer">OpenLayers.Layer</a></td><td>create a clone of the layer.</td></tr>
    <tr><td>  setName(<span class="type" title="String">name</span>)</td><td>none</td><td>Set the name of the layer to something different.</td></tr>
    <tr><td>  moveTo(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>, <span class="type" title="Boolean">zoomChanged</span>)</td><td>none</td><td>Not implemented here, but the general function called on dragging or setCenter, to move the Layer to a new geographic location.</td></tr>
    <tr><td>  reproject()</td><td>none</td><td>Subclassed by vector layers to redraw vectors when base layer changes.</td></tr>
    <tr><td>  setMap(map)</td><td>none</td><td>Set the map property of the layer. Also set the parameters which are inherited from the map.</td></tr>
    <tr><td>  getVisibility()</td><td><span class="type" title="Boolean">Boolean</span></td><td>Return true or false based on visibility of the layer.</td></tr>
    <tr><td>  setVisibility(<span class="type" title="Boolean">visible</span>)</td><td>none</td><td>Set the layer visibility, and trigger the appropriate events.</td></tr>
    <tr><td>  getResolution()</td><td><span class="type" title="float">float</span></td><td>Return the current resolution of the map, in units/pixel.</td></tr>
    <tr><td>  getExtent()</td><td><a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">OpenLayers.Bounds</a></td><td>Return the geographic extent of the current map viewport.</td></tr>
    <tr><td>  getZoomForExtent(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>)</td><td><span class="type" title="Integer">Integer</span></td><td>return the integer zoom which most closely matches the passed bounds.</td></tr>
    <tr><td>  getLonLatFromViewPortPx(<a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">pixel</a>)</td><td><a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">OpenLayers.LonLat</a></td><td>Returns an OpenLayers.LonLat which is the passed-in view port OpenLayers.Pixel, translated into lon/lat by the laye</td></tr>
    <tr><td>  getViewPortPxFromLonLat(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">lonlat</a>)</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, translated into view port pixels</td></tr>
    
  </table>
  <h2>Parameters</h2>
  <table>
    <tr><td>  isBaseLayer</td><td>This determines whether the layer is a base layer or an overlay. Only one Base Layer can be displayed on the map at once. Default is false.</td></tr>
    <tr><td>  projection</td><td>SRS string to describe the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  maxExtent</td><td>an OpenLayers.Bounds for the layer. This is the maximum geographic extent of the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  maxResolution</td><td>The number of degrees per pixel at zoom level 0. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  maxZoomLevel</td><td>The maximum zoom level for the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  minScale</td><td>The scale at zoom level 0. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  maxScale</td><td>The scale at the highest zoom level. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  units</td><td>The units the map is projected into. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
  
   
   
  
    
  </table></div>
  <h1><a name="OpenLayers.Layer.HTTPRequest">OpenLayers.Layer.HTTPRequest</a></h1><div class="classref">
  
  Sublass of Layer used for services which require initiating multiple HTTPRequests.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.HTTPRequest(name, url, params, options)</td><td>URL is the base URL to the layer. Params is a set of params to be included in the HTTP Request. Options is a set of options, extending the parameters of the layer.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  initResolutions()</td><td>none</td><td>Based on the current minScale/maxScale/maxResolution/maxZoomLevels/scales/resolutions parameters, initializes an array of 'zoom levels' as this.resolutions, which are then used as an index into when zooming.</td></tr>
    <tr><td>  getFullRequestString(newParams)</td><td><span class="type" title="String">String</span></td><td>Returns the full request string for a combination of the defaults on this layer and the parameters passed via newParams.</td></tr>
    
  </table></div>
  <h1><a name="OpenLayers.Layer.Grid">OpenLayers.Layer.Grid</a></h1><div class="classref">
  
  The Grid layer is the base layer for almost all image layers. This is a subclass of HTTPRequest.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.Grid(name, url, params, options)</td><td>URL is the base URL to the layer. Params is a set of params to be included in the HTTP Request. Options is a set of options, extending the parameters of the layer.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  getGridBounds()</td><td><a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">OpenLayers.Bounds</a></td><td>return geographic extent of the grid of tiles.</td></tr>
    <tr><td>  _initTiles()</td><td>none</td><td>Used to initialize the tile grid, creating image elements as neccesary and filling them with the correct images.</td></tr>
    <tr><td>  spiralTileLoad()</td><td>none</td><td>Called from _initTiles. Rotates through the grid filling in the images for the grid.</td></tr>
    <tr><td>  clone()</td><td><a href="#OpenLayers.Layer.Grid" title="OpenLayers.Layer.Grid">OpenLayers.Layer.Grid</a></td><td>create a clone of the layer. Subclassed from {OpenLayers.Layer}.</td></tr>
    <tr><td>  setMap(map)</td><td>none</td><td>Set the map property of the layer. Also set the parameters which are inherited from the map. This is also where the tileSize is retrieved from the map. Subclassed from <a href="#OpenLayers.Layer" title="OpenLayers.Layer">OpenLayers.Layer</a>.</td></tr>
    <tr><td>  moveTo(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>, <span class="type" title="Boolean">zoomChanged</span>)</td><td>none</td><td>Not implemented here, but the general function called on dragging or setCenter, to move the Layer to a new geographic location. Subclassed from <a href="#OpenLayers.Layer" title="OpenLayers.Layer">OpenLayers.Layer</a>.</td></tr>
    <tr><td>  getResolution()</td><td><span class="type" title="float">float</span></td><td>Return the current resolution of the map, in units/pixel. Subclassed from <a href="#OpenLayers.Layer" title="OpenLayers.Layer">OpenLayers.Layer</a>.</td></tr>
    <tr><td>  getExtent()</td><td><a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">OpenLayers.Bounds</a></td><td>Return the geographic extent of the current map viewport. Subclassed from {OpenLayers.Layer}.</td></tr>
    <tr><td>  getZoomForExtent(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>)</td><td><span class="type" title="Integer">Integer</span></td><td>return the integer zoom which most closely matches the passed bounds. Subclassed from <a href="#OpenLayers.Layer" title="OpenLayers.Layer">OpenLayers.Layer</a>.</td></tr>
    <tr><td>  getLonLatFromViewPortPx(<a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">pixel</a>)</td><td><a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">OpenLayers.LonLat</a></td><td>Returns an OpenLayers.LonLat which is the passed-in view port OpenLayers.Pixel, translated into lon/lat by the layer. Subclassed from {OpenLayers.Layer}.</td></tr>
    <tr><td>  getViewPortPxFromLonLat(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">lonlat</a>)</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, translated into view port pixels. Subclassed from {OpenLayers.Layer}.</td></tr>
  
  </table>
  <h2>Parameters</h2>
  <table>
    <tr><td>  buffer</td><td>Default 2. Number of tiles around the central map area which OpenLayers will preload so that dragging goes more smoothly.</td></tr>
    </table>
  
  <h3>Subclassed from OpenLayers.Layer</h3>
    <table>
    <tr><td>  isBaseLayer</td><td>This determines whether the layer is a base layer or an overlay. Only one Base Layer can be displayed on the map at once. Default is false.</td></tr>
    <tr><td>  projection</td><td>SRS string to describe the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  maxExtent</td><td>an OpenLayers.Bounds for the layer. This is the maximum geographic extent of the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  maxResolution</td><td>The number of degrees per pixel at zoom level 0. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  maxZoomLevel</td><td>The maximum zoom level for the layer. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  minScale</td><td>The scale at zoom level 0. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  maxScale</td><td>The scale at the highest zoom level. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
    <tr><td>  units</td><td>The units the map is projected into. If this is set on the map before the Layer is added to the map, it will inherit from the map.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Layer.WMS">OpenLayers.Layer.WMS</a></h1><div class="classref">
  
  The WMS layer allows one to connect to a WMS server to obtain images. Params are available as a hash on the layer object, however, all keys are upper-cased automatically for maximum compatibility with WMS servers, so a parameter which is set as 'layers' will be uppercased to LAYERS. Where 'layer' is your Javscript variable for the layer, layer.params.LAYERS is the value of the layers param as set by the constructor.
  
  If you wish to change params, you should use mergeNewParams, rather than accessing the parameters directly.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.WMS(name, url, params, options)</td><td>URL is the base URL to the layer. Params is a set of params to be included in the HTTP Request. Options is a set of options, extending the parameters of the layer.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  getURL(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>)</td><td><span class="type" title="String">String</span></td><td>Returns a WMS URL for the given bounds based on the properties of the layer.</td></tr>
    All other methods are inherited from <a href="#OpenLayers.Layer.Grid" title="OpenLayers.Layer.Grid">OpenLayers.Layer.Grid</a>
    
  </table>
  <h2>Options </h2>
  <table>
    <tr><td>  isBaseLayer</td><td>WMS layers default to being base layers unless one of their parameters is 'transparent':'true'.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Layer.KaMap">OpenLayers.Layer.KaMap</a></h1><div class="classref">
  
  ka-Map is a Mapserver wrapper which performs caching and works around many of the deficiencies with tiling when using Mapserver as a WMS client.
  
  </table>
  <h2>Construtor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.KaMap(name, url, params, options)</td><td>URL is the url of the tile.php for KaMap.</td></tr>
  
  </table></div>
  <h1><a name="OpenLayers.Layer.EventPane">OpenLayers.Layer.EventPane</a></h1><div class="classref">
  
  Designed to act as a super-class for layers which need OpenLayers to intercept click events. Google Maps and Microsoft Virtual Earth both use this functionality, in order to allow for actions like the rubber-band-zoom/zoombox functionality. This Layer is not designed to be used on its own, but instead to act as an intermediary between the user and layers which have their own click handlers.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.EventPane(name, options)</td><td>Only designed to be used by subclasses.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Layer.Google">OpenLayers.Layer.Google</a></h1><div class="classref">
  
  The Google Layer in OpenLayers allows you to include Google Maps functionality in your OpenLayers maps. In order to use the Google Layer, you must first obtain an API key for Google Maps, and include the Google Maps API script in your page. Once you have done this, 
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.Google(name, options?)</td><td>Constructor for Google layer. Accepts name and options.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  getOLLonLatFromGLatLng(GLonLat)</td><td><a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">OpenLayers.LonLat</a></td><td>Convert from GLatLon to OpenLayers LonLat</td></tr>
    <tr><td>  getGLatLngFromOLLonLat(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">lonlat</a>)</td><td>GLatLon</td><td>Convert From OpenLayers LonLat to GLatLon</td></tr>
    <tr><td>  getOLPixelFromGPoint(GPoint)</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Convert from GPoint to OpenLayers.Pixel</td></tr>
    <tr><td>  getGPointFromOLPixel(<a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">pixel</a>)</td><td>GPoint</td><td>Create GPoint from OpenLayers Pixel.</td></tr>
    
  </table>
  <h2>Parameters</h2>
  <table>
    <tr><td>  type</td><td>one of G_MAP, G_SATELLITE_MAP, G_HYBRID_MAP, used to choose the type of map to display.</td></tr>
    
  </table></div>
  <h1><a name="OpenLayers.Layer.VirtualEarth">OpenLayers.Layer.VirtualEarth</a></h1><div class="classref">
  
  The Virtual Earth Layer in OpenLayers allows you to include Virtual Earth Maps in your OpenLayers maps. In order to use the Virtual Earth Layer, you must first include the Virtual Earth API script in your page. Once you have done this, simply add the layer to your map.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.VirtualEarth(name)</td><td>Constructor for Virtual Earth layer. Accepts name.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  getOLLonLatFromVELatLng(VELatLon)</td><td><a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">OpenLayers.LonLat</a></td><td>Convert from VELatLon to OpenLayers LonLat</td></tr>
    <tr><td>  getVELatLngFromOLLonLat(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">lonlat</a>)</td><td>VELatLon</td><td>Convert From OpenLayers LonLat to VELatLon</td></tr>
    <tr><td>  getOLPixelFromVEPoint(Msn.VE.Pixel)</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Convert from VEPoint to OpenLayers.Pixel</td></tr>
    <tr><td>  getGPointFromOLPixel(<a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">pixel</a>)</td><td>Msn.VE.Pixel</td><td>Create Msvn.VE.Pixel from OpenLayers Pixel.</td></tr>
    
    
  </table></div>
  <h1><a name="OpenLayers.Layer.Markers">OpenLayers.Layer.Markers</a></h1><div class="classref">
  
  The base class for all vector drawing, The OpenLayers.Layer.Markers layer is the primary way to get annotations into your map. 
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.Markers(name, options)</td><td>Name and options for layer.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  addMarker(<a href="#OpenLayers.Marker" title="OpenLayers.Marker">Marker</a>)</td><td>none</td><td>Adds a marker to the layer, sets the map object on the marker, and calls drawMarker on the marker.</td></tr>
    <tr><td>  removeMarker(<a href="#OpenLayers.Marker" title="OpenLayers.Marker">Marker</a>)</td><td>none</td><td>Remove the marker from the layer and map.</td></tr>
    <tr><td>  clearMarkers()</td><td>none</td><td>Remove all markers from the layer with removeMarker.</td></tr>
    <tr><td>  redraw()</td><td>none</td><td>Redraw all markers. Used so that markers can change their position when a base layer changes.</td></tr>
    <tr><td>  drawMarker</td><td>none</td><td>Call marker.draw(px), which passes the Pixel of the latitude/longitude in the map viewport to the marker. adds the marker to the div, and marks the marker as drawn.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Layer.Text">OpenLayers.Layer.Text</a></h1><div class="classref">
  
  Subclass of Markers layer which retrieves CSV file from the web, and parses content to create markers and popups.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.Text(name, options)</td><td>Pass in name, and set location: 'URL of CSV file' in the options hash.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  parseData(ajaxRequest)</td><td>none</td><td>Parses returned CSV file. </td></tr>
  
  </table></div>
  <h1><a name="OpenLayers.Layer.GeoRSS">OpenLayers.Layer.GeoRSS</a></h1><div class="classref">
  
  GeoRSS layer. Pass a name and location of a GeoRSS file on the web, and a marker will be added to the map for each item in the GeoRSS feed. Uses OpenLayers.loadURL to load the XML, parses the data, and adds markers to the map. The GeoRSS layer supports 1.0 and 2.0 in IE and Firefox, and supports 2.0 in Safari. (Ticket #111 explains the reason for this difference.)
  
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.GeoRSS(name, url)</td><td>Name and location of GeoRSS XML file.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  parseData(ajaxResponse)</td><td>none</td><td>Callback for the loadURL call. This function parses the XML for the GeoRSS feed, creating markers for the data and adding a popup to each marker. It populates an array of features as 'this.features'.</td></tr>
    <tr><td>  markerClick(Event)</td><td>none</td><td>Action to perform when a marker is clicked.</td></tr>
    <tr><td>  clearFeatures()</td><td>none</td><td>Removes all features and markers from the map.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Layer.Boxes">OpenLayers.Layer.Boxes</a></h1><div class="classref">
  
  A subclass of the markers layer, this layer draws boxes using div elements
  instead of icons using images.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Layer.Boxes(name, options)</td><td>Same as OpenLayers.Layer.Markers.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Icon">OpenLayers.Icon</a></h1><div class="classref">
  
  Icon is used as the visual representation of a Marker. Creating such a representation requres up to three parts: An Icon URL, a size, and an offset. The icon URL is a pointer to an image to use as an icon. The size is the size of the image, as an <a href="#OpenLayers.Size" title="OpenLayers.Size">OpenLayers.Size</a> object, and the offset is the position of the top left corner of the image in pixels, relative to the latitude and longitude of the Marker.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Icon(<span class="type" title="String">url</span>, <a href="#OpenLayers.Size" title="OpenLayers.Size">size</a>, <a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">offset</a>)</td><td>creates a new icon.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  clone()</td><td><a href="#OpenLayers.Icon" title="OpenLayers.Icon">OpenLayers.Icon</a></td><td>Create an exact copy of the icon.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Marker">OpenLayers.Marker</a></h1><div class="classref">
  
  Instantiate class <a href="#OpenLayers.Marker" title="OpenLayers.Marker">OpenLayers.Marker</a> in order to create a marker.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Marker(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">lonlat</a>, <a href="#OpenLayers.Icon" title="OpenLayers.Icon">icon</a>?  )</td><td>Creates a new marker object. This object must be added to a Marker layer and will then be displayed. The icon can be left null</td><td>if this is the case, then the default OpenLayers icon will be used.</td></tr>
    
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  onScreen()</td><td><span class="type" title="boolean">boolean</span></td><td>Returns whether or not the marker is currently visible on screen.</td></tr>
    <tr><td>  inflate(<span class="type" title="float">float</span>)</td><td>none</td><td>Changes the size of the Icon by a factor of the passed float.</td></tr>
    <tr><td>  display(<span class="type" title="string">string</span>)</td><td>none</td><td>Sets the style.display property of the Icon.</td></tr>
  
  </table>
  <h2>Events</h2>
  <table>
    Standard browser events are available.
  
  </table></div>
  <h1><a name="OpenLayers.Marker.Box">OpenLayers.Marker.Box</a></h1><div class="classref">
  
  A different kind of Marker, designed to be added to a Boxes layer instead of a Markers layer.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Marker.Box(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>, borderColor, borderWidth)</td><td>Set up a box. Defaults are red, with a width of 2.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  setBorder(color, width)</td><td>sets properties of border color and width.</td></tr>
  
  </table></div>
  <h1><a name="OpenLayers.Tile">OpenLayers.Tile</a></h1><div class="classref">
  
  This is a class designed to designate a single tile, however
  it is explicitly designed to do relatively little. Tiles store information
    <tr><td>about themselves</td><td>such as the URL that they are related to, and their </td></tr>
  size - but do not add themselves to the layer div automatically, for 
  example.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Tile(<a href="#OpenLayers.Layer" title="OpenLayers.Layer">layer</a>, <a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">position</a>, <a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>, <span class="type" title="String">url</span>, <a href="#OpenLayers.Size" title="OpenLayers.Size">size</a>)</td><td>Create a new tile, with properties passed.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Tile.Image">OpenLayers.Tile.Image</a></h1><div class="classref">
  
  The image tile is designed to hold images for all types of layers, from WMS to KaMap to WorldWind.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Tile.Image(<a href="#OpenLayers.Layer" title="OpenLayers.Layer">layer</a>, <a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">position</a>, <a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>, <span class="type" title="String">url</span>, <a href="#OpenLayers.Size" title="OpenLayers.Size">size</a>)</td><td>Create a new tile, with properties passed.</td></tr>
    
  </table></div>
  <h1><a name="OpenLayers.Tile.WFS">OpenLayers.Tile.WFS</a></h1><div class="classref">
  
  The WFS tile allows you to load any number of WFS URLs into a single tile. 
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Tile.WFS(<a href="#OpenLayers.Layer" title="OpenLayers.Layer">layer</a>, <a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">position</a>, <a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>, <span class="type" title="String">urls</span>, <a href="#OpenLayers.Size" title="OpenLayers.Size">size</a>)</td><td>Create a new tile, with properties passed. The major difference between this tile and other tiles is what it does with results: The WFS tile is designed to parse XML responses, and create features for each item in the response. </td></tr>
  </table></div>
  <h1><a name="OpenLayers.Control">OpenLayers.Control</a></h1><div class="classref">
  
  Base class from which controls are derived. Controls are elements of the map used to control things like zoom, layer status, or to provide information to the user about the status of the map, such as scale or copyright information.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Control(<span class="type" title="Object">options</span>?)</td><td>Creates a new control. The options here are used to control parameters of the control. The base control defines only "position", which is designed to be an <a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a> which is the top-left of the location of the control relative to the map div. </td></tr>
  
  </table>
  <h2>Parameters</h2>
  <table>
    <tr><td>  position</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a> to use as the top-left corner of the control div, relative to the map area.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Control.LayerSwitcher">OpenLayers.Control.LayerSwitcher</a></h1><div class="classref">
  
  This control will by default display a small image in the upper right corner of the map. When clicked, this image expands into a control which allows one to select between multiple types of layers, seperated into two types: Base Layers and Overlays. Only one base layer can be selected at a time, and is enforced by a radio button control being used. Multiple overlays can be selected at once, and a checkbox control is visible for this functionality.
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Control.LayerSwitcher(<span class="type" title="Object">options</span>?)</td><td>Creates a new control.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  maximizeControl()</td><td>none</td><td>Expand the layer switcher control.</td></tr>
    <tr><td>  minimizeControl()</td><td>none</td><td>Close the layer switcher control.</td></tr>
  
  </table>
  <h2>Parameters</h2>
  <table>
    <tr><td>  position</td><td>(inherited from <a href="#OpenLayers.Control" title="OpenLayers.Control">OpenLayers.Control</a>) {OpenLayers.Pixel} to use as the top-left corner of the control div, relative to the map area.</td></tr>
    <tr><td>  activeColor</td><td>The color to use for the background of the layer switcher div.</td></tr>
  
  </table></div>
  <h1><a name="OpenLayers.Control.MouseDefaults">OpenLayers.Control.MouseDefaults</a></h1><div class="classref">
  
  Control to set up mouse handling. This includes clicks, double clicks, scrollwheel events, and mouse movement. There are a number of functions which act as the default handlers for these events: if you wish to create your own mouse control which behaves differently, you should create a subclass of MouseDefaults, replacing the functions whose behavior you wish to change.
  
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Control()</td><td>Creates a new control. No options available. </td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  defaultClick</td><td>none</td><td>This event takes place when a click event occurs on the map.</td></tr>
    <tr><td>  defaultDblClick</td><td>none</td><td>This event re-centers the map on the clicked location.</td></tr>
    <tr><td>  defaultMouseDown</td><td>none</td><td>This event starts a dragging event, so that the map can be dragged. If the shift key is held, it starts a 'zoombox' or rubber-band-zoom action instead.</td></tr>
    <tr><td>  defaultMouseMove</td><td>none</td><td>If a mouseDrag is in operation, this function causes the map to move to follow the cursor. If a zoombox is in place, this increases the size of the zoombox element to match the cursor.</td></tr>
    <tr><td>  defaultMouseUp</td><td>none</td><td>This function is called when a mouseup event is received, and either sets the center of the map to be the final location or zooms to the zoombox if enabled.</td></tr>
    <tr><td>  defaultMouseOut</td><td>none</td><td>This calls defaultMouseUp, so that when you mouse out of the map div, the events are stopped.</td></tr>
    <tr><td>  defaultWheelUp</td><td>none</td><td>Zooms in one level. Called by onWheelEvent</td></tr>
    <tr><td>  defaultWheelDown</td><td>none</td><td>Zooms out one level. Called by onWheelEvent.</td></tr>
    <tr><td>  onWheelEvent</td><td>none</td><td>catches the map wheel event, and handles it, zooming appropriately. </td></tr>
    
  </table></div>
  <h1><a name="OpenLayers.Control.MouseToolbar">OpenLayers.Control.MouseToolbar</a></h1><div class="classref">
  
  Control to set up mouse handling. This includes clicks, double clicks, scrollwheel events, and mouse movement. There are a number of functions which act as the default handlers for these events: if you wish to create your own mouse control which behaves differently, you should create a subclass of MouseToolbar, replacing the functions whose behavior you wish to change. Additionally, a toolbar of images can be clicked to start events, as well as using the keyboard shortcuts.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Control.MouseToolbar(<a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">position</a>, <span class="type" title="String">direction</span>)</td><td>Creates a new control. The direction of the control can be either "vertical" or "horizontal". The default is vertical.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  defaultClick</td><td>none</td><td>This event takes place when a click event occurs on the map.</td></tr>
    <tr><td>  defaultDblClick</td><td>none</td><td>This event re-centers the map on the clicked location.</td></tr>
    <tr><td>  defaultMouseDown</td><td>none</td><td>This event starts a dragging event, so that the map can be dragged. If the shift key is held, it starts a 'zoombox' or rubber-band-zoom action instead.</td></tr>
    <tr><td>  defaultMouseMove</td><td>none</td><td>If a mouseDrag is in operation, this function causes the map to move to follow the cursor. If a zoombox is in place, this increases the size of the zoombox element to match the cursor.</td></tr>
    <tr><td>  defaultMouseUp</td><td>none</td><td>This function is called when a mouseup event is received, and either sets the center of the map to be the final location or zooms to the zoombox if enabled.</td></tr>
    <tr><td>  defaultMouseOut</td><td>none</td><td>This calls defaultMouseUp, so that when you mouse out of the map div, the events are stopped.</td></tr>
    
  </table></div>
  <h1><a name="OpenLayers.Control.PanZoom">OpenLayers.Control.PanZoom</a></h1><div class="classref">
  
  Creates a small toolset for controlling the location of the map with panning and zooming, including four directional arrows, a zoom in and zoom out, and one button which zooms to the max extent of the map.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Control.PanZoom(<span class="type" title="Object">options</span>)</td><td>Creates a new panzoom control.</td></tr>
  
  </table>
  <h2>Parameters</h2>
  <table>
    <tr><td>  slideFactor</td><td>Number of pixels by which to slide the map when a pan arrow is clicked.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Control.PanZoom">OpenLayers.Control.PanZoom</a></h1><div class="classref">
  
  Creates a small toolset for controlling the location of the map with panning and zooming, including four directional arrows, a zoom in and zoom out, and a bar on which a slider can be moved to zoom in or out by multiple stops at once.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Control.PanZoomBar()</td><td>Creates a new panzoombar control.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Control.Permalink">OpenLayers.Control.Permalink</a></h1><div class="classref">
  
  A small control which updates a "Permalink" to the map every time the viewport changes. This allows users to copy a link to a specfic map view. By default, it places itself in the lower right corner of the map. This control must be added to the map after a baselayer has been set.  
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Control.Scale(<span class="type" title="DOMElement">element</span>?, <span class="type" title="String">base</span>)</td><td>Creates a new permalink control. The DOMElement is used, if passed, as the element on which the 'href' is set. If you prefer to put this link on an element outside of the map, set this element to an anchor element to have its href updated when the map moves. If you wish to make the link go to some other URL (for example, an editing interface rather than the current URL), the 'base' property can be used, to which the ?lat=&lon=&zoom= will be appended after the map has moved.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Control.Scale">OpenLayers.Control.Scale</a></h1><div class="classref">
  
  A small control which displays an informative scale value, a la "1:50K" , by defualt in the lower right of the map viewport.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Control.Scale(<span class="type" title="DOMElement">element</span>?)</td><td>Creates a new scale control. The DOMElement is used, if passed, to put the scale inside</td><td>this allows you to have the scale displayed in some location outside the map. </td></tr>
  </table></div>
  <h1><a name="OpenLayers.LonLat">OpenLayers.LonLat</a></h1><div class="classref">
  
  This class represents a geographic coordinate pair, either projected or unprojected.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.LonLat(<span class="type" title="float">lon</span>, <span class="type" title="float">lat</span>)</td><td>Create LonLat.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  toString()</td><td><span class="type" title="String">String</span></td><td>Converts to human readable string.</td></tr>
    <tr><td>  toShortString()</td><td><span class="type" title="String">String</span></td><td>Converts to short human readable string.</td></tr>
    <tr><td>  clone()</td><td><a href="#OpenLayers.Size" title="OpenLayers.Size">OpenLayers.Size</a></td><td>Returns a copy of the pixel.</td></tr>
    <tr><td>  equals(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">ll</a>)</td><td><span class="type" title="Boolean">Boolean</span></td><td>Compares two LonLats. </td></tr>
    <tr><td>  add(<span class="type" title="int">lon</span>, <span class="type" title="int">lat</span>)</td><td><a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">OpenLayers.LonLat</a></td><td>add x and y to the current coordinates.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Size">OpenLayers.Size</a></h1><div class="classref">
  
  This class represents a width/height pair.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Size(<span class="type" title="float">h</span>, <span class="type" title="float">w</span>)</td><td>Create Size.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  toString()</td><td><span class="type" title="String">String</span></td><td>Converts to human readable string.</td></tr>
    <tr><td>  clone()</td><td><a href="#OpenLayers.Size" title="OpenLayers.Size">OpenLayers.Size</a></td><td>Returns a copy of the pixel.</td></tr>
    <tr><td>  add(<span class="type" title="int">x</span>, <span class="type" title="int">y</span>)</td><td><a href="#OpenLayers.Size" title="OpenLayers.Size">OpenLayers.Size</a></td><td>add x and y to the current coordinates.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Pixel">OpenLayers.Pixel</a></h1><div class="classref">
  
  This class represents a screen coordinate in x and y coordinates.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Pixel(<span class="type" title="float">x</span>, <span class="type" title="float">y</span>)</td><td>Create Pixel.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  toString()</td><td><span class="type" title="String">String</span></td><td>Converts to human readable string.</td></tr>
    <tr><td>  clone()</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Returns a copy of the pixel.</td></tr>
    <tr><td>  equals(<a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">px</a>)</td><td><span class="type" title="Boolean">Boolean</span></td><td>Tests for equivilance.</td></tr>
    <tr><td>  add(<span class="type" title="int">x</span>, <span class="type" title="int">y</span>)</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>add x and y to the current coordinates.</td></tr>
    <tr><td>  offset(<a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">pixel</a>)</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Add pixels together.</td></tr>
  </table></div>
  <h1><a name="OpenLayers.Bounds">OpenLayers.Bounds</a></h1><div class="classref">
  
  This class represents a bounding box. Data stores as left, bottom, right, top floats.
  
  </table>
  <h2>Constructor</h2>
  <table>
    <tr><td>  OpenLayers.Bounds(left, bottom, right, top)</td><td>Create new Bounds.</td></tr>
  
  </table>
  <h2>Methods</h2>
  <table>
    <tr><td>  clone()</td><td><a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">OpenLayers.Bounds</a></td><td>Return copy of the current bounds.</td></tr>
    <tr><td>  toString()</td><td><span class="type" title="String">String</span></td><td>Return bounds as string. </td></tr>
    <tr><td>  toBBOX()</td><td><span class="type" title="String">String</span></td><td>Return bounds as simple string, usable for WMS.</td></tr>
    <tr><td>  getWidth()</td><td><span class="type" title="float">float</span></td><td>Return width of bounds.</td></tr>
    <tr><td>  getHeight()</td><td><span class="type" title="float">float</span></td><td>Return height of bounds.</td></tr>
    <tr><td>  getSize()</td><td><a href="#OpenLayers.Size" title="OpenLayers.Size">OpenLayers.Size</a></td><td>Return size of bounds.</td></tr>
    <tr><td>  getCenterPixel()</td><td><a href="#OpenLayers.Pixel" title="OpenLayers.Pixel">OpenLayers.Pixel</a></td><td>Return center of bounds as pixel.</td></tr>
    <tr><td>  getCenterLonLat()</td><td><a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">OpenLayers.LonLat</a></td><td>Return center of bounds as LonLat.</td></tr>
    <tr><td>  equals(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>)</td><td><span class="type" title="Boolean">Boolean</span></td><td>whether or not the bounds are equivilant.</td></tr>
    <tr><td>  add(<span class="type" title="float">x</span>, <span class="type" title="float">y</span>)</td><td><a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">OpenLayers.Bounds</a></td><td>Shift bounds by x and y. </td></tr>
    <tr><td>  contains(<span class="type" title="float">x</span>, <span class="type" title="float">y</span>, <span class="type" title="Boolean">inclusive</span>)</td><td><span class="type" title="Boolean">Boolean</span></td><td>Return Whether or not the passed-in coordinates are within this bounds </td></tr>
    <tr><td>  containsBounds(<a href="#OpenLayers.Bounds" title="OpenLayers.Bounds">bounds</a>, <span class="type" title="Boolean">partial</span>, <span class="type" title="Boolean">inclusive</span>)</td><td><span class="type" title="Boolean">Boolean</span></td><td>Returns whether or not the passed-in OpenLayers.Bounds object is contained within this bounds. partial indicates whether bounds must be contained or only overlap. Inclusive determines whether border is included.</td></tr>
    <tr><td>  determineQuadrant(<a href="#OpenLayers.LonLat" title="OpenLayers.LonLat">lonlat</a>)</td><td><span class="type" title="String">String</span></td><td>Determine which quadrant the LonLat is in. Returns combination of "b" or "t" and "l" or "r".</td></tr>
  </table></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/BaseLayers.html
  
  Index: BaseLayers.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 100%;
              height: 512px;
              border: 1px solid black;
              background-color: blue;
          }
      </style>
  
      <!-- this gmaps key generated for http://openlayers.org/dev/ -->
      <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghSPUCi5aRYVveCcVYxzezM4iaj_gxQ9t-UajFL70jfcpquH5l1IJ-Zyyw'></script>
      <!-- Localhost key -->
      <!-- <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTS6gjckBmeABOGXIUiOiZObZESPg'></script>-->
      <script src='http://dev.virtualearth.net/mapcontrol/v3/mapcontrol.js'></script>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var lon = 5;
          var lat = 40;
          var zoom = 5;
          var map, markers;
          var barcelona = new OpenLayers.LonLat(2.13134765625,
                                                41.37062534198901);
          var madrid = new OpenLayers.LonLat(-3.6968994140625,
                                                40.428314208984375);
  
          function init(){
              map = new OpenLayers.Map( $('map') );
  
              var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                        "http://labs.metacarta.com/wms/vmap0", 
                        {layers: 'basic'} );
              var google = new OpenLayers.Layer.Google( "Google Hybrid" , {type: G_HYBRID_MAP });
              var ve = new OpenLayers.Layer.VirtualEarth( "VE"); 
              
  
              map.addLayers([wms, google, ve]);
  
              markers = new OpenLayers.Layer.Markers("markers");
              map.addLayer(markers);
  
              map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
              map.addControl( new OpenLayers.Control.LayerSwitcher() );
  
          }
          
          function add() {
              var url = 'http://boston.openguides.org/markers/AQUA.png';
              var sz = new OpenLayers.Size(10, 17);
              var calculateOffset = function(size) {
                                  return new OpenLayers.Pixel(-(size.w/2), -size.h);
                               };           
              var icon = new OpenLayers.Icon(url, sz, null, calculateOffset);
              marker = new OpenLayers.Marker(barcelona, icon);
              markers.addMarker(marker);
  
              marker = new OpenLayers.Marker(madrid, icon.clone());
              markers.addMarker(marker);
  
          }
  
          function remove() {
              markers.removeMarker(marker);
          }
                  
      // -->
  
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers With WMS, Google, VE Example</h1>
      <div id="map"></div>
      <div style="background-color:green" onclick="add()"> click to add a marker to the map</div>
      <div style="background-color:red" onclick="remove()"> click to remove the marker from the map</div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/LayerSwitcher.html
  
  Index: LayerSwitcher.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 800px;
              height: 475px;
              border: 1px solid black;
          }
      </style>
      <!-- gmaps api key for http://openlayers.org/~euzuro -->
      <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghQELW4Ku31wWCtlZquTlkHLCFh9LBTYvc_eIShlmo0YZwSitw0fQ1ZyXA'></script>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var lon = 5;
          var lat = 40;
          var zoom = 5;
          var map, layer, glayer;
  
          OpenLayers.ProxyHost = "/proxy/?url=";
          function init(){
              map = new OpenLayers.Map( $('map') );
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                      "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
              map.addLayer(layer);
  
              glayer = new OpenLayers.Layer.Google("goog");
              map.addLayer(glayer);
  
              layer = new OpenLayers.Layer.WFS( "wfs",
                  "http://labs.metacarta.com/search/WFS?",
                  {maxfeatures: 1},
                  { featureClass: OpenLayers.Feature.WFS});
              map.addLayer(layer);
  
  
              map.setCenter(new OpenLayers.LonLat(0, 0), 2);
  
              map.addControl( new OpenLayers.Control.LayerSwitcher() );
          }
          
          function add() {
  
              markers2 = new OpenLayers.Layer.Markers("markers2");
              map.addLayer(markers2);
  
  
              var icon = new OpenLayers.Icon('http://boston.openguides.org/markers/AQUA.png',new OpenLayers.Size(10,17));
              marker = new OpenLayers.Marker(new OpenLayers.LonLat(2, 41), icon);
              markers.addMarker(marker);
          }
  
  
          function remove() {
              markers.removeMarker(marker);
          }
          
  
          // -->
      </script>
    </head>
    <body onload="init()">
      <div id="map"></div>
      <div style="background-color:green" onclick="add()"> click to add the marker to the map</div>
      <div style="background-color:red" onclick="remove()"> click to remove the marker from the map</div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/boxes.html
  
  Index: boxes.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          box_extents = [
              [-10, 50, 5, 60],
              [-75, 41, -71, 44],
              [-122.6, 37.6, -122.3, 37.9],
              [10, 10, 20, 20]
          ];
  
          function init(){
              var map = new OpenLayers.Map('map');
  
              var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'} );
  
              var boxes  = new OpenLayers.Layer.Boxes( "Boxes" );
  
              for (var i = 0; i < box_extents.length; i++) {
                  ext = box_extents[i];
                  bounds = new OpenLayers.Bounds(ext[0], ext[1], ext[2], ext[3]); 
                  box = new OpenLayers.Marker.Box(bounds);
                  box.events.register("click", box, function (e) {
                      this.setBorder("yellow");
                  });
                  boxes.addMarker(box);
              }
  
              map.addLayers([ol_wms, boxes]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.zoomToMaxExtent();
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/ciesin.html
  
  Index: ciesin.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var map = new OpenLayers.Map('map');
  
              var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'} );
  
              var jpl_wms = new OpenLayers.Layer.WMS( "Population Density 2000",
                  "http://beta.sedac.ciesin.columbia.edu/mapserver/wms/gpw2000", 
                  {layers: "gpw"});
              var cie_wms = new OpenLayers.Layer.WMS( "Human Footprint",
                  "http://beta.sedac.ciesin.columbia.edu/mapserver/wms/hfoot", 
                  {layers: "hfoot"});
  
              jpl_wms.setVisibility(false);
  
              map.addLayers([ol_wms, jpl_wms, cie_wms]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              // map.setCenter(new OpenLayers.LonLat(0, 0), 0);
              map.zoomToMaxExtent();
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/click.html
  
  Index: click.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var map = new OpenLayers.Map('map');
  
              var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'} );
  
              var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
                  "http://wms.jpl.nasa.gov/wms.cgi", 
                  {layers: "modis,global_mosaic"});
  
              jpl_wms.setVisibility(false);
  
              map.addLayers([ol_wms, jpl_wms]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              // map.setCenter(new OpenLayers.LonLat(0, 0), 0);
              map.zoomToMaxExtent();
              map.events.register("click", map, function(e) { 
                  var lonlat = map.getLonLatFromViewPortPx(e.xy);
                  alert("You clicked near " + lonlat.lat + " N, " +
                                            + lonlat.lon + " E");
              });
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/controls.html
  
  Index: controls.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var map = new OpenLayers.Map('map', { controls: [] });
  
              var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0",
                  {layers: 'basic'} );
  
              var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
                  "http://wms.jpl.nasa.gov/wms.cgi", 
                  {layers: "modis,global_mosaic"});
  
              var dm_wms = new OpenLayers.Layer.WMS( "DM Solutions Demo",
                  "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
                  {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
                           "prov_bound,fedlimit,rail,road,popplace",
                   transparent: "true", format: "image/png" });
  
              jpl_wms.setVisibility(false);
              dm_wms.setVisibility(false);
  
              map.addLayers([ol_wms, jpl_wms, dm_wms]);
              map.addControl(new OpenLayers.Control.PanZoomBar());
              map.addControl(new OpenLayers.Control.MouseToolbar());
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.addControl(new OpenLayers.Control.Permalink());
              map.addControl(new OpenLayers.Control.Permalink($('permalink')));
              if (!map.getCenter()) map.zoomToMaxExtent();
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <a style="float:right" href="" id="permalink">Permalink</a>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/doubleSetCenter.html
  
  Index: doubleSetCenter.html
  ===================================================================
  <html>
  <head>
  <script src="../lib/OpenLayers.js"></script>
  </head>
  <body>
    <div style="width:100%; height:100%" id="map"></div>
    <script defer="defer" type="text/javascript">
      var map = new OpenLayers.Map('map');
      var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
          "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
      map.addLayer(wms);
      map.setCenter(new OpenLayers.LonLat(100,10));
      map.setCenter(new OpenLayers.LonLat(1,1));
    </script>
  </body>
  </html>
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/example.html
  
  Index: example.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var map = new OpenLayers.Map('map');
  
              var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}); 
  
              var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
                  "http://wms.jpl.nasa.gov/wms.cgi", 
                  {layers: "modis,global_mosaic"});
  
              var dm_wms = new OpenLayers.Layer.WMS( "DM Solutions Demo",
                  "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
                  {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
                           "prov_bound,fedlimit,rail,road,popplace",
                   transparent: "true", format: "image/png" });
  
              map.addLayers([ol_wms, jpl_wms, dm_wms]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              // map.setCenter(new OpenLayers.LonLat(0, 0), 0);
              map.zoomToMaxExtent();
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/freemap.html
  
  Index: freemap.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
  
      <style type="text/css">
      body { font-family: sans-serif; font-weight: bold; font-size: .8em; }
      body {
  	border: 0px;
  	margin: 0px;
  	padding: 0px;
      }
      #map {
  	width: 65%;
  	height: 100%;
  	border: 0px;
  	padding: 0px;
      }
      </style>
  
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
        <!--
  	var lat = 900863; 
  	var lon = 235829;
  	var zoom = 6;
          var map, layer;
  
          function init(){
  	    // these should be object methods or something
              map = new OpenLayers.Map( $('map') );
              var basemap = new OpenLayers.Layer.WMS( "Boston", 
                  "http://boston.freemap.in/cgi-bin/mapserv?",
                  {map: '/www/freemap.in/boston/map/gmaps.map', layers: 'border,water,roads', format: 'png', 'transparent': 'off'},
                  {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
              var rapid = new OpenLayers.Layer.WMS( "Rapid Transit", 
                  "http://boston.freemap.in/cgi-bin/mapserv?",
                  {map: '/www/freemap.in/boston/map/mass.map', layers: 'rapid_transit', format: 'png', transparent:'true'} );
              var buildings = new OpenLayers.Layer.WMS( "Buildings", 
                  "http://boston.freemap.in/cgi-bin/mapserv?",
                  {map: '/www/freemap.in/boston/map/mass.map', layers: 'buildings', format: 'png', transparent:'true'} );
                  
              map.addLayer(basemap);
              map.addLayer(rapid);
              map.addLayer(buildings);
              map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
          }
     function getaddress() {
        if (!document.getElementById('address').value) {return; }
                      document.getElementById('status').innerHTML = "Finding address...";
        var address = document.getElementById('address').value;
        address = escape(address);
        addr = "/geocode.cgi?address="+address;
        var handler = XMLrequest();
        if (handler) {
                 handler.onreadystatechange=function() {
                     if (handler.readyState == 4 && handler.status == 200) {
                     var latlon = handler.responseText;
                     latlon = latlon.split(",");
                     if (latlon[1]) {
                         map.setCenter(new OpenLayers.LonLat(parseFloat(latlon[1]), parseFloat(latlon[0])), 15);
                         document.getElementById('status').innerHTML = "";
                     
                     } else {
                      document.getElementById('status').innerHTML = "Could not find address, sorry.";
                     }
                     }
                 }
                 handler.open("GET", addr, true);
                 handler.send('');
             }
     }
  function XMLrequest() {
  xmlhttp={};
  try {
    xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) { }
  }
  try {
    xmlhttp = new XMLHttpRequest();
  } catch (e) {}
  return xmlhttp;
  }
  function setLink() {
  	var link = document.getElementById("link");
  	var center = map.getCenter();
  	var zoom = map.getZoom();
  	link.innerHTML="http://boston.freemap.in/?zoom="+zoom+"&amp;lat="+center.lat+"&amp;lon="+center.lon;
  }	
  //      -->
      </script>
    </head>
  
  <body onload="init()">
  <div id="right" style="float:right;width:30%;padding:10px;" ><h1>Boston Free Map</h1><!--Search: <input type="text" id='address' name="address"><input type="submit" value="Go!" onclick="javascript:getaddress()"/>--><div id="status" style="height:20px;min-height:20px;">&nbsp;</div>
      <div>Map powered by <a href="http://www.openlayers.org/">OpenLayers</a>
  	 and <a href="http://mapserver.gis.umn.edu/">MapServer</a>.
           Data downloaded from
  	 <a href="http://www.mass.gov/mgis/">Office of Geographic and Environmental Information (MassGIS)</a>.</div>
  	 <!--<a onclick="setLink(); return false" href="#" id="update">Update Link</a>
  	 <div id="link"></div>-->
  	 </div>
      <div id="map"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/georss.html
  
  Index: georss.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 800px;
              height: 400px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var map, layer;
  
          OpenLayers.ProxyHost = "/proxy/?url=";
          function init(){
              map = new OpenLayers.Map('map', {maxResolution:'auto'});
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
              map.addLayer(layer);
              map.setCenter(new OpenLayers.LonLat(0, 0), 0);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
          }
          function addUrl() {
              var value = $('url').value;
              var parts = value.split("/");
                  var newl = new OpenLayers.Layer.GeoRSS( parts[parts.length-1], value);
                  map.addLayer(newl);
              $("url").value = "";
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>GeoRSS in OpenLayers</h1>
      <p style="font-size:.9em;">This demo uses the OpenLayers GeoRSS parser, which supports GeoRSS Simple and W3C GeoRSS. Only points are currently supported. <a href="http://trac.openlayers.org/wiki/HowToDownload">Get the code!</a></p>
      <form onsubmit="return false;">
     GeoRSS URL: <input type="text" id="url" size="50" /><input type="submit" onclick="addUrl(); return false;" value="Load Feed" onsubmit="addUrl(); return false;" />
      </form>  
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/georss.xml
  
  Index: georss.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/css" href="/css/rss.css" ?>
  
  <rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://purl.org/rss/1.0/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:georss="http://www.georss.org/georss">
  <docs>This is an RSS file.  Copy the URL into your aggregator of choice.  If you don't know what this means and want to learn more, please see: <span>http://platial.typepad.com/news/2006/04/really_simple_t.html</span> for more info.</docs><channel rdf:about="http://platial.com">
  <link>http://platial.com</link>
  <title>Crschmidt's Places At Platial</title>
  <description></description>
  <items>
  <rdf:Seq>
  <rdf:li resource="http://platial.com/place/90306"/>
  <rdf:li resource="http://platial.com/place/67230"/>
  <rdf:li resource="http://platial.com/place/65645"/>
  <rdf:li resource="http://platial.com/place/62200"/>
  <rdf:li resource="http://platial.com/place/28232"/>
  <rdf:li resource="http://platial.com/place/43666"/>
  <rdf:li resource="http://platial.com/place/28394"/>
  <rdf:li resource="http://platial.com/place/28251"/>
  <rdf:li resource="http://platial.com/place/28392"/>
  <rdf:li resource="http://platial.com/place/28391"/>
  <rdf:li resource="http://platial.com/place/28231"/>
  <rdf:li resource="http://platial.com/place/28393"/>
  <rdf:li resource="http://platial.com/place/31685"/>
  <rdf:li resource="http://platial.com/place/28596"/>
  <rdf:li resource="http://platial.com/place/28595"/>
  <rdf:li resource="http://platial.com/place/28594"/>
  <rdf:li resource="http://platial.com/place/28593"/>
  <rdf:li resource="http://platial.com/place/28592"/>
  <rdf:li resource="http://platial.com/place/28591"/>
  <rdf:li resource="http://platial.com/place/28590"/>
  <rdf:li resource="http://platial.com/place/28589"/>
  <rdf:li resource="http://platial.com/place/28588"/>
  <rdf:li resource="http://platial.com/place/28587"/>
  <rdf:li resource="http://platial.com/place/28586"/>
  <rdf:li resource="http://platial.com/place/28585"/>
  <rdf:li resource="http://platial.com/place/28584"/>
  <rdf:li resource="http://platial.com/place/28583"/>
  <rdf:li resource="http://platial.com/place/28582"/>
  <rdf:li resource="http://platial.com/place/28581"/>
  <rdf:li resource="http://platial.com/place/28580"/>
  <rdf:li resource="http://platial.com/place/28579"/>
  <rdf:li resource="http://platial.com/place/28578"/>
  <rdf:li resource="http://platial.com/place/28577"/>
  <rdf:li resource="http://platial.com/place/28576"/>
  <rdf:li resource="http://platial.com/place/28575"/>
  <rdf:li resource="http://platial.com/place/28574"/>
  <rdf:li resource="http://platial.com/place/28573"/>
  <rdf:li resource="http://platial.com/place/28572"/>
  <rdf:li resource="http://platial.com/place/28571"/>
  <rdf:li resource="http://platial.com/place/28570"/>
  </rdf:Seq>
  </items>
  </channel>
  <item rdf:about="http://platial.com/place/90306">
  <link>http://platial.com/place/90306</link>
  <title>Knitting Room</title>
  <description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington, MA <br/>Tags: knitting, yarn, pins and needles, handspun, hand dyed, novelty yarn, fancy, simple, young, hip, friendly, needles, addy, cute hats<br /><br /><a href="http://platial.com/place/90306">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/90306">Grab this on Platial</a> ]]></description>
  <georss:point>42.405696 -71.142197</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-06-08T17:35:01.942452+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/67230">
  <link>http://platial.com/place/67230</link>
  <title>Knitting Room</title>
  <description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington, MA <br/>Tags: knitting, yarn, pins and needles, handspun, hand dyed, novelty yarn, fancy, simple, young, hip, friendly, needles, addy, cute hats<br /><br /><a href="http://platial.com/place/67230">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/67230">Grab this on Platial</a> ]]></description>
  <georss:point>42.405524 -71.142273</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-04-24T11:35:26.733857+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/65645">
  <link>http://platial.com/place/65645</link>
  <title>†¢¢™£ˆøœ</title>
  <description><![CDATA[ijeª£∆µˆ˚î<br/>Address: 151 Erie St., Cambridge, MA<br/>Tags: platial graffiti<br /><br /><a href="http://platial.com/place/65645">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/65645">Grab this on Platial</a> ]]></description>
  <georss:point>42.352455 -71.110210</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-04-20T08:56:12.696224+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/62200">
  <link>http://platial.com/place/62200</link>
  <title>Allen Hall</title>
  <description><![CDATA[My dorm at UIUC.<br/>Address: 1301 W Gregory Dr, Urbana, IL<br/>Tags: dorm, uiuc, college<br/><a href="http://platial.com/place/62200"><img src="http://platial.comhttp://static.flickr.com/4/8576450_0d59cc2531_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/62200">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/62200">Grab this on Platial</a> ]]></description>
  <georss:point>40.104172 -88.220623</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-04-14T08:01:01.872873+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28232">
  <link>http://platial.com/place/28232</link>
  <title>Bagby Hot Springs, OR</title>
  <description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C. However, the area around the springs are not exactly well looked upon by people who know the place.
  
  <br/>Tags: 20s, rosalie, romance, childhood, hike, camping, soak, relax, beautiful, hot springs, bathhouse, favorite, popular, crowded, organized, honeymoon tub, plumbing made from hollowed out trees, hot springs, mt hood, notorious car break in spot, rash, bacteria<br /><br /><a href="http://platial.com/place/28232">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28232">Grab this on Platial</a> ]]></description>
  <georss:point>44.936000 -122.173000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:10:18.553063+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/43666">
  <link>http://platial.com/place/43666</link>
  <title>Shooting Location for "The Field of Dreams" Film</title>
  <description><![CDATA[1989's Field of Dreams was a Best Picture Academy Award nominee, and the baseball field in the cornfield still stands today, and has become quite a tourist destination.  Games are occasionally played at the field, re-enacting professional baseball at the turn of the 20th Century.<br/>Address: Dyersville, Iowa<br/>Tags: iowa, baseball, movie locations, field of dreams, kevin costner, costner, dyersville, kinsella, james earl jones, chicago black sox, shoeless joe, joe jackson, famous farms, film, movie, cinema, shooting location<br /><br /><a href="http://platial.com/place/43666">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/43666">Grab this on Platial</a> ]]></description>
  <georss:point>42.481213 -91.111679</georss:point>
  <dc:creator>echinodermata</dc:creator>
  <dc:date>2006-03-23T11:40:17.654061+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28394">
  <link>http://platial.com/place/28394</link>
  <title>Moffetts (Bonneville) Hot Springs, WA</title>
  <description><![CDATA[Hot spring, temperature: 97  degress F, 36  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28394">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28394">Grab this on Platial</a> ]]></description>
  <georss:point>45.658000 -121.962000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:16:27.329816+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28251">
  <link>http://platial.com/place/28251</link>
  <title>Austin Hot Springs, OR</title>
  <description><![CDATA[Hot spring, temperature: 186  degress F, 86  degress C<br/>Tags: soak, hot springs, relax, nature, popular, crowded<br /><br /><a href="http://platial.com/place/28251">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28251">Grab this on Platial</a> ]]></description>
  <georss:point>45.021000 -122.009000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:11:04.489886+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28392">
  <link>http://platial.com/place/28392</link>
  <title>Rock Creek Hot Springs, WA</title>
  <description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28392">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28392">Grab this on Platial</a> ]]></description>
  <georss:point>45.723000 -121.927000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:16:22.636855+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28391">
  <link>http://platial.com/place/28391</link>
  <title>St. Martins (Wind River) Hot Springs, WA</title>
  <description><![CDATA[Hot spring, temperature: 120  degress F, 49  degress C<br/>Tags: hot springs, soak, relax, nature, wonderful<br /><br /><a href="http://platial.com/place/28391">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28391">Grab this on Platial</a> ]]></description>
  <georss:point>45.728000 -121.800000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:16:20.383244+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28231">
  <link>http://platial.com/place/28231</link>
  <title>Breitenbush Hot Springs, OR</title>
  <description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br/>Tags: hot springs, resort, relax, nature, beautiful, http:www.breitenbush.com, soaking<br /><br /><a href="http://platial.com/place/28231">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28231">Grab this on Platial</a> ]]></description>
  <georss:point>44.782000 -121.975000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:10:16.529195+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28393">
  <link>http://platial.com/place/28393</link>
  <title>Collins Hot Springs, WA</title>
  <description><![CDATA[Hot spring, temperature: 122  degress F, 50  degress C<br/>Tags: portland, nice, hot springs, soak<br /><br /><a href="http://platial.com/place/28393">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28393">Grab this on Platial</a> ]]></description>
  <georss:point>45.701000 -121.728000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:16:24.648745+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/31685">
  <link>http://platial.com/place/31685</link>
  <title>Darwin's Ltd.</title>
  <description><![CDATA[Nice little coffee shop/cafe, free Wifi, close enough to walk from Harvard Square.<br/>Address: 148 Mount Auburn St, Cambridge, MA<br/>Tags: coffee, beer, sandwiches, freewifi<br/><a href="http://platial.com/place/31685"><img src="http://platial.comhttp://static.flickr.com/38/84885937_74fd3d1025_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/31685">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/31685">Grab this on Platial</a> ]]></description>
  <georss:point>42.373974 -71.125053</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-10T09:24:08.152985+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28596">
  <link>http://platial.com/place/28596</link>
  <title>Huckleberry Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: Boiling  degress F, Boiling  degress C<br /><br /><a href="http://platial.com/place/28596">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28596">Grab this on Platial</a> ]]></description>
  <georss:point>44.115000 -110.684000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:32.283094+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28595">
  <link>http://platial.com/place/28595</link>
  <title>South Entrance Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 156  degress F, 69  degress C<br/><a href="http://platial.com/place/28595"><img src="http://platial.comhttp://static.flickr.com/52/130989872_f1457f68b5_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28595">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28595">Grab this on Platial</a> ]]></description>
  <georss:point>44.142000 -110.656000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:30.279497+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28594">
  <link>http://platial.com/place/28594</link>
  <title>Crawfish Creek Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br/><a href="http://platial.com/place/28594"><img src="http://platial.comhttp://static.flickr.com/52/128312256_d6a879924c_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28594">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28594">Grab this on Platial</a> ]]></description>
  <georss:point>44.157000 -110.699000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:28.280271+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28593">
  <link>http://platial.com/place/28593</link>
  <title>Crawfish Creek Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 138  degress F, 59  degress C<br /><br /><a href="http://platial.com/place/28593">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28593">Grab this on Platial</a> ]]></description>
  <georss:point>44.165000 -110.723000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:20.364077+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28592">
  <link>http://platial.com/place/28592</link>
  <title>Snake Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br /><br /><a href="http://platial.com/place/28592">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28592">Grab this on Platial</a> ]]></description>
  <georss:point>44.169000 -110.583000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:12.234974+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28591">
  <link>http://platial.com/place/28591</link>
  <title>Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 142  degress F, 61  degress C<br /><br /><a href="http://platial.com/place/28591">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28591">Grab this on Platial</a> ]]></description>
  <georss:point>44.187000 -110.726000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:10.027857+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28590">
  <link>http://platial.com/place/28590</link>
  <title>Hot Springs on Upper Snake River, WY</title>
  <description><![CDATA[Hot spring, temperature: 167  degress F, 75  degress C<br /><br /><a href="http://platial.com/place/28590">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28590">Grab this on Platial</a> ]]></description>
  <georss:point>44.204000 -110.486000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:07.79658+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28589">
  <link>http://platial.com/place/28589</link>
  <title>Hot Springs on lewis Lake, WY</title>
  <description><![CDATA[Hot spring, temperature: 154  degress F, 68  degress C<br /><br /><a href="http://platial.com/place/28589">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28589">Grab this on Platial</a> ]]></description>
  <georss:point>44.276000 -110.636000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:05.683418+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28588">
  <link>http://platial.com/place/28588</link>
  <title>Rustic Geyser, WY</title>
  <description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28588">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28588">Grab this on Platial</a> ]]></description>
  <georss:point>44.282000 -110.506000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:03.66329+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28587">
  <link>http://platial.com/place/28587</link>
  <title>Bechler River Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 194  degress F, 90  degress C<br /><br /><a href="http://platial.com/place/28587">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28587">Grab this on Platial</a> ]]></description>
  <georss:point>44.285000 -110.900000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:01.611442+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28586">
  <link>http://platial.com/place/28586</link>
  <title>Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28586">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28586">Grab this on Platial</a> ]]></description>
  <georss:point>44.290000 -110.504000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:59.658699+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28585">
  <link>http://platial.com/place/28585</link>
  <title>Heart Lake Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature:  Middle Group  degress F, 174  degress C<br /><br /><a href="http://platial.com/place/28585">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28585">Grab this on Platial</a> ]]></description>
  <georss:point>44.299000 -110.517000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:57.181801+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28584">
  <link>http://platial.com/place/28584</link>
  <title>Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28584">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28584">Grab this on Platial</a> ]]></description>
  <georss:point>44.307000 -110.526000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:55.240485+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28583">
  <link>http://platial.com/place/28583</link>
  <title>Hot Springs on lewis Lake, WY</title>
  <description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28583">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28583">Grab this on Platial</a> ]]></description>
  <georss:point>44.309000 -110.654000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:53.22295+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28582">
  <link>http://platial.com/place/28582</link>
  <title>Shoshone Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28582">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28582">Grab this on Platial</a> ]]></description>
  <georss:point>44.354000 -110.800000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:51.179049+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28581">
  <link>http://platial.com/place/28581</link>
  <title>Hot Springs on Continental Divide, WY</title>
  <description><![CDATA[Hot spring, temperature: 189  degress F, 87  degress C<br /><br /><a href="http://platial.com/place/28581">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28581">Grab this on Platial</a> ]]></description>
  <georss:point>44.401000 -110.936000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:49.077176+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28580">
  <link>http://platial.com/place/28580</link>
  <title>Hot Springs on Upper Firehole River, WY</title>
  <description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28580">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28580">Grab this on Platial</a> ]]></description>
  <georss:point>44.404000 -110.824000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:47.054664+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28579">
  <link>http://platial.com/place/28579</link>
  <title>Summit Lake Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 162  degress F, 72  degress C<br /><br /><a href="http://platial.com/place/28579">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28579">Grab this on Platial</a> ]]></description>
  <georss:point>44.410000 -110.953000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:45.039394+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28578">
  <link>http://platial.com/place/28578</link>
  <title>Lone Star Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature:  Footbridge  degress F, 183  degress C<br /><br /><a href="http://platial.com/place/28578">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28578">Grab this on Platial</a> ]]></description>
  <georss:point>44.414000 -110.817000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:42.938808+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28577">
  <link>http://platial.com/place/28577</link>
  <title>West. Thumb Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28577">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28577">Grab this on Platial</a> ]]></description>
  <georss:point>44.417000 -110.570000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:40.90238+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28576">
  <link>http://platial.com/place/28576</link>
  <title>Lone Star Geyser, WY</title>
  <description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28576">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28576">Grab this on Platial</a> ]]></description>
  <georss:point>44.418000 -110.805000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:38.844625+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28575">
  <link>http://platial.com/place/28575</link>
  <title>Smoke Jumper Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28575">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28575">Grab this on Platial</a> ]]></description>
  <georss:point>44.421000 -110.952000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:36.818513+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28574">
  <link>http://platial.com/place/28574</link>
  <title>West. Thumb Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature: 196  degress F, 91  degress C<br /><br /><a href="http://platial.com/place/28574">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28574">Grab this on Platial</a> ]]></description>
  <georss:point>44.422000 -110.574000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:34.767729+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28573">
  <link>http://platial.com/place/28573</link>
  <title>Potts Hot Spring Basin, WY</title>
  <description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28573">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28573">Grab this on Platial</a> ]]></description>
  <georss:point>44.433000 -110.581000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:32.749915+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28572">
  <link>http://platial.com/place/28572</link>
  <title>Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28572">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28572">Grab this on Platial</a> ]]></description>
  <georss:point>44.433000 -110.813000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:30.829745+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28571">
  <link>http://platial.com/place/28571</link>
  <title>Hot Springs on Continental Divide, WY</title>
  <description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28571">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28571">Grab this on Platial</a> ]]></description>
  <georss:point>44.438000 -110.977000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:28.730401+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28570">
  <link>http://platial.com/place/28570</link>
  <title>SouthEastern Group, WY</title>
  <description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28570">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28570">Grab this on Platial</a> ]]></description>
  <georss:point>44.459000 -110.817000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:26.706763+00:00</dc:date>
  </item>
  </rdf:RDF>
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/google.html
  
  Index: google.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 100%;
              height: 512px;
              border: 1px solid black;
              background-color: red;
          }
      </style>
  
      <!-- this gmaps key generated for http://openlayers.org/dev/ -->
      <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghSPUCi5aRYVveCcVYxzezM4iaj_gxQ9t-UajFL70jfcpquH5l1IJ-Zyyw'></script>
      <!-- Localhost key -->
      <!-- <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTS6gjckBmeABOGXIUiOiZObZESPg'></script>-->
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var lon = 5;
          var lat = 40;
          var zoom = 5;
          var map, layer;
  
          function init(){
              map = new OpenLayers.Map( $('map') , 
              { controls: [new OpenLayers.Control.MouseDefaults()] });
  
              var normal = new OpenLayers.Layer.Google( "Google", // );
               { minZoomLevel: 3, maxZoomLevel: 8  });
              var satellite = new OpenLayers.Layer.Google( "Google Satellite" , {type: G_SATELLITE_MAP });
              var hybrid = new OpenLayers.Layer.Google( "Google Hybrid" , {type: G_HYBRID_MAP });
  
  
              map.addLayers([satellite, normal, hybrid]);
  
              markers = new OpenLayers.Layer.Markers("markers");
              map.addLayer(markers);
  
              map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
              map.addControl( new OpenLayers.Control.LayerSwitcher() );
              map.addControl( new OpenLayers.Control.PanZoomBar() );
  
          }
          
          function add() {
  
              var url = 'http://boston.openguides.org/markers/AQUA.png';
              var sz = new OpenLayers.Size(10, 17);
              var calculateOffset = function(size) {
                                  return new OpenLayers.Pixel(-(size.w/2), -size.h);
                               };           
              var icon = new OpenLayers.Icon(url, sz, null, calculateOffset);
              var barcelona = new OpenLayers.LonLat(2.13134765625,
                                                    41.37062534198901);
              marker = new OpenLayers.Marker(barcelona, icon);
              markers.addMarker(marker);
          }
  
          function remove() {
              markers.removeMarker(marker);
          }
                  
      // -->
  
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers With Google Layer Example</h1>
      <div id="map"></div>
      <div style="background-color:green" onclick="add()"> click to add a marker to the map</div>
      <div style="background-color:red" onclick="remove()"> click to remove the marker from the map</div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/kamap.html
  
  Index: kamap.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 800px;
              height: 475px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var map = new OpenLayers.Map('map');
  
              var ol_wms = new OpenLayers.Layer.WMS( "World Map", 
                  "http://labs.metacarta.com/wms/vmap0?",
                   {layers: 'basic'} );
  
              var jpl_wms = new OpenLayers.Layer.KaMap( "Satellite",
                      "http://www.openlayers.org/world/index.php", {g: "satellite", map: "world"});
              var dm_wms = new OpenLayers.Layer.WMS( "Canada",
                  "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
                  {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
                           "prov_bound,fedlimit,rail,road,popplace",
                   transparent: "true", format: "image/png" });
  
              map.addLayers([ol_wms, jpl_wms, dm_wms]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.zoomToMaxExtent();
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/kamap.txt
  
  Index: kamap.txt
  ===================================================================
  <?php
  /*
  
  This is a PHP file to be used as a backend for a ka-Map layer. It requires
  PHP with Mapscript and libgd modules installed. The top of the file
  is a configuration section: please edit the variables in this configuration
  section to meet your needs, then rename this file to tile.php or something
  similar and put it in a web accessible directory. More information
  on the OpenLayers ka-Map layer is available from:
  
    http://trac.openlayers.org/wiki/OpenLayers.Layer.KaMap
  
  */
  /**********************************************************************
   *
   * $Id$
   *
   * purpose: a simple phpmapscript-based tile renderer that implements
   *          rudimentary caching for reasonable efficiency.  Note the
   *          cache never shrinks in this version so your disk could
   *          easily fill up!
   *
   * author: Paul Spencer (pspencer at dmsolutions.ca)
   *
   * modifications by Daniel Morissette (dmorissette at dmsolutions.ca)
   *
   * Modified by Christopher Schmidt for OpenLayers redistribution.
   * 
   **********************************************************************
   *
   * Copyright (c) 2005, DM Solutions Group Inc.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
   * copy of this software and associated documentation files (the "Software"),
   * to deal in the Software without restriction, including without limitation
   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   * and/or sell copies of the Software, and to permit persons to whom the
   * Software is furnished to do so, subject to the following conditions:
   * 
   * The above copyright notice and this permission notice shall be included
   * in all copies or substantial portions of the Software.
   * 
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
   * DEALINGS IN THE SOFTWARE.
   *
   **********************************************************************/
   
  
  /****************************************************************************** 
   * basic system configuration
   *
   * kaMap! uses PHP/MapScript and the PHP GD extension to
   * render tiles, and uses PHP/MapScript to generate initialization parameters
   * a legend, and a keymap from the selected map file.
   *
   * Make sure to set the correct module names for your PHP extensions.
   *
   * WINDOWS USERS: you will likely need to use php_gd2.dll instead of php_gd.dll
   */
  $szPHPMapScriptModule = 'php_mapscript.'.PHP_SHLIB_SUFFIX;
  $szPHPGDModule = 'php_gd.'.PHP_SHLIB_SUFFIX;
  
  /****************************************************************************** 
   * tile generation parameters
   *
   * kaMap! generates tiles to load in the client application by first rendering
   * larger areas from the map file and then slicing them up into smaller tiles.
   * This approach reduces the overhead of loading PHP/MapScript and PHP GD and 
   * drawing the map file.  These larger areas are referred to as metaTiles in
   * the code.  You can set the size of both the small tiles and the metaTiles
   * here.  A reasonable size for the small tiles seems to be 200 pixels square.
   * Smaller tiles seem to cause problems in client browsers by causing too many
   * images to be created and thus slowing performance of live dragging.  Larger
   * tiles take longer to download to the client and are inefficient.
   *
   * The number of smaller tiles that form a metaTile can also be configured.
   * This parameter allows tuning of the tile generator to ensure optimal
   * performance and for label placement.  MapServer will produce labels only
   * within a rendered area.  If the area is too small then features may be
   * labelled multiple times.  If the area is too large, it may exceed MapServer,s
   * maximum map size (by default 2000x2000) or be too resource-intensive on the
   * server, ultimately reducing performance.
   */
  $tileWidth = 256;
  $tileHeight = 256;
  $metaWidth = 5;
  $metaHeight = 5;
  /* $metaBuffer = Buffer size in pixels to add around metatiles to avoid 
   * rendering issues along the edge of the map image
   */
  $metaBuffer = 10;  
      
  /****************************************************************************** 
   * in-image debugging information - tile location, outlines etc.
   * to use this, you need to remove images from your cache first.  This also
   * affects the meta tiles - if debug is on, they are not deleted.
   */
  $bDebug = false;
   
  /****************************************************************************** 
   * aszMapFiles - an array of map files available to the application.  How this
   * is used is determined by the application.  Each map file is entered into
   * this array as a key->value pair.
   *
   * The key is the name to be used by the tile caching system to store cached
   * tiles within the base cache directory.  This key should be a single word
   * that uniquely identifies the map.
   *
   * The value associated with each key is an array of three values.  The first
   * value is a human-readable name to be presented to the user (should the
   * application choose to do so) and the second value is the path to the map
   * file.  It is assumed that the map file is fully configured for use with
   * MapServer/MapScript as no error checking or setting of values is done.  The 
   * third value is an array of scale values for zooming.
   */
   
  $aszMapFiles = array(
    "world"   => array( "World", "/path/to/your/mapfile",
                 array( 10000  ), # in openlayers, the scale array doesn't matter.
                 "PNG24")
  
  /* Add more elements to this array to offer multiple mapfiles */
  
  );
  
  /****************************************************************************** 
   * figure out which map file to use and set up the necessary variables for
   * the rest of the code to use.  This does need to be done on every page load
   * unfortunately.
   *
   * szMap should be set to the default map file to use but can change if
   * this script is called with map=<mapname>. 
   */
  $szMap = 'world';
  
  /****************************************************************************** 
   * kaMap! caching
   * 
   * this is the directory within which kaMap! will create its tile cache.  The
   * directory does NOT have to be web-accessible, but it must be writable by the
   * web-server-user and allow creation of both directories AND files.
   *
   * the tile caching system will create a separate subdirectory within the base
   * cache directory for each map file.  Within the cache directory for each map
   * file, directories will be created for each group of layers.  Within the group
   * directories, directories will be created at each of the configured scales
   * for the application (see mapfile configuration above.)
   */
  $szBaseCacheDir =  "/var/cache/kamap/";
  
  /*****  END OF CONFIGURABLE STUFF - unless you know what you are doing   *****/
  /*****                                                                   *****/
  /*****                                                                   *****/
  /*****                                                                   *****/
  /*****  END OF CONFIGURABLE STUFF - unless you know what you are doing   *****/
  
  if (isset($_REQUEST['map']) && isset($aszMapFiles[$_REQUEST['map']]))
  {
      $szMap = $_REQUEST['map'];
  }
  
  $szMapCacheDir = $szBaseCacheDir.$szMap."/";
  $szMapName = $aszMapFiles[$szMap][0];
  $szMapFile = $aszMapFiles[$szMap][1];
  $anScales = $aszMapFiles[$szMap][2];
  setOutputFormat($aszMapFiles[$szMap][3]);
  /****************************************************************************** 
   * output format of the map and resulting tiles
   *
   * The output format used with MapServer can greatly affect appearance and
   * performance.  It is recommended to use an 8 bit format such as PNG
   *
   * NOTE: the tile caching code in tile.php is not configurable here.  It
   * currently assumes that it is outputting 8bit PNG files.  If you change to
   * PNG24 here then you will need to update tile.php to use the gd function
   * imagecreatetruecolor.  If you change the output format to jpeg then
   * you would need to change imagepng() to imagejpeg().  A nice enhancement
   * would be to make that fully configurable from here.
   */
  function setOutputFormat($szFormat)
  {
      switch($szFormat) {
          case "PNG24":
              $GLOBALS['szMapImageFormat'] = 'PNG24'; //mapscript format name
              $GLOBALS['szMapImageCreateFunction'] = "imagecreatefrompng"; // appropriate GD function
              $GLOBALS['szImageExtension'] = '.png'; //file extension
              $GLOBALS['szImageCreateFunction'] = "imagecreatetruecolor"; //or imagecreatetruecolor if PNG24 ...
              $GLOBALS['szImageOutputFunction'] = "imagepng"; //or imagegif, imagejpeg ...
              $GLOBALS['szImageHeader'] = 'image/png'; //the content-type of the image        
              break;
          case "GIF":
              $GLOBALS['szMapImageFormat'] = 'GIF'; //mapscript format name
              $GLOBALS['szMapImageCreateFunction'] = "imagecreatefromgif"; // appropriate GD function
              $GLOBALS['szImageExtension'] = '.gif'; //file extension
              $GLOBALS['szImageCreateFunction'] = "imagecreate"; //or imagecreatetruecolor if PNG24 ...
              $GLOBALS['szImageOutputFunction'] = "imagegif"; //or imagegif, imagejpeg ...
              $GLOBALS['szImageHeader'] = 'image/gif'; //the content-type of the image        
              break;
          case "JPEG":
              $GLOBALS['szMapImageFormat'] = 'JPEG'; //mapscript format name
              $GLOBALS['szMapImageCreateFunction'] = "imagecreatefromjpeg"; // appropriate GD function
              $GLOBALS['szImageExtension'] = '.jpg'; //file extension
              $GLOBALS['szImageCreateFunction'] = "imagecreatetruecolor"; //or imagecreatetruecolor if PNG24 ...
              $GLOBALS['szImageOutputFunction'] = "imagejpeg"; //or imagegif, imagejpeg ...
              $GLOBALS['szImageHeader'] = 'image/jpeg'; //the content-type of the image        
              break;
          case "PNG":
              $GLOBALS['szMapImageFormat'] = 'PNG'; //mapscript format name
              $GLOBALS['szMapImageCreateFunction'] = "imagecreatefrompng"; // appropriate GD function
              $GLOBALS['szImageExtension'] = '.png'; //file extension
              $GLOBALS['szImageCreateFunction'] = "imagecreate"; //or imagecreatetruecolor if PNG24 ...
              $GLOBALS['szImageOutputFunction'] = "imagepng"; //or imagegif, imagejpeg ...
              $GLOBALS['szImageHeader'] = 'image/png'; //the content-type of the image        
              break;
          case "DITHERED":
  	case "PNG8":
              $GLOBALS['szMapImageFormat'] = 'dithered';
              $GLOBALS['szMapImageCreateFunction'] = "imagecreatefrompng";
              $GLOBALS['szImageExtension'] = '.png';
              $GLOBALS['szImageCreateFunction'] = "imagecreate";
              $GLOBALS['szImageOutputFunction'] = "imagepng";
              $GLOBALS['szImageHeader'] = 'image/png';
              break;
      }
  }
  
  /**
   * create all directories in a directory tree - found on the php web site
   * under the mkdir function ...
   */
  function makeDirs($strPath, $mode = 0775)
  {
     return is_dir($strPath) or ( makeDirs(dirname($strPath), $mode) and mkdir($strPath, $mode) );
  }
  
  /**
   * This function replaces all special characters in the given string.
   *
   * @param szString string - The string to convert.
   *
   * @return string converted
   */
  function normalizeString($szString)
  {
      // Normalize string by replacing all special characters
      // e.g.    "http://my.host.com/cgi-bin/mywms?"
      // becomes "http___my_host_com_cgi_bin_mywms_"
      return preg_replace("/(\W)/", "_", $szString);
  }
  
  /* bug 1253 - root permissions required to delete cached files */
  $orig_umask = umask(0);
  
  /* create the main cache directory if necessary */
  if (!@is_dir($szMapCacheDir))
      makeDirs($szMapCacheDir);
  
  /* get the various request parameters 
   * also need to make sure inputs are clean, especially those used to
   * build paths and filenames
   */
   /*
   * the tile renderer accepts several parameters and returns a tile image from
   * the cache, creating the tile only if necessary.
   *
   * all requests include the pixel location of the request at a certain scale
   * and this script figures out the geographic location of the tile from the
   * scale assuming that 0,0 in pixels is 0,0 in geographic units
   * 
   * Request parameters are:
   *
   * map: the name of the map to use.  This is handled by config.php.
   * 
   * t: top pixel position
   * l: left pixel position
   * s: scale
   * g: (optional) comma-delimited list of group names to draw
   * layers: (optional) comma-delimited list of layers to draw
   * force: optional.  If set, force redraw of the meta tile.  This was added to
   *        help with invalid images sometimes being generated.
   * tileid: (optional) can be used instead of t+l to specify the tile coord.,
   *         useful in regenerating the cache
   */
  
  $top = isset( $_REQUEST['t'] ) ? intval($_REQUEST['t']) : 0;
  $left = isset( $_REQUEST['l'] ) ? intval($_REQUEST['l']) : 0;
  $scale = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : $anScales[0];
  $bForce = isset($_REQUEST['force'])? true : false;
  $groups = isset( $_REQUEST['g'] ) ? $_REQUEST['g'] : "";
  $layers = isset( $_REQUEST['layers'] ) ? $_REQUEST['layers'] : "";
  
  // dynamic imageformat ----------------------------------------------
  //use the function in config.php to set the output format
  if (isset($_REQUEST['i']))
     setOutputFormat( $_REQUEST['i'] );
  //----------------------------------------------------------------
  
  /* tileid=t#####l#### can be used instead of t+l parameters. Useful in
   * regenerating the cache for instance.
   */
  if (isset( $_REQUEST['tileid']) &&
      preg_match("/t(-?\d+)l(-?\d+)/", $_REQUEST['tileid'], $aMatch) )
  {
      $top = intval($aMatch[1]);
      $left = intval($aMatch[2]);
  }
  
  /* Calculate the metatile's top-left corner coordinates.
   * Include the $metaBuffer around the metatile to account for various
   * rendering issues happening around the edge of a map
   */
  $metaLeft = floor( ($left)/($tileWidth*$metaWidth) ) * $tileWidth * $metaWidth;
  $metaTop = floor( ($top)/($tileHeight*$metaHeight) ) * $tileHeight *$metaHeight;
  $szMetaTileId = "t".$metaTop."l".$metaLeft;
  $metaLeft -= $metaBuffer;
  $metaTop -= $metaBuffer;
  
  /* caching is done by scale value, then groups and layers and finally metatile
   * and tile id. Create a new directory if necessary
   */
  $szGroupDir = $groups != "" ? normalizeString($groups) : "def"; 
  $szLayerDir = $layers != "" ? normalizeString($layers) : "def"; 
  
  $szCacheDir = $szMapCacheDir."/".$scale."/".$szGroupDir."/".$szLayerDir."/".$szMetaTileId;
  if (!@is_dir($szCacheDir))
      makeDirs($szCacheDir);
  
  /* resolve cache hit - clear the os stat cache if necessary */
  $szTileId = "t".$top."l".$left;
  $szCacheFile = $szCacheDir."/".$szTileId.$szImageExtension;
  clearstatcache();
  
  $szMetaDir = $szCacheDir."/meta";
  if (!@is_Dir($szMetaDir))
      makeDirs($szMetaDir);
  
  /* simple locking in case there are several requests for the same meta
     tile at the same time - only draw it once to help with performance */
  $szLockFile = $szMetaDir."/lock_".$metaTop."_".$metaLeft;
  $fpLockFile = fopen($szLockFile, "a+");
  clearstatcache();
  if (!file_exists($szCacheFile) || $bForce)
  {
      flock($fpLockFile, LOCK_EX);
      fwrite($fpLockFile, ".");
      
      //check once more to see if the cache file was created while waiting for
      //the lock
      clearstatcache();
      if (!file_exists($szCacheFile) || $bForce)
      {
          if (!extension_loaded('MapScript'))
          {
              dl( $szPHPMapScriptModule );
          }
          if (!extension_loaded('gd'))
          {
              dl( $szPHPGDModule);
          }
          
          if (!@is_Dir($szMetaDir))
              makeDirs($szMetaDir);    
          
          $oMap = ms_newMapObj($szMapFile);
                 
          /* Metatile width/height include 2x the metaBuffer value */
          $oMap->set('width', $tileWidth * $metaWidth + 2*$metaBuffer);
          $oMap->set('height', $tileHeight * $metaHeight + 2*$metaBuffer);
          
          /* Tell MapServer to not render labels inside the metaBuffer area
           * (new in 4.6) 
           * TODO: Until MapServer bugs 1353/1355 are resolved, we need to
           * pass a negative value for "labelcache_map_edge_buffer"
           */
          $oMap->setMetadata("labelcache_map_edge_buffer", -$metaBuffer);
  
          $inchesPerUnit = array(1, 12, 63360.0, 39.3701, 39370.1, 4374754);
          $geoWidth = $scale/($oMap->resolution*$inchesPerUnit[$oMap->units]);
          $geoHeight = $scale/($oMap->resolution*$inchesPerUnit[$oMap->units]);
          
          /* draw the metatile */
          $minx = $metaLeft * $geoWidth;
          $maxx = $minx + $geoWidth * $oMap->width;
          $maxy = -1 * $metaTop * $geoHeight;
          $miny = $maxy - $geoHeight * $oMap->height;
          
          $nLayers = $oMap->numlayers;
          $oMap->setExtent($minx,$miny,$maxx,$maxy);
          $oMap->selectOutputFormat( $szMapImageFormat );               
          $aszLayers = array();
          if ($groups || $layers)
          {
              /* Draw only specified layers instead of default from mapfile*/
              if ($layers)
              {
                  $aszLayers = explode(",", $layers);
              }
  
              if ($groups)
              {
                  $aszGroups = explode(",", $groups);
              }
  
              for($i=0;$i<$nLayers;$i++)
              {
                  $oLayer = $oMap->getLayer($i);
                  if (($aszGroups && in_array($oLayer->group,$aszGroups)) ||
                      ($aszLayers && in_array($oLayer->name,$aszLayers)) ||
                      ($aszGroups && $oLayer->group == '' && 
                       in_array( "__base__", $aszGroups)))
                  {
                      $oLayer->set("status", MS_ON );
                  }
                  else
                  {
                      $oLayer->set("status", MS_OFF );
                  }
              }
              //need transparency if groups or layers are used
              $oMap->outputformat->set("transparent", MS_ON );
          }
          else
          {
              $oMap->outputformat->set("transparent", MS_OFF );
          }
  
          
          $szMetaImg = $szMetaDir."/t".$metaTop."l".$metaLeft.$szImageExtension;
          $oImg = $oMap->draw();
          $oImg->saveImage($szMetaImg);
          $oImg->free();
          eval("\$oGDImg = ".$szMapImageCreateFunction."('".$szMetaImg."');");
          if ($bDebug)
          {
              $blue = imagecolorallocate($oGDImg, 0, 0, 255);
              imagerectangle($oGDImg, 0, 0, $tileWidth * $metaWidth - 1, $tileHeight * $metaHeight - 1, $blue );
          }
          for($i=0;$i<$metaWidth;$i++)
          {
              for ($j=0;$j<$metaHeight;$j++)
              {
                  eval("\$oTile = ".$szImageCreateFunction."( ".$tileWidth.",".$tileHeight." );");
                  // Allocate BG color for the tile (in case the metatile has transparent BG)
                  $nTransparent = imagecolorallocate($oTile, $oMap->imagecolor->red, $oMap->imagecolor->green, $oMap->imagecolor->blue);
                  //if ($oMap->outputformat->transparent == MS_ON)
                  //{
                      imagecolortransparent( $oTile,$nTransparent);
                  //}
                  $tileTop = $j*$tileHeight + $metaBuffer;
                  $tileLeft = $i*$tileWidth + $metaBuffer;
                  imagecopy( $oTile, $oGDImg, 0, 0, $tileLeft, $tileTop, $tileWidth, $tileHeight );
                  /* debugging stuff */
                  if ($bDebug)
                  {
                      $black = imagecolorallocate($oTile, 1, 1, 1);
                      $green = imagecolorallocate($oTile, 0, 128, 0 );
                      $red = imagecolorallocate($oTile, 255, 0, 0);
                      imagerectangle( $oTile, 1, 1, $tileWidth-2, $tileHeight-2, $green ); 
                      imageline( $oTile, 0, $tileHeight/2, $tileWidth-1, $tileHeight/2, $red);
                      imageline( $oTile, $tileWidth/2, 0, $tileWidth/2, $tileHeight-1, $red);
                      imagestring ( $oTile, 3, 10, 10, ($metaLeft+$tileLeft)." x ".($metaTop+$tileTop), $black );
                      imagestring ( $oTile, 3, 10, 30, ($minx+$i*$geoWidth)." x ".($maxy - $j*$geoHeight), $black );
                  }
                  $szTileImg = $szCacheDir."/t".($metaTop+$tileTop)."l".($metaLeft+$tileLeft).$szImageExtension;
                  eval("$szImageOutputFunction( \$oTile, '".$szTileImg."' );");
                  imagedestroy($oTile);
                  $oTile = null;
              }
          }
          if ($oGDImg != null)
          {   
              imagedestroy($oGDImg);
              $oGDImg = null;
          }
          if (!$bDebug)
          {
              unlink( $szMetaImg );
          }
      }
      //release the exclusive lock
      flock($fpLockFile, LOCK_UN );
  }
  
  //acquire shared lock for reading to prevent a problem that could occur
  //if a tile exists but is only partially generated.
  flock($fpLockFile, LOCK_SH);
  
  $h = fopen($szCacheFile, "r");
  header("Content-Type: ".$szImageHeader);
  header("Content-Length: " . filesize($szCacheFile));
  header("Expires: " . date( "D, d M Y H:i:s GMT", time() + 31536000 ));
  header("Cache-Control: max-age=31536000, must-revalidate" );
  fpassthru($h);
  fclose($h);
  
  //release lock
  fclose($fpLockFile);
  
  /* bug 1253 - root permissions required to delete cached files */
  umask($orig_umask);
  
  exit;
  ?>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/markerResize.html
  
  Index: markerResize.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var map, layer;
          var size, icon;
          
          function init(){
              map = new OpenLayers.Map('map');
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
                  
              map.addLayer(layer);
              var markers = new OpenLayers.Layer.Markers( "Markers" );
              map.addLayer(markers);
  
              size = new OpenLayers.Size(50,50);
              calculateOffset = function(size) {
                          return new OpenLayers.Pixel(-(size.w/2), -size.h); };
              icon = new OpenLayers.Icon(
                  'http://boston.openguides.org/markers/AQUA.png',
                  size, null, calculateOffset);
              markers.addMarker(
                  new OpenLayers.Marker(new OpenLayers.LonLat(-180,90), icon));
  
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.zoomToMaxExtent();
          }
  
          function resize() {
           
              size = new OpenLayers.Size(size.w + 10, size.h + 10);
              icon.setSize(size);   
              
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
      <div style="background-color:purple" onclick="resize()"> click to resize marker</div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/markers.html
  
  Index: markers.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var map, layer;
  
          function init(){
              OpenLayers.ProxyHost="/proxy/?url=";
              map = new OpenLayers.Map('map');
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
                  
              map.addLayer(layer);
              map.setCenter(new OpenLayers.LonLat(0, 0), 0);
              var markers = new OpenLayers.Layer.Markers( "Markers" );
              map.addLayer(markers);
              var newl = new OpenLayers.Layer.Text( "text", { location:"./textfile.txt"} );
              map.addLayer(newl);
              var size = new OpenLayers.Size(10,17);
              var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
              var icon = new OpenLayers.Icon('http://boston.openguides.org/markers/AQUA.png',size,offset);
              markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon));
              markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,45),icon.clone()));
              marker = new OpenLayers.Marker(new OpenLayers.LonLat(90,10),icon.clone());
              marker.events.register('mousedown', marker, function(evt) { alert(this.icon.url); Event.stop(evt); });
              markers.addMarker(marker); 
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.zoomToMaxExtent();
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/markersTextLayer.html
  
  Index: markersTextLayer.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var map, layer;
  
          function init(){
              OpenLayers.ProxyHost="/proxy/?url=";
              map = new OpenLayers.Map('map');
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
                  
              map.addLayer(layer);
  
              var newl = new OpenLayers.Layer.Text( "text", {location: "./textfile.txt"} );
              map.addLayer(newl);
  
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.zoomToMaxExtent();
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/mvs.html
  
  Index: mvs.html
  ===================================================================
  <html>
  <!--
       OpenLayers Map Viewer Service
  
       Copyright 2005-2006 MetaCarta, Inc., released under the BSD License.
  -->
  <!-- 
       This probably needs to be renamed index.html for deployment.
       Specifically, it needs to be the default page for whatever
       directory it is in.
  -->
  <head>
  
      <!-- this gmaps key generated for http://openlayers.org/dev/ -->
      <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghSPUCi5aRYVveCcVYxzezM4iaj_gxQ9t-UajFL70jfcpquH5l1IJ-Zyyw'></script>
      <!-- Localhost key -->
       <!--<script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTS6gjckBmeABOGXIUiOiZObZESPg'></script>-->
  <script src="http://openlayers.org/dev/lib/OpenLayers.js"></script>
  
  <script>
  
  function runMVS() {
      OpenLayers.ProxyHost = '/proxy/?url='; 
      if (document.location.protocol != "file:") {
          theArgs = OpenLayers.Util.getArgs();
      } else {
          theArgs = {};
          theArgs.center = "0,0";
          theArgs.zoom = "0";            
          theArgs.data = "textfile.txt";
          theArgs.controls = 'panzoom,mouse';
          theArgs.layers = 'openlayers';
      }
  
  
      // ----
      // TODO: Handle all this parsing better.
      var safeArgs = {}
  
      var DEFAULT_LAT = 0;
      var DEFAULT_LON = 0;
      var DEFAULT_ZOOM_LEVEL = 0;
      var DEFAULT_CONTROLS = ['panzoom','mouse'];
      var DEFAULT_LAYERS = ['openlayers'];
      
      var IDX_LAT = 0;
      var IDX_LON = 1;
  
      safeArgs.centerLat = theArgs.center ? 
          parseFloat(theArgs.center.split(",")[IDX_LAT]) : DEFAULT_LAT;
      
      safeArgs.centerLon = theArgs.center ? 
          parseFloat(theArgs.center.split(",")[IDX_LON]) : DEFAULT_LON;
  
      safeArgs.zoom = theArgs.zoom ? parseInt(theArgs.zoom) : DEFAULT_ZOOM_LEVEL;
      
      safeArgs.controls = theArgs.controls ? 
          theArgs.controls.split(",") : DEFAULT_CONTROLS;
      
      safeArgs.layers = theArgs.layers ? 
          theArgs.layers.split(",") : DEFAULT_LAYERS;
      
      safeArgs.data = theArgs.data; // TODO: Make this "safe".
      safeArgs.marker = theArgs.marker; // TODO: Make this "safe".
      
      // -----
      var theMVS = new OpenLayers.Map($('map'), {controls: [], maxResolution: 'auto'});
      for(var i = 0; i < safeArgs.controls.length; i++) {
          switch(safeArgs.controls[i]) {
              case 'panzoombar':
                  theMVS.addControl(new OpenLayers.Control.PanZoomBar());
                  break;
              case 'panzoom':
                  theMVS.addControl(new OpenLayers.Control.PanZoom());
                  break;
              case 'layerswitcher':
                  theMVS.addControl(new OpenLayers.Control.LayerSwitcher());
                  break;
              case 'mouse':
                  theMVS.addControl(new OpenLayers.Control.MouseDefaults());
                  break;
          }
      }
      for(var i = 0; i < safeArgs.layers.length; i++) {
          switch(safeArgs.layers[i]) {
              case 'openlayers':
                  theMVS.addLayer(
                    new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                          "http://labs.metacarta.com/wms/vmap0", 
                          {layers: 'basic'} )
                    );
                  break;
              case 'nasa': 
                  theMVS.addLayer(
                      new OpenLayers.Layer.WMS("NASA Mosaic", 
                         "http://wms.jpl.nasa.gov/wms.cgi",
                         {"EXCEPTIONS" : "application/vnd.ogc.se_inimage",
                          "format" : "image/jpeg",
                          layers:"modis,global_mosaic"}
                         ));
                  break;
              case 'gmaps':
                  theMVS.addLayer(
                      new OpenLayers.Layer.Google( "Google" , {type: G_HYBRID_MAP })
                  );
                  break;
          }
      }
      theMVS.setCenter(new OpenLayers.LonLat(safeArgs.centerLon, safeArgs.centerLat), safeArgs.zoom);
  
      if (safeArgs.marker) {
          var m = new OpenLayers.Layer.Markers("Marker");
          m.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(safeArgs.centerLon, safeArgs.centerLat)));
          theMVS.addLayer(m);
      }
      if (safeArgs.data) {
          theMVS.addLayer(new OpenLayers.Layer.Text("Data", {location: safeArgs.data}));
      }
  
  }
  </script>
  </head>
  <body style="margin:0px;"
        onload="runMVS();">
  <div id="map"
       style="width: 100%; height: 100%;
              background: lightyellow;
             "></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/notile.html
  
  Index: notile.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var map = new OpenLayers.Map('map', {maxResolution: 'auto'});
  
              var ol_wms = new OpenLayers.Layer.WMS.Untiled( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'} );
              ol_wms.isBaseLayer = true;
              map.addLayers([ol_wms]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.setCenter(new OpenLayers.LonLat(0, 0), 0);
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/openstreetmap.html
  
  Index: openstreetmap.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 800px;
              height: 475px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var zoom = 5;
          var map, layer;
  
          function init(){
              map = new OpenLayers.Map( $('map') );
              layer = new OpenLayers.Layer.WMS( "OpenStreetMap WMS", 
                      "http://tile.openstreetmap.org/ruby/wmsmod.rbx?" );
              layer.setTileSize(new OpenLayers.Size(256,128));
              map.addLayer(layer);
  
              map.setCenter(new OpenLayers.LonLat(-0.02197265625,51.492919921875), 13);
              map.addControl( new OpenLayers.Control.LayerSwitcher() );
          }
          
          
  
          // -->
      </script>
    </head>
    <body onload="init()">
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/popups.html
  
  Index: popups.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var map, layer, popup;
          var markers, feature, marker;
          
          function init(){
              map = new OpenLayers.Map('map');
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
              map.addLayer(layer);
  
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.zoomToMaxExtent();
          }
          
          function changer() {
              popup.setBackgroundColor("red");
              popup.setSize(new OpenLayers.Size(100,600));
  //            popup.moveTo(new OpenLayers.Pixel(120,120));
  //            popup.setOpacity(.5);
              popup.setBorder("2px solid");    
              popup.setContentHTML("High Chickens");            
          }
  
          function add() {
              popup = new OpenLayers.Popup("chicken", 
                                           new OpenLayers.LonLat(5,40),
                                           new OpenLayers.Size(200,200),
                                           "example popup");
          
              map.addPopup(popup);
          }        
  
          function addAnchor() {
              popup = new OpenLayers.Popup.Anchored("chicken", 
                                           new OpenLayers.LonLat(5,40),
                                           new OpenLayers.Size(200,200),
                                           "example popup");
          
              map.addPopup(popup);
          }        
          
          function addMarker() {
      
              markers = new OpenLayers.Layer.Markers("zibo");
              map.addLayer(markers);
  
              feature = new OpenLayers.Feature(layer, 
                                                   new OpenLayers.LonLat(0,0));
  
  
              marker = feature.createMarker();
              
              markers.addMarker(marker);
              marker.events.register("mousedown", marker, mousedown);
                                                               
          }
          
          function mousedown(evt) {
              if (popup == null) {
                  popup = feature.createPopup();
                  popup.setBackgroundColor("yellow");
                  popup.setOpacity(0.7);
                  popup.events.register("mousedown", popup, onPopupMouseDown);
                  markers.map.addPopup(popup);
              } else {
                  markers.map.removePopup(popup);
                  popup.destroy();
                  popup = null;
              }
              Event.stop(evt);
          }        
  
          /**
           * @param {Event} evt
           */
          function onPopupMouseDown(evt) {
              markers.map.removePopup(popup);
              popup.destroy();
              popup = null;
              Event.stop(evt);
          }
  
  
          function destroy() {
              popup.destroy();
          }
  
          function remove() {
              markers.removeMarker(marker);
          }
  
          function removelayer() {
              layer.destroy();
  //            map.removeLayer(markers);
          }
  
  
          // -->
      </script>
    </head>
    <body onload="init()">
      <div id="map"></div>
      <div style="background-color:purple" onclick="add()"> click to add Popup to map</div>
      <div style="background-color:green" onclick="addMarker()"> click to add a Marker with an AnchoredBubble popup</div>
      <div style="background-color:blue" onclick="changer()"> click to modify popup's attributes</div>
      <div style="background-color:red" onclick="remove()"> click to remove the popup from map</div>
      <div style="background-color:grey" onclick="removelayer()"> click to remove the markers layer</div>
      <div style="background-color:orange" onclick="alert(marker.onScreen())"> marker.onscreen()?</div>
      <div style="background-color:yellow" onclick="destroy()"> click to destroy the popup from map</div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/proxy.cgi
  
  Index: proxy.cgi
  ===================================================================
  #!/usr/bin/env python
  
  
  """This is a blind proxy that we use to get around browser
  restrictions that prevent the Javascript from loading pages not on the
  same server as the Javascript.  This has several problems: it's less
  efficient, it might break some sites, and it's a security risk because
  people can use this proxy to browse the web and possibly do bad stuff
  with it.  If you can get your code signed (see:
  http://trac.openlayers.org/wiki/HowToSignJavascript), then you should
  modify Parameters.js so that this isn't used.  Otherwise, you're stuck
  with it.  It only loads pages via http and https, but it can load any
  content type. XML and HTML are both currently used by Openlayers."""
  
  import urllib
  import cgi
  
  fs = cgi.FieldStorage()
  url = fs.getvalue('url', "http://openlayers.org")
  
  # Designed to prevent Open Proxy type stuff.
  
  allowedHosts = ['www.openlayers.org', 'openlayers.org', 'octo.metacarta.com', 'merrimack.metacarta.com', 'labs.metacarta.com']
  
  try:
      host = url.split("/")[2]
      if allowedHosts and not host in allowedHosts:
          print "Status: 502 Bad Gateway"
          print "Content-Type: text/plain"
          print
          print "This proxy does not allow you to access that location."
      
      elif url.startswith("http://") or url.startswith("https://"):
      
          y = urllib.urlopen(url)
          
          headers = str(y.info()).split('\n')
          for h in headers:
              if h.startswith("Content-Type:"):
                  print h
          print
          
          print y.read()
          
          y.close()
      else:
          print """Content-Type: text/plain
   
  Illegal request."""
  except Exception, E:
      print "Status: 500 Unexpected Error"
      print "Content-Type: text/plain"
      print 
      print "Some unexpected error occurred. Error text was:", E
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/setextent.html
  
  Index: setextent.html
  ===================================================================
  <html>
  <head>
  <title>Setting a visual Extent</title>
  <script src="../lib/OpenLayers.js"></script>
  </head>
  <body>
  <h1>Setting a Visual Extent</h1>
  <p>
    Because the ability to set the map to a given extent is limited by the 
    current resolutions available, zoomToExtent will not always set the map to 
    exactly the right extent. In order to visually annotate the actual extent, 
    this example, will use the Boxes layer to visually describe the desired
    extent as well as setting the map extent.
  </p>
    <div style="width:100%; height:75%" id="map"></div>
    <script defer="defer" type="text/javascript">
      var map = new OpenLayers.Map('map');
      var bounds = new OpenLayers.Bounds(-45,-45, 0, 45); 
      var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
          "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
      map.addLayer(wms);
      map.zoomToExtent(bounds);
      var boxes = new OpenLayers.Layer.Boxes("boxes");
      var box = new OpenLayers.Marker.Box(bounds);
      boxes.addMarker(box);
      map.addLayer(boxes);
    </script>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/test.html
  
  Index: test.html
  ===================================================================
  <html>
  
      <script src="../lib/Prototype.js"></script>
      <script type="text/javascript">
  
  		var one, two, div, msg;
  
  		function init() {
  		
  			one = $("one");
  			two = $("two");
  			div = $("div");
  			msg = $("msg");
  			
  			Event.observe(div, "click", bar);
  		
  			one.checked = true;
  		    two.checked = false;
  		    
  		    Event.observe(one, "change", oneClick);
  		    Event.observe(two, "change", twoClick);
  		
  		}
  
  		function bar(e) {
  			message("clicked div");
  
  			Event.stop(e);
  			
  			var status = "one: ";
  			status += (one.checked) ? "checked" : "unchecked";
  			status += " two: ";
  			status += (two.checked) ? "checked" : "unchecked";
  			message(status);
  		}
  
  		function oneClick(e) {
  			message("clicked one");
  		}
  
  		function twoClick(e) {
  			message("clicked two");
  		}
  		
  		function message(txt) {
  			msg.innerHTML += " ** "  + txt;
  		}
  
  	</script>
  
  	<body onload="init()" onclick="message('clicked body')" onmouseup="message('<br>')">
  
  		<div> The idea here is to simulate the layerswitcher radiobuttons UI 
  		      without all the overhead of openlayers. 
  		      <br>
  		      <br>
  		      There are event handlers attached to the following elements:
  		      <br>
  		      * Body - Prints message "clicked body" to message area
  		      <br>
  		      * Blue Div - Prints message "clicked div" to message area, stops
  		                   the event propagation, prints a message with the 
  		                   status of the two radiobuttons
  		      <br>
  		      * Radio One - Prints message "clicked one" to message area
  		      <br>
  		      * Radio Two - Prints message "clicked two" to message area
  		      <br>
  		      <br>
  		      <b>
  			  The problem, as you will see if you click the radio buttons 
  			  themselves, is that their "checked" status seems to update, but
  			  their visual UI bit does not. Can we fix this!?!
  		      </b>
  		</div>
  
  		<div id="div" style="background-color:blue; margin:50px">
  			<input id="one" type="radio" name="foo"/>
  			<span> one </span>
  			<br>
  			<input id="two" type="radio" name="foo"/>
  			<span> two </span>
  		</div>
  	
  		<div id="msg" style="background-color:pink; margin-top:200px">
  			Events: 
  		</div>
  
  	</body>
  </html>
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/textfile.txt
  
  Index: textfile.txt
  ===================================================================
  point	title	description	iconSize	
  10,20	my orange title	my orange description	21,25
  2,4	my aqua title	my aqua description	21,25
  42,-71	my purple title	my purple description<br/>is great.	21,25
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/tiger.html
  
  Index: tiger.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 700px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var map = new OpenLayers.Map('map', {'maxResolution': 1.40625/4, controls:[]});
  
              var ka_wms = new OpenLayers.Layer.KaMap( "TIGER (KaMap)", 
                  "http://boston.freemap.in/tile.php" , { map: 'tiger', layers: 'TIGER' });
              var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
                  "http://wms.jpl.nasa.gov/wms.cgi", 
                  {layers: "modis,global_mosaic"});
              jpl_wms.setVisibility(false);
              ka_wms.isBaseLayer = false;
              map.addLayers([jpl_wms,ka_wms]); 
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.addControl(new OpenLayers.Control.MouseToolbar());
              map.addControl(new OpenLayers.Control.PanZoomBar());
              map.setCenter(new OpenLayers.LonLat(-96, 35), 2);
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/urban.html
  
  Index: urban.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 800px;
              height: 475px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var mapOptions = { maxResolution: 1.6, numZoomLevels: 21};
              var map = new OpenLayers.Map('map', mapOptions);
              
              var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'} );
  
              var ww = new OpenLayers.Layer.WorldWind( "Urban", 
                  "http://worldwind25.arc.nasa.gov/tile/tile.aspx?", .8, 9,
                  {T:"104"}, { tileSize: new OpenLayers.Size(512,512) });
  
  
              map.addLayers([ol_wms, ww]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.setCenter(new OpenLayers.LonLat(-71.4, 42.3), 6);
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/ve.html
  
  Index: ve.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 100%;
              height: 512px;
              border: 1px solid black;
          }
      </style>
  
  
      <script src='http://dev.virtualearth.net/mapcontrol/v3/mapcontrol.js'></script>
  
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
   
          var lon = 5;
          var lat = 40;
          var zoom = 15;
          var map, velayer, layer;
  
          function init(){
              map = new OpenLayers.Map( $('map') , 
              {controls:[new OpenLayers.Control.MouseDefaults()]});
  
              velayer = new OpenLayers.Layer.VirtualEarth( "VE",
              { minZoomLevel: 4, maxZoomLevel: 6 }); 
              map.addLayer(velayer);
              
              markers = new OpenLayers.Layer.Markers("markers");
              map.addLayer(markers);
  
              map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
              map.addControl( new OpenLayers.Control.LayerSwitcher() );
              map.addControl( new OpenLayers.Control.PanZoomBar() );
          }
          
          function add() {
              
              marker = new OpenLayers.Marker(new OpenLayers.LonLat(2, 41));
              markers.addMarker(marker);
          }
  
          function remove() {
              markers.removeMarker(marker);
          }
    // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers VE Example</h1>
      <div id="map"></div>
      <div style="background-color:green" onclick="add()"> click to add the marker to the map</div>
      <div style="background-color:red" onclick="remove()"> click to remove the marker from the map</div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/wfs.html
  
  Index: wfs.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var map, layer;
  
          function init(){
              OpenLayers.ProxyHost="/proxy/?url=";
              map = new OpenLayers.Map('map');
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
              map.addLayer(layer);
  
              layer = new OpenLayers.Layer.WFS( "Owl Survey",
                  "http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?",
                  {typename: "OWLS", maxfeatures: 10},
                  { featureClass: OpenLayers.Feature.WFS});
              map.addLayer(layer);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.setCenter(new OpenLayers.LonLat(-100, 60), 3);
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/wms.html
  
  Index: wms.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 800px;
              height: 475px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var lon = 5;
          var lat = 40;
          var zoom = 5;
          var map, layer;
  
          function init(){
              map = new OpenLayers.Map( $('map') );
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                      "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
              map.addLayer(layer);
  
              map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
              map.addControl( new OpenLayers.Control.LayerSwitcher() );
          }
          
          // -->
      </script>
    </head>
    <body onload="init()">
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/wmst.html
  
  Index: wmst.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 512px;
              height: 400px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
  var map,ia_wms;
          function init(){
              map = new OpenLayers.Map('map');
  
              var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'} );
  
              var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
                  "http://wms.jpl.nasa.gov/wms.cgi", 
                  {layers: "modis,global_mosaic"});
  
  	        ia_wms = new OpenLayers.Layer.WMS("Nexrad","http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi?",{layers:"nexrad-n0r-wmst",transparent:true,format:'image/png',time:document.getElementById('time').value});
  
              jpl_wms.setVisibility(false);
  
              map.addLayers([ol_wms, jpl_wms, ia_wms]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.zoomToMaxExtent();
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <p>WMS-T example: update the times, and the radar image will change. Uses Layer.changeParams. Thanks to David Bitner for the inspiration, the original code, and the kick in the butt!</p>
      <input type='text' id='time'  value="2005-08-29T13:00:00Z" onChange='ia_wms.mergeNewParams({"time":this.value});' >
      <div id="map"></div>
    </body>
  </html>
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/worldwind.html
  
  Index: worldwind.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <style type="text/css">
          #map {
              width: 800px;
              height: 475px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          function init(){
              var map = new OpenLayers.Map('map', {'maxResolution': .0703125*4});
  
              var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'} );
  
              var ww = new OpenLayers.Layer.WorldWind( "Bathy", 
                  "http://worldwind25.arc.nasa.gov/tile/tile.aspx?", 36, 4,
                  {T:"bmng.topo.bathy.200406"});
              ww.setTileSize(new OpenLayers.Size(512,512));
              var ww2 = new OpenLayers.Layer.WorldWind( "LANDSAT", 
                  "http://worldwind25.arc.nasa.gov/tile/tile.aspx", 2.25, 4,
                  {T:"105"});
              ww2.setTileSize(new OpenLayers.Size(512,512));
  
  
  
              map.addLayers([ol_wms, ww, ww2]);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
              map.setCenter(new OpenLayers.LonLat(-71.4, 42.3), 6);
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/xhtml.html
  
  Index: xhtml.html
  ===================================================================
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" style="width:100%">
  <head>
  <script src="../lib/OpenLayers.js"></script>
  </head>
  <body style="width:100%">
    <div style="width:100%; height:500px" id="map"></div>
    <script defer="defer" type="text/javascript">
      var map = new OpenLayers.Map('map');
      var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
          "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
      map.addLayer(wms);
      map.zoomToMaxExtent();
    </script>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/yahoo.html
  
  Index: yahoo.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 512px;
              height: 512px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var map, layer, velayer;
  
          function init(){
              map = new OpenLayers.Map('map');
  
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                  "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
              map.addLayer(layer);
  
  
              yahooLayer = new OpenLayers.Layer.Yahoo( "Yahoo"); 
  
              map.addLayer(yahooLayer);
  
              map.setCenter(new OpenLayers.LonLat(-5, 40), 4);
              map.addControl(new OpenLayers.Control.LayerSwitcher());
          }
          // -->
      </script>
    </head>
    <body onload="init()">
      <h1>OpenLayers Example</h1>
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/examples/zoomLevels.html
  
  Index: zoomLevels.html
  ===================================================================
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="imagetoolbar" content="no"> <!--ie image gizmo OFF!-->
      <style type="text/css">
          #map {
              width: 800px;
              height: 475px;
              border: 1px solid black;
          }
      </style>
      <script src="../lib/OpenLayers.js"></script>
      <script type="text/javascript">
          <!--
          var lon = 50;
          var lat = 0;
          var zoom = 0;
          var map, layer;
  
          function init(){
              
              var options = { 
  //                            resolutions: [1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.00137329101],
  //                            scales: [50000000, 10000000],
  //                            maxResolution: 0.17578125,
  //                            minResolution: 0.0439453125,
  //                            maxScale: 10000000,
  //                            minScale: 50000000,
                              minResolution: "auto",
                              minExtent: new OpenLayers.Bounds(-1, -1, 1, 1), 
                              maxResolution: "auto",
                              maxExtent: new OpenLayers.Bounds(-180, -90, 90, 180), 
  //                            numZoomLevels: 5,
                              controls: [new OpenLayers.Control.MouseDefaults()]
                            };
  
              map = new OpenLayers.Map( $('map') , options);
              
              map.addControl(new OpenLayers.Control.PanZoomBar());
  
              layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
                      "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'});
              map.addLayer(layer);
  
  
              map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
          }
          
          // -->
      </script>
    </head>
    <body onload="init()">
      <div id="map"></div>
    </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/img/blank.gif
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/drag-rectangle-off.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/drag-rectangle-on.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/east-mini.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/layer-switcher-maximize.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/layer-switcher-minimize.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/marker.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/measuring-stick-off.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/measuring-stick-on.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/north-mini.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/panning-hand-off.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/panning-hand-on.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/slider.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/south-mini.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/west-mini.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/zoom-minus-mini.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/zoom-plus-mini.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/zoom-world-mini.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/img/zoombar.png
  
  	<<Binary file>>
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers.js
  
  Index: OpenLayers.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  ////
  /// This blob sucks in all the files in uncompressed form for ease of use
  ///
  
  OpenLayers = new Object();
  
  OpenLayers._scriptName = ( 
      typeof(_OPENLAYERS_SFL_) == "undefined" ? "lib/OpenLayers.js" 
                                              : "OpenLayers.js" );
  
  OpenLayers._getScriptLocation = function () {
      var scriptLocation = "";
      var SCRIPT_NAME = OpenLayers._scriptName;
   
      var scripts = document.getElementsByTagName('script');
      for (var i = 0; i < scripts.length; i++) {
          var src = scripts[i].getAttribute('src');
          if (src) {
              var index = src.lastIndexOf(SCRIPT_NAME); 
              // is it found, at the end of the URL?
              if ((index > -1) && (index + SCRIPT_NAME.length == src.length)) {  
                  scriptLocation = src.slice(0, -SCRIPT_NAME.length);
                  break;
              }
          }
      }
      return scriptLocation;
  }
  
  /*
    `_OPENLAYERS_SFL_` is a flag indicating this file is being included
    in a Single File Library build of the OpenLayers Library.
  
    When we are *not* part of a SFL build we dynamically include the
    OpenLayers library code.
  
    When we *are* part of a SFL build we do not dynamically include the 
    OpenLayers library code as it will be appended at the end of this file.
  */
  if (typeof(_OPENLAYERS_SFL_) == "undefined") {
      /*
        The original code appeared to use a try/catch block
        to avoid polluting the global namespace,
        we now use a anonymous function to achieve the same result.
       */
      (function() {
      var jsfiles=new Array(
          "Prototype.js", 
          "Rico/Corner.js",
          "Rico/Color.js",
          "OpenLayers/BaseTypes.js",
          "OpenLayers/Util.js",
          "OpenLayers/Ajax.js",
          "OpenLayers/Events.js",
          "OpenLayers/Map.js",
          "OpenLayers/Layer.js",
          "OpenLayers/Icon.js",
          "OpenLayers/Marker.js",
          "OpenLayers/Marker/Box.js",
          "OpenLayers/Popup.js",
          "OpenLayers/Tile.js",
          "OpenLayers/Feature.js",
          "OpenLayers/Feature/WFS.js",
          "OpenLayers/Tile/Image.js",
          "OpenLayers/Tile/WFS.js",
          "OpenLayers/Layer/EventPane.js",
          "OpenLayers/Layer/Google.js",
          "OpenLayers/Layer/VirtualEarth.js",
  //        "OpenLayers/Layer/Yahoo.js",
          "OpenLayers/Layer/HTTPRequest.js",
          "OpenLayers/Layer/Grid.js",
          "OpenLayers/Layer/KaMap.js",
          "OpenLayers/Layer/Markers.js",
          "OpenLayers/Layer/Text.js",
          "OpenLayers/Layer/WorldWind.js",
          "OpenLayers/Layer/WMS.js",
          "OpenLayers/Layer/WFS.js",
          "OpenLayers/Layer/WMS/Untiled.js",
          "OpenLayers/Layer/GeoRSS.js",
          "OpenLayers/Layer/Boxes.js",
          "OpenLayers/Popup/Anchored.js",
          "OpenLayers/Popup/AnchoredBubble.js",
          "OpenLayers/Control.js",
          "OpenLayers/Control/MouseDefaults.js",
          "OpenLayers/Control/MouseToolbar.js",
          "OpenLayers/Control/KeyboardDefaults.js",
          "OpenLayers/Control/PanZoom.js",
          "OpenLayers/Control/PanZoomBar.js",
          "OpenLayers/Control/Permalink.js",
          "OpenLayers/Control/Scale.js",
          "OpenLayers/Control/LayerSwitcher.js",
          "OpenLayers/Control/LayerTabs.js"
      ); // etc.
  
      var allScriptTags = "";
      var host = OpenLayers._getScriptLocation() + "lib/";
  
      // check to see if prototype.js was already loaded
      //  if so, skip the first dynamic include 
      //
      var start=1;
      try { x = Prototype; }
      catch (e) { start=0; }
  
      for (var i = start; i < jsfiles.length; i++) {
          var currentScriptTag = "<script src='" + host + jsfiles[i] + "'></script>"; 
          allScriptTags += currentScriptTag;
      }
      document.write(allScriptTags);
      })();
  }
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/Prototype.js
  
  Index: Prototype.js
  ===================================================================
  /*  Prototype JavaScript framework, version 1.4.0
   *  (c) 2005 Sam Stephenson <sam at conio.net>
   *
   *  Prototype is freely distributable under the terms of an MIT-style license.
   *  For details, see the Prototype web site: http://prototype.conio.net/
   *
  /*--------------------------------------------------------------------------*/
  
  var Prototype = {
    Version: '1.4.0',
    ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
  
    emptyFunction: function() {},
    K: function(x) {return x}
  }
  
  var Class = {
    create: function() {
      return function() {
        this.initialize.apply(this, arguments);
      }
    }
  }
  
  var Abstract = new Object();
  
  Object.extend = function(destination, source) {
    for (property in source) {
      destination[property] = source[property];
    }
    return destination;
  }
  
  Object.inspect = function(object) {
    try {
      if (object == undefined) return 'undefined';
      if (object == null) return 'null';
      return object.inspect ? object.inspect() : object.toString();
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  }
  
  Function.prototype.bind = function() {
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat($A(arguments)));
    }
  }
  
  Function.prototype.bindAsEventListener = function(object) {
    var __method = this;
    return function(event) {
      return __method.call(object, event || window.event);
    }
  }
  
  Object.extend(Number.prototype, {
    toColorPart: function() {
      var digits = this.toString(16);
      if (this < 16) return '0' + digits;
      return digits;
    },
  
    succ: function() {
      return this + 1;
    },
  
    times: function(iterator) {
      $R(0, this, true).each(iterator);
      return this;
    }
  });
  
  var Try = {
    these: function() {
      var returnValue;
  
      for (var i = 0; i < arguments.length; i++) {
        var lambda = arguments[i];
        try {
          returnValue = lambda();
          break;
        } catch (e) {}
      }
  
      return returnValue;
    }
  }
  
  /*--------------------------------------------------------------------------*/
  
  var PeriodicalExecuter = Class.create();
  PeriodicalExecuter.prototype = {
    initialize: function(callback, frequency) {
      this.callback = callback;
      this.frequency = frequency;
      this.currentlyExecuting = false;
  
      this.registerCallback();
    },
  
    registerCallback: function() {
      setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
    },
  
    onTimerEvent: function() {
      if (!this.currentlyExecuting) {
        try {
          this.currentlyExecuting = true;
          this.callback();
        } finally {
          this.currentlyExecuting = false;
        }
      }
    }
  }
  
  /*--------------------------------------------------------------------------*/
  
  function $() {
    var elements = new Array();
  
    for (var i = 0; i < arguments.length; i++) {
      var element = arguments[i];
      if (typeof element == 'string')
        element = document.getElementById(element);
  
      if (arguments.length == 1)
        return element;
  
      elements.push(element);
    }
  
    return elements;
  }
  Object.extend(String.prototype, {
    stripTags: function() {
      return this.replace(/<\/?[^>]+>/gi, '');
    },
  
    stripScripts: function() {
      return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
    },
  
    extractScripts: function() {
      var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
      var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
      return (this.match(matchAll) || []).map(function(scriptTag) {
        return (scriptTag.match(matchOne) || ['', ''])[1];
      });
    },
  
    evalScripts: function() {
      return this.extractScripts().map(eval);
    },
  
    escapeHTML: function() {
      var div = document.createElement('div');
      var text = document.createTextNode(this);
      div.appendChild(text);
      return div.innerHTML;
    },
  
    unescapeHTML: function() {
      var div = document.createElement('div');
      div.innerHTML = this.stripTags();
      return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
    },
  
    toQueryParams: function() {
      var pairs = this.match(/^\??(.*)$/)[1].split('&');
      return pairs.inject({}, function(params, pairString) {
        var pair = pairString.split('=');
        params[pair[0]] = pair[1];
        return params;
      });
    },
  
    toArray: function() {
      return this.split('');
    },
  
    camelize: function() {
      var oStringList = this.split('-');
      if (oStringList.length == 1) return oStringList[0];
  
      var camelizedString = this.indexOf('-') == 0
        ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
        : oStringList[0];
  
      for (var i = 1, len = oStringList.length; i < len; i++) {
        var s = oStringList[i];
        camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
      }
  
      return camelizedString;
    },
  
    inspect: function() {
      return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'";
    }
  });
  
  String.prototype.parseQuery = String.prototype.toQueryParams;
  
  var $break    = new Object();
  var $continue = new Object();
  
  var Enumerable = {
    each: function(iterator) {
      var index = 0;
      try {
        this._each(function(value) {
          try {
            iterator(value, index++);
          } catch (e) {
            if (e != $continue) throw e;
          }
        });
      } catch (e) {
        if (e != $break) throw e;
      }
    },
  
    all: function(iterator) {
      var result = true;
      this.each(function(value, index) {
        result = result && !!(iterator || Prototype.K)(value, index);
        if (!result) throw $break;
      });
      return result;
    },
  
    any: function(iterator) {
      var result = true;
      this.each(function(value, index) {
        if (result = !!(iterator || Prototype.K)(value, index))
          throw $break;
      });
      return result;
    },
  
    collect: function(iterator) {
      var results = [];
      this.each(function(value, index) {
        results.push(iterator(value, index));
      });
      return results;
    },
  
    detect: function (iterator) {
      var result;
      this.each(function(value, index) {
        if (iterator(value, index)) {
          result = value;
          throw $break;
        }
      });
      return result;
    },
  
    findAll: function(iterator) {
      var results = [];
      this.each(function(value, index) {
        if (iterator(value, index))
          results.push(value);
      });
      return results;
    },
  
    grep: function(pattern, iterator) {
      var results = [];
      this.each(function(value, index) {
        var stringValue = value.toString();
        if (stringValue.match(pattern))
          results.push((iterator || Prototype.K)(value, index));
      })
      return results;
    },
  
    include: function(object) {
      var found = false;
      this.each(function(value) {
        if (value == object) {
          found = true;
          throw $break;
        }
      });
      return found;
    },
  
    inject: function(memo, iterator) {
      this.each(function(value, index) {
        memo = iterator(memo, value, index);
      });
      return memo;
    },
  
    invoke: function(method) {
      var args = $A(arguments).slice(1);
      return this.collect(function(value) {
        return value[method].apply(value, args);
      });
    },
  
    max: function(iterator) {
      var result;
      this.each(function(value, index) {
        value = (iterator || Prototype.K)(value, index);
        if (value >= (result || value))
          result = value;
      });
      return result;
    },
  
    min: function(iterator) {
      var result;
      this.each(function(value, index) {
        value = (iterator || Prototype.K)(value, index);
        if (value <= (result || value))
          result = value;
      });
      return result;
    },
  
    partition: function(iterator) {
      var trues = [], falses = [];
      this.each(function(value, index) {
        ((iterator || Prototype.K)(value, index) ?
          trues : falses).push(value);
      });
      return [trues, falses];
    },
  
    pluck: function(property) {
      var results = [];
      this.each(function(value, index) {
        results.push(value[property]);
      });
      return results;
    },
  
    reject: function(iterator) {
      var results = [];
      this.each(function(value, index) {
        if (!iterator(value, index))
          results.push(value);
      });
      return results;
    },
  
    sortBy: function(iterator) {
      return this.collect(function(value, index) {
        return {value: value, criteria: iterator(value, index)};
      }).sort(function(left, right) {
        var a = left.criteria, b = right.criteria;
        return a < b ? -1 : a > b ? 1 : 0;
      }).pluck('value');
    },
  
    toArray: function() {
      return this.collect(Prototype.K);
    },
  
    zip: function() {
      var iterator = Prototype.K, args = $A(arguments);
      if (typeof args.last() == 'function')
        iterator = args.pop();
  
      var collections = [this].concat(args).map($A);
      return this.map(function(value, index) {
        iterator(value = collections.pluck(index));
        return value;
      });
    },
  
    inspect: function() {
      return '#<Enumerable:' + this.toArray().inspect() + '>';
    }
  }
  
  Object.extend(Enumerable, {
    map:     Enumerable.collect,
    find:    Enumerable.detect,
    select:  Enumerable.findAll,
    member:  Enumerable.include,
    entries: Enumerable.toArray
  });
  var $A = Array.from = function(iterable) {
    if (!iterable) return [];
    if (iterable.toArray) {
      return iterable.toArray();
    } else {
      var results = [];
      for (var i = 0; i < iterable.length; i++)
        results.push(iterable[i]);
      return results;
    }
  }
  
  Object.extend(Array.prototype, Enumerable);
  
  Array.prototype._reverse = Array.prototype.reverse;
  
  Object.extend(Array.prototype, {
    _each: function(iterator) {
      for (var i = 0; i < this.length; i++)
        iterator(this[i]);
    },
  
    clear: function() {
      this.length = 0;
      return this;
    },
  
    first: function() {
      return this[0];
    },
  
    last: function() {
      return this[this.length - 1];
    },
  
    compact: function() {
      return this.select(function(value) {
        return value != undefined || value != null;
      });
    },
  
    flatten: function() {
      return this.inject([], function(array, value) {
        return array.concat(value.constructor == Array ?
          value.flatten() : [value]);
      });
    },
  
    without: function() {
      var values = $A(arguments);
      return this.select(function(value) {
        return !values.include(value);
      });
    },
  
    indexOf: function(object) {
      for (var i = 0; i < this.length; i++)
        if (this[i] == object) return i;
      return -1;
    },
  
    reverse: function(inline) {
      return (inline !== false ? this : this.toArray())._reverse();
    },
  
    shift: function() {
      var result = this[0];
      for (var i = 0; i < this.length - 1; i++)
        this[i] = this[i + 1];
      this.length--;
      return result;
    },
  
    inspect: function() {
      return '[' + this.map(Object.inspect).join(', ') + ']';
    }
  });
  var Hash = {
    _each: function(iterator) {
      for (key in this) {
        var value = this[key];
        if (typeof value == 'function') continue;
  
        var pair = [key, value];
        pair.key = key;
        pair.value = value;
        iterator(pair);
      }
    },
  
    keys: function() {
      return this.pluck('key');
    },
  
    values: function() {
      return this.pluck('value');
    },
  
    merge: function(hash) {
      return $H(hash).inject($H(this), function(mergedHash, pair) {
        mergedHash[pair.key] = pair.value;
        return mergedHash;
      });
    },
  
    toQueryString: function() {
      return this.map(function(pair) {
        return pair.map(encodeURIComponent).join('=');
      }).join('&');
    },
  
    inspect: function() {
      return '#<Hash:{' + this.map(function(pair) {
        return pair.map(Object.inspect).join(': ');
      }).join(', ') + '}>';
    }
  }
  
  function $H(object) {
    var hash = Object.extend({}, object || {});
    Object.extend(hash, Enumerable);
    Object.extend(hash, Hash);
    return hash;
  }
  ObjectRange = Class.create();
  Object.extend(ObjectRange.prototype, Enumerable);
  Object.extend(ObjectRange.prototype, {
    initialize: function(start, end, exclusive) {
      this.start = start;
      this.end = end;
      this.exclusive = exclusive;
    },
  
    _each: function(iterator) {
      var value = this.start;
      do {
        iterator(value);
        value = value.succ();
      } while (this.include(value));
    },
  
    include: function(value) {
      if (value < this.start)
        return false;
      if (this.exclusive)
        return value < this.end;
      return value <= this.end;
    }
  });
  
  var $R = function(start, end, exclusive) {
    return new ObjectRange(start, end, exclusive);
  }
  
  var Ajax = {
    getTransport: function() {
      return Try.these(
        function() {return new ActiveXObject('Msxml2.XMLHTTP')},
        function() {return new ActiveXObject('Microsoft.XMLHTTP')},
        function() {return new XMLHttpRequest()}
      ) || false;
    },
  
    activeRequestCount: 0
  }
  
  Ajax.Responders = {
    responders: [],
  
    _each: function(iterator) {
      this.responders._each(iterator);
    },
  
    register: function(responderToAdd) {
      if (!this.include(responderToAdd))
        this.responders.push(responderToAdd);
    },
  
    unregister: function(responderToRemove) {
      this.responders = this.responders.without(responderToRemove);
    },
  
    dispatch: function(callback, request, transport, json) {
      this.each(function(responder) {
        if (responder[callback] && typeof responder[callback] == 'function') {
          try {
            responder[callback].apply(responder, [request, transport, json]);
          } catch (e) {}
        }
      });
    }
  };
  
  Object.extend(Ajax.Responders, Enumerable);
  
  Ajax.Responders.register({
    onCreate: function() {
      Ajax.activeRequestCount++;
    },
  
    onComplete: function() {
      Ajax.activeRequestCount--;
    }
  });
  
  Ajax.Base = function() {};
  Ajax.Base.prototype = {
    setOptions: function(options) {
      this.options = {
        method:       'post',
        asynchronous: true,
        parameters:   ''
      }
      Object.extend(this.options, options || {});
    },
  
    responseIsSuccess: function() {
      return this.transport.status == undefined
          || this.transport.status == 0
          || (this.transport.status >= 200 && this.transport.status < 300);
    },
  
    responseIsFailure: function() {
      return !this.responseIsSuccess();
    }
  }
  
  Ajax.Request = Class.create();
  Ajax.Request.Events =
    ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
  
  Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
    initialize: function(url, options) {
      this.transport = Ajax.getTransport();
      this.setOptions(options);
      this.request(url);
    },
  
    request: function(url) {
      var parameters = this.options.parameters || '';
      if (parameters.length > 0) parameters += '&_=';
  
      try {
        this.url = url;
        if (this.options.method == 'get' && parameters.length > 0)
          this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
  
        Ajax.Responders.dispatch('onCreate', this, this.transport);
  
        this.transport.open(this.options.method, this.url,
          this.options.asynchronous);
  
        if (this.options.asynchronous) {
          this.transport.onreadystatechange = this.onStateChange.bind(this);
          setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
        }
  
        this.setRequestHeaders();
  
        var body = this.options.postBody ? this.options.postBody : parameters;
        this.transport.send(this.options.method == 'post' ? body : null);
  
      } catch (e) {
        this.dispatchException(e);
      }
    },
  
    setRequestHeaders: function() {
      var requestHeaders =
        ['X-Requested-With', 'XMLHttpRequest',
         'X-Prototype-Version', Prototype.Version];
  
      if (this.options.method == 'post') {
        requestHeaders.push('Content-type',
          'application/x-www-form-urlencoded');
  
        /* Force "Connection: close" for Mozilla browsers to work around
         * a bug where XMLHttpReqeuest sends an incorrect Content-length
         * header. See Mozilla Bugzilla #246651.
         */
        if (this.transport.overrideMimeType)
          requestHeaders.push('Connection', 'close');
      }
  
      if (this.options.requestHeaders)
        requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
  
      for (var i = 0; i < requestHeaders.length; i += 2)
        this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
    },
  
    onStateChange: function() {
      var readyState = this.transport.readyState;
      if (readyState != 1)
        this.respondToReadyState(this.transport.readyState);
    },
  
    header: function(name) {
      try {
        return this.transport.getResponseHeader(name);
      } catch (e) {}
    },
  
    evalJSON: function() {
      try {
        return eval(this.header('X-JSON'));
      } catch (e) {}
    },
  
    evalResponse: function() {
      try {
        return eval(this.transport.responseText);
      } catch (e) {
        this.dispatchException(e);
      }
    },
  
    respondToReadyState: function(readyState) {
      var event = Ajax.Request.Events[readyState];
      var transport = this.transport, json = this.evalJSON();
  
      if (event == 'Complete') {
        try {
          (this.options['on' + this.transport.status]
           || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
           || Prototype.emptyFunction)(transport, json);
        } catch (e) {
          this.dispatchException(e);
        }
  
        if ((this.header('Content-type') || '').match(/^text\/javascript/i))
          this.evalResponse();
      }
  
      try {
        (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
        Ajax.Responders.dispatch('on' + event, this, transport, json);
      } catch (e) {
        this.dispatchException(e);
      }
  
      /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
      if (event == 'Complete')
        this.transport.onreadystatechange = Prototype.emptyFunction;
    },
  
    dispatchException: function(exception) {
      (this.options.onException || Prototype.emptyFunction)(this, exception);
      Ajax.Responders.dispatch('onException', this, exception);
    }
  });
  
  Ajax.Updater = Class.create();
  
  Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
    initialize: function(container, url, options) {
      this.containers = {
        success: container.success ? $(container.success) : $(container),
        failure: container.failure ? $(container.failure) :
          (container.success ? null : $(container))
      }
  
      this.transport = Ajax.getTransport();
      this.setOptions(options);
  
      var onComplete = this.options.onComplete || Prototype.emptyFunction;
      this.options.onComplete = (function(transport, object) {
        this.updateContent();
        onComplete(transport, object);
      }).bind(this);
  
      this.request(url);
    },
  
    updateContent: function() {
      var receiver = this.responseIsSuccess() ?
        this.containers.success : this.containers.failure;
      var response = this.transport.responseText;
  
      if (!this.options.evalScripts)
        response = response.stripScripts();
  
      if (receiver) {
        if (this.options.insertion) {
          new this.options.insertion(receiver, response);
        } else {
          Element.update(receiver, response);
        }
      }
  
      if (this.responseIsSuccess()) {
        if (this.onComplete)
          setTimeout(this.onComplete.bind(this), 10);
      }
    }
  });
  
  Ajax.PeriodicalUpdater = Class.create();
  Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
    initialize: function(container, url, options) {
      this.setOptions(options);
      this.onComplete = this.options.onComplete;
  
      this.frequency = (this.options.frequency || 2);
      this.decay = (this.options.decay || 1);
  
      this.updater = {};
      this.container = container;
      this.url = url;
  
      this.start();
    },
  
    start: function() {
      this.options.onComplete = this.updateComplete.bind(this);
      this.onTimerEvent();
    },
  
    stop: function() {
      this.updater.onComplete = undefined;
      clearTimeout(this.timer);
      (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
    },
  
    updateComplete: function(request) {
      if (this.options.decay) {
        this.decay = (request.responseText == this.lastText ?
          this.decay * this.options.decay : 1);
  
        this.lastText = request.responseText;
      }
      this.timer = setTimeout(this.onTimerEvent.bind(this),
        this.decay * this.frequency * 1000);
    },
  
    onTimerEvent: function() {
      this.updater = new Ajax.Updater(this.container, this.url, this.options);
    }
  });
  document.getElementsByClassName = function(className, parentElement) {
    var children = ($(parentElement) || document.body).getElementsByTagName('*');
    return $A(children).inject([], function(elements, child) {
      if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
        elements.push(child);
      return elements;
    });
  }
  
  /*--------------------------------------------------------------------------*/
  
  if (!window.Element) {
    var Element = new Object();
  }
  
  Object.extend(Element, {
    visible: function(element) {
      return $(element).style.display != 'none';
    },
  
    toggle: function() {
      for (var i = 0; i < arguments.length; i++) {
        var element = $(arguments[i]);
        Element[Element.visible(element) ? 'hide' : 'show'](element);
      }
    },
  
    hide: function() {
      for (var i = 0; i < arguments.length; i++) {
        var element = $(arguments[i]);
        element.style.display = 'none';
      }
    },
  
    show: function() {
      for (var i = 0; i < arguments.length; i++) {
        var element = $(arguments[i]);
        element.style.display = '';
      }
    },
  
    remove: function(element) {
      element = $(element);
      element.parentNode.removeChild(element);
    },
  
    update: function(element, html) {
      $(element).innerHTML = html.stripScripts();
      setTimeout(function() {html.evalScripts()}, 10);
    },
  
    getHeight: function(element) {
      element = $(element);
      return element.offsetHeight;
    },
  
    classNames: function(element) {
      return new Element.ClassNames(element);
    },
  
    hasClassName: function(element, className) {
      if (!(element = $(element))) return;
      return Element.classNames(element).include(className);
    },
  
    addClassName: function(element, className) {
      if (!(element = $(element))) return;
      return Element.classNames(element).add(className);
    },
  
    removeClassName: function(element, className) {
      if (!(element = $(element))) return;
      return Element.classNames(element).remove(className);
    },
  
    // removes whitespace-only text node children
    cleanWhitespace: function(element) {
      element = $(element);
      for (var i = 0; i < element.childNodes.length; i++) {
        var node = element.childNodes[i];
        if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
          Element.remove(node);
      }
    },
  
    empty: function(element) {
      return $(element).innerHTML.match(/^\s*$/);
    },
  
    scrollTo: function(element) {
      element = $(element);
      var x = element.x ? element.x : element.offsetLeft,
          y = element.y ? element.y : element.offsetTop;
      window.scrollTo(x, y);
    },
  
    getStyle: function(element, style) {
      element = $(element);
      var value = element.style[style.camelize()];
      if (!value) {
        if (document.defaultView && document.defaultView.getComputedStyle) {
          var css = document.defaultView.getComputedStyle(element, null);
          value = css ? css.getPropertyValue(style) : null;
        } else if (element.currentStyle) {
          value = element.currentStyle[style.camelize()];
        }
      }
  
      if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
        if (Element.getStyle(element, 'position') == 'static') value = 'auto';
  
      return value == 'auto' ? null : value;
    },
  
    setStyle: function(element, style) {
      element = $(element);
      for (name in style)
        element.style[name.camelize()] = style[name];
    },
  
    getDimensions: function(element) {
      element = $(element);
      if (Element.getStyle(element, 'display') != 'none')
        return {width: element.offsetWidth, height: element.offsetHeight};
  
      // All *Width and *Height properties give 0 on elements with display none,
      // so enable the element temporarily
      var els = element.style;
      var originalVisibility = els.visibility;
      var originalPosition = els.position;
      els.visibility = 'hidden';
      els.position = 'absolute';
      els.display = '';
      var originalWidth = element.clientWidth;
      var originalHeight = element.clientHeight;
      els.display = 'none';
      els.position = originalPosition;
      els.visibility = originalVisibility;
      return {width: originalWidth, height: originalHeight};
    },
  
    makePositioned: function(element) {
      element = $(element);
      var pos = Element.getStyle(element, 'position');
      if (pos == 'static' || !pos) {
        element._madePositioned = true;
        element.style.position = 'relative';
        // Opera returns the offset relative to the positioning context, when an
        // element is position relative but top and left have not been defined
        if (window.opera) {
          element.style.top = 0;
          element.style.left = 0;
        }
      }
    },
  
    undoPositioned: function(element) {
      element = $(element);
      if (element._madePositioned) {
        element._madePositioned = undefined;
        element.style.position =
          element.style.top =
          element.style.left =
          element.style.bottom =
          element.style.right = '';
      }
    },
  
    makeClipping: function(element) {
      element = $(element);
      if (element._overflow) return;
      element._overflow = element.style.overflow;
      if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
        element.style.overflow = 'hidden';
    },
  
    undoClipping: function(element) {
      element = $(element);
      if (element._overflow) return;
      element.style.overflow = element._overflow;
      element._overflow = undefined;
    }
  });
  
  var Toggle = new Object();
  Toggle.display = Element.toggle;
  
  /*--------------------------------------------------------------------------*/
  
  Abstract.Insertion = function(adjacency) {
    this.adjacency = adjacency;
  }
  
  Abstract.Insertion.prototype = {
    initialize: function(element, content) {
      this.element = $(element);
      this.content = content.stripScripts();
  
      if (this.adjacency && this.element.insertAdjacentHTML) {
        try {
          this.element.insertAdjacentHTML(this.adjacency, this.content);
        } catch (e) {
          if (this.element.tagName.toLowerCase() == 'tbody') {
            this.insertContent(this.contentFromAnonymousTable());
          } else {
            throw e;
          }
        }
      } else {
        this.range = this.element.ownerDocument.createRange();
        if (this.initializeRange) this.initializeRange();
        this.insertContent([this.range.createContextualFragment(this.content)]);
      }
  
      setTimeout(function() {content.evalScripts()}, 10);
    },
  
    contentFromAnonymousTable: function() {
      var div = document.createElement('div');
      div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
      return $A(div.childNodes[0].childNodes[0].childNodes);
    }
  }
  
  var Insertion = new Object();
  
  Insertion.Before = Class.create();
  Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
    initializeRange: function() {
      this.range.setStartBefore(this.element);
    },
  
    insertContent: function(fragments) {
      fragments.each((function(fragment) {
        this.element.parentNode.insertBefore(fragment, this.element);
      }).bind(this));
    }
  });
  
  Insertion.Top = Class.create();
  Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
    initializeRange: function() {
      this.range.selectNodeContents(this.element);
      this.range.collapse(true);
    },
  
    insertContent: function(fragments) {
      fragments.reverse(false).each((function(fragment) {
        this.element.insertBefore(fragment, this.element.firstChild);
      }).bind(this));
    }
  });
  
  Insertion.Bottom = Class.create();
  Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
    initializeRange: function() {
      this.range.selectNodeContents(this.element);
      this.range.collapse(this.element);
    },
  
    insertContent: function(fragments) {
      fragments.each((function(fragment) {
        this.element.appendChild(fragment);
      }).bind(this));
    }
  });
  
  Insertion.After = Class.create();
  Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
    initializeRange: function() {
      this.range.setStartAfter(this.element);
    },
  
    insertContent: function(fragments) {
      fragments.each((function(fragment) {
        this.element.parentNode.insertBefore(fragment,
          this.element.nextSibling);
      }).bind(this));
    }
  });
  
  /*--------------------------------------------------------------------------*/
  
  Element.ClassNames = Class.create();
  Element.ClassNames.prototype = {
    initialize: function(element) {
      this.element = $(element);
    },
  
    _each: function(iterator) {
      this.element.className.split(/\s+/).select(function(name) {
        return name.length > 0;
      })._each(iterator);
    },
  
    set: function(className) {
      this.element.className = className;
    },
  
    add: function(classNameToAdd) {
      if (this.include(classNameToAdd)) return;
      this.set(this.toArray().concat(classNameToAdd).join(' '));
    },
  
    remove: function(classNameToRemove) {
      if (!this.include(classNameToRemove)) return;
      this.set(this.select(function(className) {
        return className != classNameToRemove;
      }).join(' '));
    },
  
    toString: function() {
      return this.toArray().join(' ');
    }
  }
  
  Object.extend(Element.ClassNames.prototype, Enumerable);
  var Field = {
    clear: function() {
      for (var i = 0; i < arguments.length; i++)
        $(arguments[i]).value = '';
    },
  
    focus: function(element) {
      $(element).focus();
    },
  
    present: function() {
      for (var i = 0; i < arguments.length; i++)
        if ($(arguments[i]).value == '') return false;
      return true;
    },
  
    select: function(element) {
      $(element).select();
    },
  
    activate: function(element) {
      element = $(element);
      element.focus();
      if (element.select)
        element.select();
    }
  }
  
  /*--------------------------------------------------------------------------*/
  
  var Form = {
    serialize: function(form) {
      var elements = Form.getElements($(form));
      var queryComponents = new Array();
  
      for (var i = 0; i < elements.length; i++) {
        var queryComponent = Form.Element.serialize(elements[i]);
        if (queryComponent)
          queryComponents.push(queryComponent);
      }
  
      return queryComponents.join('&');
    },
  
    getElements: function(form) {
      form = $(form);
      var elements = new Array();
  
      for (tagName in Form.Element.Serializers) {
        var tagElements = form.getElementsByTagName(tagName);
        for (var j = 0; j < tagElements.length; j++)
          elements.push(tagElements[j]);
      }
      return elements;
    },
  
    getInputs: function(form, typeName, name) {
      form = $(form);
      var inputs = form.getElementsByTagName('input');
  
      if (!typeName && !name)
        return inputs;
  
      var matchingInputs = new Array();
      for (var i = 0; i < inputs.length; i++) {
        var input = inputs[i];
        if ((typeName && input.type != typeName) ||
            (name && input.name != name))
          continue;
        matchingInputs.push(input);
      }
  
      return matchingInputs;
    },
  
    disable: function(form) {
      var elements = Form.getElements(form);
      for (var i = 0; i < elements.length; i++) {
        var element = elements[i];
        element.blur();
        element.disabled = 'true';
      }
    },
  
    enable: function(form) {
      var elements = Form.getElements(form);
      for (var i = 0; i < elements.length; i++) {
        var element = elements[i];
        element.disabled = '';
      }
    },
  
    findFirstElement: function(form) {
      return Form.getElements(form).find(function(element) {
        return element.type != 'hidden' && !element.disabled &&
          ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
      });
    },
  
    focusFirstElement: function(form) {
      Field.activate(Form.findFirstElement(form));
    },
  
    reset: function(form) {
      $(form).reset();
    }
  }
  
  Form.Element = {
    serialize: function(element) {
      element = $(element);
      var method = element.tagName.toLowerCase();
      var parameter = Form.Element.Serializers[method](element);
  
      if (parameter) {
        var key = encodeURIComponent(parameter[0]);
        if (key.length == 0) return;
  
        if (parameter[1].constructor != Array)
          parameter[1] = [parameter[1]];
  
        return parameter[1].map(function(value) {
          return key + '=' + encodeURIComponent(value);
        }).join('&');
      }
    },
  
    getValue: function(element) {
      element = $(element);
      var method = element.tagName.toLowerCase();
      var parameter = Form.Element.Serializers[method](element);
  
      if (parameter)
        return parameter[1];
    }
  }
  
  Form.Element.Serializers = {
    input: function(element) {
      switch (element.type.toLowerCase()) {
        case 'submit':
        case 'hidden':
        case 'password':
        case 'text':
          return Form.Element.Serializers.textarea(element);
        case 'checkbox':
        case 'radio':
          return Form.Element.Serializers.inputSelector(element);
      }
      return false;
    },
  
    inputSelector: function(element) {
      if (element.checked)
        return [element.name, element.value];
    },
  
    textarea: function(element) {
      return [element.name, element.value];
    },
  
    select: function(element) {
      return Form.Element.Serializers[element.type == 'select-one' ?
        'selectOne' : 'selectMany'](element);
    },
  
    selectOne: function(element) {
      var value = '', opt, index = element.selectedIndex;
      if (index >= 0) {
        opt = element.options[index];
        value = opt.value;
        if (!value && !('value' in opt))
          value = opt.text;
      }
      return [element.name, value];
    },
  
    selectMany: function(element) {
      var value = new Array();
      for (var i = 0; i < element.length; i++) {
        var opt = element.options[i];
        if (opt.selected) {
          var optValue = opt.value;
          if (!optValue && !('value' in opt))
            optValue = opt.text;
          value.push(optValue);
        }
      }
      return [element.name, value];
    }
  }
  
  /*--------------------------------------------------------------------------*/
  
  var $F = Form.Element.getValue;
  
  /*--------------------------------------------------------------------------*/
  
  Abstract.TimedObserver = function() {}
  Abstract.TimedObserver.prototype = {
    initialize: function(element, frequency, callback) {
      this.frequency = frequency;
      this.element   = $(element);
      this.callback  = callback;
  
      this.lastValue = this.getValue();
      this.registerCallback();
    },
  
    registerCallback: function() {
      setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
    },
  
    onTimerEvent: function() {
      var value = this.getValue();
      if (this.lastValue != value) {
        this.callback(this.element, value);
        this.lastValue = value;
      }
    }
  }
  
  Form.Element.Observer = Class.create();
  Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
    getValue: function() {
      return Form.Element.getValue(this.element);
    }
  });
  
  Form.Observer = Class.create();
  Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
    getValue: function() {
      return Form.serialize(this.element);
    }
  });
  
  /*--------------------------------------------------------------------------*/
  
  Abstract.EventObserver = function() {}
  Abstract.EventObserver.prototype = {
    initialize: function(element, callback) {
      this.element  = $(element);
      this.callback = callback;
  
      this.lastValue = this.getValue();
      if (this.element.tagName.toLowerCase() == 'form')
        this.registerFormCallbacks();
      else
        this.registerCallback(this.element);
    },
  
    onElementEvent: function() {
      var value = this.getValue();
      if (this.lastValue != value) {
        this.callback(this.element, value);
        this.lastValue = value;
      }
    },
  
    registerFormCallbacks: function() {
      var elements = Form.getElements(this.element);
      for (var i = 0; i < elements.length; i++)
        this.registerCallback(elements[i]);
    },
  
    registerCallback: function(element) {
      if (element.type) {
        switch (element.type.toLowerCase()) {
          case 'checkbox':
          case 'radio':
            Event.observe(element, 'click', this.onElementEvent.bind(this));
            break;
          case 'password':
          case 'text':
          case 'textarea':
          case 'select-one':
          case 'select-multiple':
            Event.observe(element, 'change', this.onElementEvent.bind(this));
            break;
        }
      }
    }
  }
  
  Form.Element.EventObserver = Class.create();
  Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
    getValue: function() {
      return Form.Element.getValue(this.element);
    }
  });
  
  Form.EventObserver = Class.create();
  Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
    getValue: function() {
      return Form.serialize(this.element);
    }
  });
  if (!window.Event) {
    var Event = new Object();
  }
  
  Object.extend(Event, {
    KEY_BACKSPACE: 8,
    KEY_TAB:       9,
    KEY_RETURN:   13,
    KEY_ESC:      27,
    KEY_LEFT:     37,
    KEY_UP:       38,
    KEY_RIGHT:    39,
    KEY_DOWN:     40,
    KEY_DELETE:   46,
  
    element: function(event) {
      return event.target || event.srcElement;
    },
  
    isLeftClick: function(event) {
      return (((event.which) && (event.which == 1)) ||
              ((event.button) && (event.button == 1)));
    },
  
    pointerX: function(event) {
      return event.pageX || (event.clientX +
        (document.documentElement.scrollLeft || document.body.scrollLeft));
    },
  
    pointerY: function(event) {
      return event.pageY || (event.clientY +
        (document.documentElement.scrollTop || document.body.scrollTop));
    },
  
    stop: function(event) {
      if (event.preventDefault) {
        event.preventDefault();
        event.stopPropagation();
      } else {
        event.returnValue = false;
        event.cancelBubble = true;
      }
    },
  
    // find the first node with the given tagName, starting from the
    // node the event was triggered on; traverses the DOM upwards
    findElement: function(event, tagName) {
      var element = Event.element(event);
      while (element.parentNode && (!element.tagName ||
          (element.tagName.toUpperCase() != tagName.toUpperCase())))
        element = element.parentNode;
      return element;
    },
  
    observers: false,
  
    _observeAndCache: function(element, name, observer, useCapture) {
      if (!this.observers) this.observers = [];
      if (element.addEventListener) {
        this.observers.push([element, name, observer, useCapture]);
        element.addEventListener(name, observer, useCapture);
      } else if (element.attachEvent) {
        this.observers.push([element, name, observer, useCapture]);
        element.attachEvent('on' + name, observer);
      }
    },
  
    unloadCache: function() {
      if (!Event.observers) return;
      for (var i = 0; i < Event.observers.length; i++) {
        Event.stopObserving.apply(this, Event.observers[i]);
        Event.observers[i][0] = null;
      }
      Event.observers = false;
    },
  
    observe: function(elementParam, name, observer, useCapture) {
      var element = $(elementParam);
      useCapture = useCapture || false;
  
      if (name == 'keypress' &&
          (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
          || element.attachEvent))
        name = 'keydown';
  
      this._observeAndCache(element, name, observer, useCapture);
    },
  
    stopObserving: function(elementParam, name, observer, useCapture) {
      var element = $(elementParam);
      useCapture = useCapture || false;
  
      if (name == 'keypress' &&
          (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
          || element.detachEvent))
        name = 'keydown';
  
      if (element.removeEventListener) {
        element.removeEventListener(name, observer, useCapture);
      } else if (element.detachEvent) {
        element.detachEvent('on' + name, observer);
      }
    }
  });
  
  /* prevent memory leaks in IE */
  Event.observe(window, 'unload', Event.unloadCache, false);
  var Position = {
    // set to true if needed, warning: firefox performance problems
    // NOT neeeded for page scrolling, only if draggable contained in
    // scrollable elements
    includeScrollOffsets: false,
  
    // must be called before calling withinIncludingScrolloffset, every time the
    // page is scrolled
    prepare: function() {
      this.deltaX =  window.pageXOffset
                  || document.documentElement.scrollLeft
                  || document.body.scrollLeft
                  || 0;
      this.deltaY =  window.pageYOffset
                  || document.documentElement.scrollTop
                  || document.body.scrollTop
                  || 0;
    },
  
    realOffset: function(element) {
      var valueT = 0, valueL = 0;
      do {
        valueT += element.scrollTop  || 0;
        valueL += element.scrollLeft || 0;
        element = element.parentNode;
      } while (element);
      return [valueL, valueT];
    },
  
    cumulativeOffset: function(element) {
      var valueT = 0, valueL = 0;
      do {
        valueT += element.offsetTop  || 0;
        valueL += element.offsetLeft || 0;
        element = element.offsetParent;
      } while (element);
      return [valueL, valueT];
    },
  
    positionedOffset: function(element) {
      var valueT = 0, valueL = 0;
      do {
        valueT += element.offsetTop  || 0;
        valueL += element.offsetLeft || 0;
        element = element.offsetParent;
        if (element) {
          p = Element.getStyle(element, 'position');
          if (p == 'relative' || p == 'absolute') break;
        }
      } while (element);
      return [valueL, valueT];
    },
  
    offsetParent: function(element) {
      if (element.offsetParent) return element.offsetParent;
      if (element == document.body) return element;
  
      while ((element = element.parentNode) && element != document.body)
        if (Element.getStyle(element, 'position') != 'static')
          return element;
  
      return document.body;
    },
  
    // caches x/y coordinate pair to use with overlap
    within: function(element, x, y) {
      if (this.includeScrollOffsets)
        return this.withinIncludingScrolloffsets(element, x, y);
      this.xcomp = x;
      this.ycomp = y;
      this.offset = this.cumulativeOffset(element);
  
      return (y >= this.offset[1] &&
              y <  this.offset[1] + element.offsetHeight &&
              x >= this.offset[0] &&
              x <  this.offset[0] + element.offsetWidth);
    },
  
    withinIncludingScrolloffsets: function(element, x, y) {
      var offsetcache = this.realOffset(element);
  
      this.xcomp = x + offsetcache[0] - this.deltaX;
      this.ycomp = y + offsetcache[1] - this.deltaY;
      this.offset = this.cumulativeOffset(element);
  
      return (this.ycomp >= this.offset[1] &&
              this.ycomp <  this.offset[1] + element.offsetHeight &&
              this.xcomp >= this.offset[0] &&
              this.xcomp <  this.offset[0] + element.offsetWidth);
    },
  
    // within must be called directly before
    overlap: function(mode, element) {
      if (!mode) return 0;
      if (mode == 'vertical')
        return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
          element.offsetHeight;
      if (mode == 'horizontal')
        return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
          element.offsetWidth;
    },
  
    clone: function(source, target) {
      source = $(source);
      target = $(target);
      target.style.position = 'absolute';
      var offsets = this.cumulativeOffset(source);
      target.style.top    = offsets[1] + 'px';
      target.style.left   = offsets[0] + 'px';
      target.style.width  = source.offsetWidth + 'px';
      target.style.height = source.offsetHeight + 'px';
    },
  
    page: function(forElement) {
      var valueT = 0, valueL = 0;
  
      var element = forElement;
      do {
        valueT += element.offsetTop  || 0;
        valueL += element.offsetLeft || 0;
  
        // Safari fix
        if (element.offsetParent==document.body)
          if (Element.getStyle(element,'position')=='absolute') break;
  
      } while (element = element.offsetParent);
  
      element = forElement;
      do {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      } while (element = element.parentNode);
  
      return [valueL, valueT];
    },
  
    clone: function(source, target) {
      var options = Object.extend({
        setLeft:    true,
        setTop:     true,
        setWidth:   true,
        setHeight:  true,
        offsetTop:  0,
        offsetLeft: 0
      }, arguments[2] || {})
  
      // find page position of source
      source = $(source);
      var p = Position.page(source);
  
      // find coordinate system to use
      target = $(target);
      var delta = [0, 0];
      var parent = null;
      // delta [0,0] will do fine with position: fixed elements,
      // position:absolute needs offsetParent deltas
      if (Element.getStyle(target,'position') == 'absolute') {
        parent = Position.offsetParent(target);
        delta = Position.page(parent);
      }
  
      // correct by body offsets (fixes Safari)
      if (parent == document.body) {
        delta[0] -= document.body.offsetLeft;
        delta[1] -= document.body.offsetTop;
      }
  
      // set position
      if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
      if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
      if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
      if(options.setHeight) target.style.height = source.offsetHeight + 'px';
    },
  
    absolutize: function(element) {
      element = $(element);
      if (element.style.position == 'absolute') return;
      Position.prepare();
  
      var offsets = Position.positionedOffset(element);
      var top     = offsets[1];
      var left    = offsets[0];
      var width   = element.clientWidth;
      var height  = element.clientHeight;
  
      element._originalLeft   = left - parseFloat(element.style.left  || 0);
      element._originalTop    = top  - parseFloat(element.style.top || 0);
      element._originalWidth  = element.style.width;
      element._originalHeight = element.style.height;
  
      element.style.position = 'absolute';
      element.style.top    = top + 'px';;
      element.style.left   = left + 'px';;
      element.style.width  = width + 'px';;
      element.style.height = height + 'px';;
    },
  
    relativize: function(element) {
      element = $(element);
      if (element.style.position == 'relative') return;
      Position.prepare();
  
      element.style.position = 'relative';
      var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
      var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
  
      element.style.top    = top + 'px';
      element.style.left   = left + 'px';
      element.style.height = element._originalHeight;
      element.style.width  = element._originalWidth;
    }
  }
  
  // Safari returns margins on body which is incorrect if the child is absolutely
  // positioned.  For performance reasons, redefine Position.cumulativeOffset for
  // KHTML/WebKit only.
  if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
    Position.cumulativeOffset = function(element) {
      var valueT = 0, valueL = 0;
      do {
        valueT += element.offsetTop  || 0;
        valueL += element.offsetLeft || 0;
        if (element.offsetParent == document.body)
          if (Element.getStyle(element, 'position') == 'absolute') break;
  
        element = element.offsetParent;
      } while (element);
  
      return [valueL, valueT];
    }
  }
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Ajax.js
  
  Index: Ajax.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  OpenLayers.ProxyHost = "";
  //OpenLayers.ProxyHost = "examples/proxy.cgi?url=";
  
  /**
  * Ajax reader for OpenLayers
  *
  *@uri url to do remote XML http get
  *@param 'get' format params (x=y&a=b...)
  *@who object to handle callbacks for this request
  *@complete  the function to be called on success 
  *@failure  the function to be called on failure
  *
  * example usage from a caller:
  *
  *   caps: function(request) {
  *    -blah-  
  *   },
  *
  *   OpenLayers.loadURL(url,params,this,caps);
  *
  * Notice the above example does not provide an error handler; a default empty
  * handler is provided which merely logs the error if a failure handler is not 
  * supplied
  *
  */
  
  
  /** 
  * @param {} request
  */
  OpenLayers.nullHandler = function(request) {
      alert("Unhandled request return " + request.statusText);
  };
  
  /** Background load a document
  *
  * @param {String} uri URI of source doc
  * @param {String} params Params on get (doesnt seem to work)
  * @param {Object} caller object which gets callbacks
  * @param {Function} onComplete callback for success
  * @param {Function} onFailure callback for failure
  *
  * Both callbacks optional (though silly)
  */
  OpenLayers.loadURL = function(uri, params, caller,
                                    onComplete, onFailure) {
  
      if (OpenLayers.ProxyHost && uri.startsWith("http")) {
          uri = OpenLayers.ProxyHost + escape(uri);
      }
  
      var success = (onComplete) ? onComplete.bind(caller)
                                  : OpenLayers.nullHandler;
  
      var failure = (onFailure) ? onFailure.bind(caller)
                             : OpenLayers.nullHandler;
  
      // from prototype.js
      new Ajax.Request(uri, 
                       {   method: 'get', 
                           parameters: params,
                           onComplete: success, 
                           onFailure: failure
                        }
                       );
  };
  
  /** Parse XML into a doc structure
  * @param {String} text
  *
  * @returns Parsed Ajax Response ??
  * @type ?
  */
  OpenLayers.parseXMLString = function(text) {
  
      //MS sucks, if the server is bad it dies
      var index = text.indexOf('<');
      if (index > 0) {
          text = text.substring(index);
      }
  
      var ajaxResponse = Try.these(
          function() {
              var xmldom = new ActiveXObject('Microsoft.XMLDOM');
              xmldom.loadXML(text);
              return xmldom;
          },
          function() {
              return new DOMParser().parseFromString(text, 'text/xml');
          },
          function() {
              var req = new XMLHttpRequest();
              req.open("GET", "data:" + "text/xml" +
                       ";charset=utf-8," + encodeURIComponent(text), false);
              if (req.overrideMimeType) {
                  req.overrideMimeType("text/xml");
              }
              req.send(null);
              return req.responseXML;
          }
      );
  
      return ajaxResponse;
  };
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/BaseTypes.js
  
  Index: BaseTypes.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  
  /*********************
   *                   *
   *      PIXEL        * 
   *                   * 
   *********************/
  
  
  /**
   * @class 
   * 
   * This class represents a screen coordinate, in x and y coordinates
   */
  OpenLayers.Pixel = Class.create();
  OpenLayers.Pixel.prototype = {
      
      /** @type float */
      x: 0.0,
  
      /** @type float */
      y: 0.0,
      
      /** 
      * @constructor
      *
      * @param {float} x
      * @param {float} y
      */
      initialize: function(x, y) {
          this.x = x;
          this.y = y;
      },
      
      /**
      * @return string representation of Pixel. ex: "x=200.4,y=242.2"
      * @type str
      */
      toString:function() {
          return ("x=" + this.x + ",y=" + this.y);
      },
  
      /**
       * @type OpenLayers.Pixel
       */
      clone:function() {
          return new OpenLayers.Pixel(this.x, this.y); 
      },
      
      /** 
      * @param {OpenLayers.Pixel} px
      * 
      * @return whether or not the point passed in as parameter is equal to this
      *          note that if px passed in is null, returns false
      * @type bool
      */
      equals:function(px) {
          var equals = false;
          if (px != null) {
              equals = ((this.x == px.x && this.y == px.y) ||
                        (isNaN(this.x) && isNaN(this.y) && isNaN(px.x) && isNaN(px.y)));
          }
          return equals;
      },
  
      /**
      * @param {int} x
      * @param {int} y
      * 
      * @return a new Pixel with this pixel's x&y augmented by the 
      *         values passed in.
      * @type OpenLayers.Pixel
      */
      add:function(x, y) {
          return new OpenLayers.Pixel(this.x + x, this.y + y);
      },
  
      /**
      * @param {OpenLayers.Pixel} px
      * 
      * @return a new Pixel with this pixel's x&y augmented by the 
      *         x&y values of the pixel passed in.
      * @type OpenLayers.Pixel
      */
      offset:function(px) {
          return this.add(px.x, px.y);                
      },
      
      /** @final @type str */
      CLASS_NAME: "OpenLayers.Pixel"
  };
  
  
  /*********************
   *                   *
   *      SIZE         * 
   *                   * 
   *********************/
  
  
  /**
  * @class 
  * 
  * This class represents a width and height pair
  */
  OpenLayers.Size = Class.create();
  OpenLayers.Size.prototype = {
  
      /** @type float */
      w: 0.0,
      
      /** @type float */
      h: 0.0,
  
  
      /** 
      * @constructor
      * 
      * @param {float} w 
      * @param {float} h 
      */
      initialize: function(w, h) {
          this.w = w;
          this.h = h;
      },
  
      /** 
      * @return String representation of OpenLayers.Size object. 
      *         (ex. <i>"w=55,h=66"</i>)
      * @type String
      */
      toString:function() {
          return ("w=" + this.w + ",h=" + this.h);
      },
  
      /** 
       * @return New OpenLayers.Size object with the same w and h values
       * @type OpenLayers.Size
       */
      clone:function() {
          return new OpenLayers.Size(this.w, this.h);
      },
  
      /** 
      * @param {OpenLayers.Size} sz
      * @returns Boolean value indicating whether the passed-in OpenLayers.Size 
      *          object has the same w and h components as this
      *          note that if sz passed in is null, returns false
      *
      * @type bool
      */
      equals:function(sz) {
          var equals = false;
          if (sz != null) {
              equals = ((this.w == sz.w && this.h == sz.h) ||
                        (isNaN(this.w) && isNaN(this.h) && isNaN(sz.w) && isNaN(sz.h)));
          }
          return equals;
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Size"
  };
  
  /*********************
   *                   *
   *      LONLAT       * 
   *                   * 
   *********************/
  
  
  /**
  * @class 
  * 
  * This class represents a longitude and latitude pair
  */
  OpenLayers.LonLat = Class.create();
  OpenLayers.LonLat.prototype = {
  
      /** @type float */
      lon: 0.0,
      
      /** @type float */
      lat: 0.0,
  
      /**
      * @constructor
      * 
      * @param {float} lon
      * @param {float} lat
      */
      initialize: function(lon, lat) {
          this.lon = lon;
          this.lat = lat;
      },
      
      /** 
      * @return String representation of OpenLayers.LonLat object. 
      *         (ex. <i>"lon=5,lat=42"</i>)
      * @type String
      */
      toString:function() {
          return ("lon=" + this.lon + ",lat=" + this.lat);
      },
  
      /** 
      * @return Shortened String representation of OpenLayers.LonLat object. 
      *         (ex. <i>"5, 42"</i>)
      * @type String
      */
      toShortString:function() {
          return (this.lon + ", " + this.lat);
      },
  
      /** 
       * @return New OpenLayers.LonLat object with the same lon and lat values
       * @type OpenLayers.LonLat
       */
      clone:function() {
          return new OpenLayers.LonLat(this.lon, this.lat);
      },
  
      /** 
      * @param {float} lon
      * @param {float} lat
      *
      * @return A new OpenLayers.LonLat object with the lon and lat passed-in
      *         added to this's. 
      * @type OpenLayers.LonLat
      */
      add:function(lon, lat) {
          return new OpenLayers.LonLat(this.lon + lon, this.lat + lat);
      },
  
      /** 
      * @param {OpenLayers.LonLat} ll
      * @returns Boolean value indicating whether the passed-in OpenLayers.LonLat
      *          object has the same lon and lat components as this
      *          note that if ll passed in is null, returns false
      *
      * @type bool
      */
      equals:function(ll) {
          var equals = false;
          if (ll != null) {
              equals = ((this.lon == ll.lon && this.lat == ll.lat) ||
                        (isNaN(this.lon) && isNaN(this.lat) && isNaN(ll.lon) && isNaN(ll.lat)));
          }
          return equals;
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.LonLat"
  };
  
  /** Alternative constructor that builds a new OpenLayers.LonLat from a 
  *    parameter string
  * 
  * @constructor
  * 
  * @param {String} str Comma-separated Lon,Lat coordinate string. 
  *                     (ex. <i>"5,40"</i>)
  *
  * @returns New OpenLayers.LonLat object built from the passed-in String.
  * @type OpenLayers.LonLat
  */
  OpenLayers.LonLat.fromString = function(str) {
      var pair = str.split(",");
      return new OpenLayers.LonLat(parseFloat(pair[0]), 
                                   parseFloat(pair[1]));
  };
  
  
  
  /*********************
   *                   *
   *      BOUNDS       * 
   *                   * 
   *********************/
  
  
  
  
  /**
  * @class 
  * 
  * This class represents a bounding box. 
  * Data stored as left, bottom, right, top floats
  */
  OpenLayers.Bounds = Class.create();
  OpenLayers.Bounds.prototype = {
  
      /** @type float */
      left: 0.0,
  
      /** @type float */
      bottom: 0.0,
  
      /** @type float */
      right: 0.0,
  
      /** @type float */
      top: 0.0,    
  
      /**
      * @constructor
      *
      * @param {float} left
      * @param {float} bottom
      * @param {float} right
      * @param {float} top
      *
      */
      initialize: function(left, bottom, right, top) {
          this.left = left;
          this.bottom = bottom;
          this.right = right;
          this.top = top;
      },
  
      /**
       * @returns A fresh copy of the bounds
       * @type OpenLayers.Bounds
       */
      clone:function() {
          return new OpenLayers.Bounds(this.left, this.bottom, 
                                       this.right, this.top);
      },
  
      /** 
      * @param {OpenLayers.Bounds} bounds
      * @returns Boolean value indicating whether the passed-in OpenLayers.Bounds
      *          object has the same left, right, top, bottom components as this
      *           note that if bounds passed in is null, returns false
      *
      * @type bool
      */
      equals:function(bounds) {
          var equals = false;
          if (bounds != null) {
              equals = ((this.left == bounds.left) && 
                        (this.right == bounds.right) &&
                        (this.top == bounds.top) && 
                        (this.bottom == bounds.bottom));
          }
          return equals;
      },
  
      /** 
      * @return String representation of OpenLayers.Bounds object. 
      *         (ex.<i>"left-bottom=(5,42) right-top=(10,45)"</i>)
      * @type String
      */
      toString:function(){
          return ( "left-bottom=(" + this.left + "," + this.bottom + ")"
                   + " right-top=(" + this.right + "," + this.top + ")" );
      },
  
      /** 
      * @return Simple String representation of OpenLayers.Bounds object.
      *         (ex. <i>"5,42,10,45"</i>)
      * @type String
      */
      toBBOX:function() {
          return (this.left + "," + this.bottom + ","
                  + this.right + "," + this.top);
      },
      
      /**
      * @returns The width of the bounds
      * @type float
      */
      getWidth:function() {
          return (this.right - this.left);
      },
  
      /**
      * @returns The height of the bounds
      * @type float
      */
      getHeight:function() {
          return (this.top - this.bottom);
      },
  
      /**
      * @returns An OpenLayers.Size which represents the size of the box
      * @type OpenLayers.Size
      */
      getSize:function() {
          return new OpenLayers.Size(this.getWidth(), this.getHeight());
      },
  
      /**
      * @returns An OpenLayers.Pixel which represents the center of the bounds
      * @type OpenLayers.Pixel
      */
      getCenterPixel:function() {
          return new OpenLayers.Pixel( (this.left + this.right) / 2,
                                       (this.bottom + this.top) / 2);
      },
  
      /**
      * @returns An OpenLayers.LonLat which represents the center of the bounds
      * @type OpenLayers.LonLat
      */
      getCenterLonLat:function() {
          return new OpenLayers.LonLat( (this.left + this.right) / 2,
                                        (this.bottom + this.top) / 2);
      },
  
      /**
      * @param {float} x
      * @param {float} y
      *
      * @returns A new OpenLayers.Bounds whose coordinates are the same as this, 
      *          but shifted by the passed-in x and y values
      * @type OpenLayers.Bounds
      */
      add:function(x, y){
          return new OpenLayers.Bounds(this.left + x, this.bottom + y,
                                       this.right + x, this.top + y);
      },
  
      /**
      * @param {float} x
      * @param {float} y
      * @param {Boolean} inclusive Whether or not to include the border. 
      *                            Default is true
      *
      * @return Whether or not the passed-in coordinates are within this bounds
      * @type Boolean
      */
      contains:function(x, y, inclusive) {
      
          //set default
          if (inclusive == null) {
              inclusive = true;
          }
          
          var contains = false;
          if (inclusive) {
              contains = ((x >= this.left) && (x <= this.right) && 
                          (y >= this.bottom) && (y <= this.top));
          } else {
              contains = ((x > this.left) && (x < this.right) && 
                          (y > this.bottom) && (y < this.top));
          }              
          return contains;
      },
   
      /**
      * @param {OpenLayers.Bounds} bounds
      * @param {Boolean} partial If true, only part of passed-in 
      *                          OpenLayers.Bounds needs be within this bounds. 
      *                          If false, the entire passed-in bounds must be
      *                          within. Default is false
      * @param {Boolean} inclusive Whether or not to include the border. 
      *                            Default is true
      *
      * @return Whether or not the passed-in OpenLayers.Bounds object is 
      *         contained within this bounds. 
      * @type Boolean
      */
      containsBounds:function(bounds, partial, inclusive) {
  
          //set defaults
          if (partial == null) {
              partial = false;
          }
          if (inclusive == null) {
              inclusive = true;
          }
  
          var inLeft;
          var inTop;
          var inRight;
          var inBottom;
          
          if (inclusive) {
              inLeft = (bounds.left >= this.left) && (bounds.left <= this.right);
              inTop = (bounds.top >= this.bottom) && (bounds.top <= this.top);
              inRight= (bounds.right >= this.left) && (bounds.right <= this.right);
              inBottom = (bounds.bottom >= this.bottom) && (bounds.bottom <= this.top);
          } else {
              inLeft = (bounds.left > this.left) && (bounds.left < this.right);
              inTop = (bounds.top > this.bottom) && (bounds.top < this.top);
              inRight= (bounds.right > this.left) && (bounds.right < this.right);
              inBottom = (bounds.bottom > this.bottom) && (bounds.bottom < this.top);
          }
          
          return (partial) ? (inTop || inBottom) && (inLeft || inRight )
                           : (inTop && inLeft && inBottom && inRight);
      },
  
      /** 
       * @param {OpenLayers.LonLat} lonlat
       *
       * @returns The quadrant ("br" "tr" "tl" "bl") of the bounds in which 
       *           the coordinate lies.
       * @type String
       */
      determineQuadrant: function(lonlat) {
      
          var quadrant = "";
          var center = this.getCenterLonLat();
          
          quadrant += (lonlat.lat < center.lat) ? "b" : "t";
          quadrant += (lonlat.lon < center.lon) ? "l" : "r";
      
          return quadrant; 
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Bounds"
  };
  
  /** Alternative constructor that builds a new OpenLayers.Bounds from a 
  *    parameter string
  * 
  * @constructor
  * 
  * @param {String} str Comma-separated bounds string. (ex. <i>"5,42,10,45"</i>)
  *
  * @returns New OpenLayers.Bounds object built from the passed-in String.
  * @type OpenLayers.Bounds
  */
  OpenLayers.Bounds.fromString = function(str) {
      var bounds = str.split(",");
      return OpenLayers.Bounds.fromArray(bounds);
  };
  
  /** Alternative constructor that builds a new OpenLayers.Bounds
  *    from an array
  * 
  * @constructor
  * 
  * @param {Array} bbox Array of bounds values (ex. <i>[5,42,10,45]</i>)
  *
  * @returns New OpenLayers.Bounds object built from the passed-in Array.
  * @type OpenLayers.Bounds
  */
  OpenLayers.Bounds.fromArray = function(bbox) {
      return new OpenLayers.Bounds(parseFloat(bbox[0]),
                                   parseFloat(bbox[1]),
                                   parseFloat(bbox[2]),
                                   parseFloat(bbox[3]));
  };
  
  /** Alternative constructor that builds a new OpenLayers.Bounds
  *    from an OpenLayers.Size
  * 
  * @constructor
  * 
  * @param {OpenLayers.Size} size
  *            
  * @returns New OpenLayers.Bounds object built with top and left set to 0 and
  *           bottom right taken from the passed-in OpenLayers.Size.
  * @type OpenLayers.Bounds
  */
  OpenLayers.Bounds.fromSize = function(size) {
      return new OpenLayers.Bounds(0,
                                   size.h,
                                   size.w,
                                   0);
  };
  /**
   * @param {String} quadrant 
   * 
   * @returns The opposing quadrant ("br" "tr" "tl" "bl"). For Example, if 
   *           you pass in "bl" it returns "tr", if you pass in "br" it 
   *           returns "tl", etc.
   * @type String
   */
  OpenLayers.Bounds.oppositeQuadrant = function(quadrant) {
      var opp = "";
      
      opp += (quadrant.charAt(0) == 't') ? 'b' : 't';
      opp += (quadrant.charAt(1) == 'l') ? 'r' : 'l';
      
      return opp;
  };
  
  
  
  
  /*********************
   *                   *
   *      STRING       * 
   *                   * 
   *********************/
  
  
  
  /**
  * @param {String} sStart
  * 
  * @returns Whether or not this string starts with the string passed in.
  * @type Boolean
  */
  String.prototype.startsWith = function(sStart){
      return (this.substr(0,sStart.length) == sStart);
  };
  
  /**
  * @param {String} str
  * 
  * @returns Whether or not this string contains with the string passed in.
  * @type Boolean
  */
  String.prototype.contains = function(str){
      return (this.indexOf(str) != -1);
  };
  
  /**
  * @returns A trimmed version of the string - all leading and 
  *          trailing spaces removed
  * @type String
  */
  String.prototype.trim = function() {
      
      var b = 0;
      while(this.substr(b,1) == " ") {
          b++;
      }
      
      var e = this.length - 1;
      while(this.substr(e,1) == " ") {
          e--;
      }
      
      return this.substring(b, e+1);
  };
  
  
  
  
  /*********************
   *                   *
   *      ARRAY        * 
   *                   * 
   *********************/
  
  
  
  /** Remove an object from an array. Iterates through the array
  *    to find the item, then removes it.
  *
  * @param {Object} item
  * 
  * @returns A reference to the array
  * @type Array
  */
  Array.prototype.remove = function(item) {
      for(var i=0; i < this.length; i++) {
          if(this[i] == item) {
              this.splice(i,1);
              //break;more than once??
          }
      }
      return this;
  }
  
  /**
  * @returns A fresh copy of the array
  * @type Array
  */
  Array.prototype.clone = function() {
    var clone = new Array();
    for (var i = 0; i < this.length; i++) {
        clone[i] = this[i];
    }
    return clone;
  };
  
  /**
  */
  Array.prototype.clear = function() {
      this.length = 0;
  };
  
  
  /*********************
   *                   *
   *      NUMBER       * 
   *                   * 
   *********************/
  
  
  
  /** NOTE: Works only with integer values does *not* work with floats!
   * 
   * @param {int} sig
   * 
   * @returns The number, rounded to the specified number of significant digits.
   *          If null, 0, or negaive value passed in, returns 0
   * @type int
   */
  Number.prototype.limitSigDigs = function(sig) {
      var number = (sig > 0) ? this.toString() : 0;
      if (sig < number.length) {
          var exp = number.length - sig;
          number = Math.round( this / Math.pow(10, exp)) * Math.pow(10, exp);
      }
      return parseInt(number);
  }
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control.js
  
  Index: Control.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
  * @class
  */
  OpenLayers.Control = Class.create();
  OpenLayers.Control.prototype = {
  
      /** this gets set in the addControl() function in OpenLayers.Map
      * @type OpenLayers.Map */
      map: null,
  
      /** @type DOMElement */
      div: null,
  
      /** @type OpenLayers.Pixel */
      position: null,
  
      /** @type OpenLayers.Pixel */
      mouseDragStart: null,
  
      /**
       * @constructor
       * 
       * @param {Object} options
       */
      initialize: function (options) {
          Object.extend(this, options);
      },
  
      /**
       * 
       */
      destroy: function () {
          // eliminate circular references
          this.map = null;
      },
  
      /** Set the map property for the control. This is done through an accessor
       *   so that subclasses can override this and take special action once 
       *   they have their map variable set. 
       * 
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          this.map = map;
      },
    
      /**
       * @param {OpenLayers.Pixel} px
       *
       * @returns A reference to the DIV DOMElement containing the control
       * @type DOMElement
       */
      draw: function (px) {
          if (this.div == null) {
              this.div = OpenLayers.Util.createDiv();
          }
          if (px != null) {
              this.position = px.clone();
          }
          this.moveTo(this.position);        
          return this.div;
      },
  
      /**
       * @param {OpenLayers.Pixel} px
       */
      moveTo: function (px) {
          if ((px != null) && (this.div != null)) {
              this.div.style.left = px.x + "px";
              this.div.style.top = px.x + "px";
          }
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Control"
  };
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Events.js
  
  Index: Events.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
   
  /**
   * @class
   */
  OpenLayers.Events = Class.create();
  OpenLayers.Events.prototype = {
  
      /** @final @type Array: supported events */
      BROWSER_EVENTS: [
          "mouseover", "mouseout",
          "mousedown", "mouseup", "mousemove", 
          "click", "dblclick",
          "resize", "focus", "blur"
      ],
  
      /** Hashtable of Array(Function): events listener functions 
       * @type Object */
      listeners: null,
  
      /** @type Object: the code object issuing application events */
      object: null,
  
      /** @type DOMElement: the DOM element receiving browser events */
      element: null,
  
      /** @type Array: list of support application events */
      eventTypes: null,
  
  
      /**
       * @constructor 
       * 
       * @param {OpenLayers.Map} object The js object to which this Events object
       *                                is being added
       * @param {DOMElement} element A dom element to respond to browser events
       * @param {Array} eventTypes Array of custom application events
       */
      initialize: function (object, element, eventTypes) {
          this.object     = object;
          this.element    = element;
          this.eventTypes = eventTypes;
          this.listeners  = new Object();
  
          // if eventTypes is specified, create a listeners list for each 
          // custom application event.
          if (this.eventTypes != null) 
              for (var i = 0; i < this.eventTypes.length; i++)
                  this.listeners[ this.eventTypes[i] ] = new Array();
  
          // if a dom element is specified, add a listeners list 
          // for browser events on the element and register them
          if (this.element != null)
              this.attachToElement(element);
      },
  
      /**
      * @param {HTMLDOMElement} element a DOM element to attach browser events to
      */
      attachToElement: function (element) {
          for (var i = 0; i < this.BROWSER_EVENTS.length; i++) {
              var eventType = this.BROWSER_EVENTS[i];
  
              // every browser event has a corresponding application event 
              // (whether it's listened for or not).
              if (this.listeners[eventType] == null)
                  this.listeners[eventType] = new Array();
  
              // use Prototype to register the event cross-browser
              Event.observe(element, eventType, 
                  this.handleBrowserEvent.bindAsEventListener(this));
          }
          // disable dragstart in IE so that mousedown/move/up works normally
          Event.observe(element, "dragstart", Event.stop);
      },
  
      /**
       * @param {String} type Name of the event to register
       * @param {Object} obj The object to bind the context to for the callback#.
       *                     If no object is specified, default is the Events's 
       *                     'object' property.
       * @param {Function} func The callback function. If no callback is 
       *                        specified, this function does nothing.
       * 
       * #When the event is triggered, the 'func' function will be called, in the
       *   context of 'obj'. Imagine we were to register an event, specifying an 
       *   OpenLayers.Bounds Object as 'obj'. When the event is triggered, the 
       *   context in the callback function will be our Bounds object. This means
       *   that within our callback function, we can access the properties and 
       *   methods of the Bounds object through the "this" variable. So our 
       *   callback could execute something like: 
       *   
       *     leftStr = "Left: " + this.left;
       *   
       *                   or
       *  
       *     centerStr = "Center: " + this.getCenterLonLat();
       * 
       */
      register: function (type, obj, func) {
  
          if (func != null) {
              if (obj == null)  {
                  obj = this.object;
              }
              var listeners = this.listeners[type];
              if (listeners != null) {
                  listeners.push( {obj: obj, func: func} );
              }
          }
      },
      
      /**
       * @param {String} type
       * @param {Object} obj If none specified, defaults to this.object
       * @param {Function} func
       */
      unregister: function (type, obj, func) {
          if (obj == null)  {
              obj = this.object;
          }
          var listeners = this.listeners[type];
          if (listeners != null) {
              for (var i = 0; i < listeners.length; i++) {
                  if (listeners[i].obj == obj && listeners[i].func == func) {
                      listeners.splice(i, 1);
                      break;
                  }
              }
          }
      },
  
      /** Remove all listeners for a given event type. If type is not registered,
       *   does nothing.
       * 
       * @param {String} type
       */
      remove: function(type) {
          if (this.listeners[type] != null) {
              this.listeners[type] = new Array();
          }
      },
  
      /** Trigger a specified registered event
       * 
       * @param {String} type
       * @param {Event} evt
       */
      triggerEvent: function (type, evt) {
  
          // prep evt object with object & div references
          if (evt == null) {
              evt = new Object();
          }
          evt.object = this.object;
          evt.element = this.element;
  
          // execute all callbacks registered for specified type
          var listeners = this.listeners[type];
          if (listeners != null) {
      
              for (var i = 0; i < listeners.length; i++) {
                  var callback = listeners[i];
                  var continueChain;
                  if (callback.obj != null) {
                      // use the 'call' method to bind the context to callback.obj
                      continueChain = callback.func.call(callback.obj, evt);
                  } else {
                      continueChain = callback.func(evt);
                  }
      
                  if ((continueChain != null) && (continueChain == false)) {
                      // if callback returns false, execute no more callbacks.
                      break;
                  }
              }
          }
      },
  
      /** Basically just a wrapper to the triggerEvent() function, but takes 
       *   care to set a property 'xy' on the event with the current mouse 
       *   position.
       * 
       * @private
       * 
       * @param {Event} evt
       */
      handleBrowserEvent: function (evt) {
          evt.xy = this.getMousePosition(evt); 
          this.triggerEvent(evt.type, evt)
      },
  
      /**
       * @private 
       * 
       * @param {Event} evt
       * 
       * @returns The current xy coordinate of the mouse, adjusted for offsets
       * @type OpenLayers.Pixel
       */
      getMousePosition: function (evt) {
          if (!this.element.offsets) {
              this.element.offsets = Position.page(this.element);
          }
          return new OpenLayers.Pixel(
                          evt.clientX - this.element.offsets[0], 
                          evt.clientY - this.element.offsets[1]); 
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Events"
  };
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Feature.js
  
  Index: Feature.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Util.js
   */
  OpenLayers.Feature = Class.create();
  OpenLayers.Feature.prototype= {
  
      /** @type OpenLayers.Events */
      events:null,
  
      /** @type OpenLayers.Layer */
      layer: null,
  
      /** @type String */
      id: null,
      
      /** @type OpenLayers.LonLat */
      lonlat:null,
  
      /** @type Object */
      data:null,
  
      /** @type OpenLayers.Marker */
      marker: null,
  
      /** @type OpenLayers.Popup */
      popup: null,
  
      /** 
       * @constructor
       * 
       * @param {OpenLayers.Layer} layer
       * @param {OpenLayers.LonLat} lonlat
       * @param {Object} data
       */
      initialize: function(layer, lonlat, data) {
          this.layer = layer;
          this.lonlat = lonlat;
          this.data = (data != null) ? data : new Object();
          this.id = OpenLayers.Util.createUniqueID('Feature_'); 
      },
  
      /**
       * 
       */
      destroy: function() {
  
          //remove the popup from the map
          if ((this.layer != null) && (this.layer.map != null)) {
              if (this.popup != null) {
                  this.layer.map.removePopup(this.popup);
              }
          }
  
          this.events = null;
          this.layer = null;
          this.id = null;
          this.lonlat = null;
          this.data = null;
          if (this.marker != null) {
              this.marker.destroy();
              this.marker = null;
          }
          if (this.popup != null) {
              this.popup.destroy();
              this.popup = null;
          }
      },
      
  
      /**
       * @returns A Marker Object created from the 'lonlat' and 'icon' properties
       *          set in this.data. If no 'lonlat' is set, returns null. If no
       *          'icon' is set, OpenLayers.Marker() will load the default image
       * @type OpenLayers.Marker
       */
      createMarker: function() {
  
          var marker = null;
          
          if (this.lonlat != null) {
              this.marker = new OpenLayers.Marker(this.lonlat, this.data.icon);
          }
          return this.marker;
      },
  
      /**
       * 
       */
      createPopup: function() {
  
          if (this.lonlat != null) {
              
              var id = this.id + "_popup";
              var anchor = (this.marker) ? this.marker.icon : null;
  
              this.popup = new OpenLayers.Popup.AnchoredBubble(id, 
                                                      this.lonlat,
                                                      this.data.popupSize,
                                                      this.data.popupContentHTML,
                                                      anchor); 
          }        
          return this.popup;
      },
  
      CLASS_NAME: "OpenLayers.Feature"
  };
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Icon.js
  
  Index: Icon.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   */
  OpenLayers.Icon = Class.create();
  OpenLayers.Icon.prototype = {
      
      /** image url
      * @type String */
      url: null,
      
      /** @type OpenLayers.Size */
      size:null,
  
      /** distance in pixels to offset the image when being rendered
      * @type OpenLayers.Pixel */
      offset: null,    
      
      /** Function to calculate the offset (based on the size) 
       * @type OpenLayers.Pixel */
      calculateOffset: null,    
      
      /** @type DOMElement */
      imageDiv: null,
  
      /** @type OpenLayers.Pixel */
      px: null,
      
      /** 
      * @constructor
      *
      * @param {String} url
      * @param {OpenLayers.Size} size
      * @param {Function} calculateOffset
      */
      initialize: function(url, size, offset, calculateOffset) {
          this.url = url;
          this.size = (size) ? size : new OpenLayers.Size(20,20);
          this.offset = (offset) ? offset : new OpenLayers.Pixel(0,0);
          this.calculateOffset = calculateOffset;
  
          this.imageDiv = OpenLayers.Util.createAlphaImageDiv();
      },
      
      destroy: function() {
          this.imageDiv = null;
      },
  
      /** 
      * @returns A fresh copy of the icon.
      * @type OpenLayers.Icon
      */
      clone: function() {
          return new OpenLayers.Icon(this.url, 
                                     this.size, 
                                     this.offset, 
                                     this.calculateOffset);
      },
      
      /**
       * @param {OpenLayers.Size} size
       */
      setSize: function(size) {
          if (size != null) {
              this.size = size;
          }
          this.draw();
      },
  
      /** 
      * @param {OpenLayers.Pixel} px
      * 
      * @return A new DOM Image of this icon set at the location passed-in
      * @type DOMElement
      */
      draw: function(px) {
          OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, 
                                              null, 
                                              null, 
                                              this.size, 
                                              this.url, 
                                              "absolute");
          this.moveTo(px);
          return this.imageDiv;
      }, 
  
      /**
      * @param {OpenLayers.Pixel} px
      */
      moveTo: function (px) {
          //if no px passed in, use stored location
          if (px != null) {
              this.px = px;
          }
  
          if (this.imageDiv != null) {
              if (this.px == null) {
                  this.display(false);
              } else {
                  if (this.calculateOffset) {
                      this.offset = this.calculateOffset(this.size);  
                  }
                  var offsetPx = this.px.offset(this.offset);
                  OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, offsetPx);
                  this.display(true);
              }
          }
      },
      
      /** Hide or show the icon
       * 
       * @param {Boolean} display
       */
      display: function(display) {
          this.imageDiv.style.display = (display) ? "" : "none"; 
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Icon"
  };
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer.js
  
  Index: Layer.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   */
  OpenLayers.Layer = Class.create();
  OpenLayers.Layer.prototype = {
  
      /** @type String */
      id: null,
  
      /** @type String */
      name: null,
  
      /** @type DOMElement */
      div: null,
  
      /** This variable is set when the layer is added to the map, via the 
       *  accessor function setMap()
       * 
       * @type OpenLayers.Map */
      map: null,
      
      /** Whether or not the layer is a base layer. This should be set 
       *   individually by all subclasses. 
       *   Default is false
       * 
       * @type Boolean
       */
      isBaseLayer: false,
   
      /** asserts whether or not the layer's images have an alpha channel 
       * 
       * @type boolean */
      alpha: false,
  
    // OPTIONS
  
      /** @type Array */
      options: null,
  
      /** @type String */
      projection: null,    
          
      /** @type OpenLayers.Bounds */
      maxExtent: null,
      
      /** @type float */
      maxResolution: null,
  
      /** @type int */
      numZoomLevels: null,
     
      /** @type float */
      minScale: null,
      
      /** @type float */
      maxScale: null,
      
      /** @type String */
      units: null,
      
      /**
       * @constructor
       * 
       * @param {String} name
       * @param {Object} options Hashtable of extra options to tag onto the layer
       */
      initialize: function(name, options) {
          if (arguments.length > 0) {
  
              //store a copy of the custom options for later cloning
              this.options = Object.extend(new Object(), options);
              
              //add options to layer
              Object.extend(this, this.options);
  
              this.name = name;
              
              //generate unique id based on name
              this.id = OpenLayers.Util.createUniqueID("Layer_");
              
              if (this.div == null) {
                  this.div = OpenLayers.Util.createDiv();
                  this.div.style.width = "100%";
                  this.div.style.height = "100%";
              }
          }
      },
      
      /**
       * Destroy is a destructor: this is to alleviate cyclic references which
       * the Javascript garbage cleaner can not take care of on its own.
       */
      destroy: function() {
          if (this.map != null) {
              this.map.removeLayer(this);
          }
          this.map = null;
          this.name = null;
          this.div = null;
          this.options = null;
      },
      
     /**
      * @returns An exact clone of this OpenLayers.Layer
      * @type OpenLayers.Layer
      */
      clone: function (obj) {
          
          if (obj == null) {
              obj = new OpenLayers.Layer(this.name, this.options);
          } 
          
          // catch any randomly tagged-on properties
          OpenLayers.Util.applyDefaults(obj, this);
          
          // a cloned layer should never have its map property set
          //  because it has not been added to a map yet. 
          obj.map = null;
          
          return obj;
      },
      
      /** 
       * @param {String} newName
       */
      setName: function(newName) {
          this.name = newName;
          if (this.map != null)
              this.map.events.triggerEvent("changelayer");
      },    
      
     /**
      * @param {Object} newOptions
      */
      addOptions: function (newOptions) {
          
          // update our copy for clone
          Object.extend(this.options, newOptions);
  
          // add new options to this
          Object.extend(this, this.options);
      },
      
      /**
       * 
       */
      onMapResize: function() {
          //this function can be implemented by subclasses  
      },
  
      /**
       * @param {OpenLayers.Bounds} bound
       * @param {Boolean} zoomChanged tells when zoom has changed, as layers 
       *                   have to do some init work in that case.
       * @param {Boolean} minor
       */
      moveTo:function(bounds, zoomChanged, minor) {
          //this function can be implemented by subclasses.
      },
  
      /** Set the map property for the layer. This is done through an accessor
       *   so that subclasses can override this and take special action once 
       *   they have their map variable set. 
       * 
       *  Here we take care to bring over any of the necessary default properties
       *   from the map. 
       * 
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          this.map = map;
          
          var properties = new Array(
            'projection', 'units',
            'scales', 'resolutions',
            'maxScale', 'minScale', 
            'maxResolution', 'minResolution', 
            'minExtent', 'maxExtent',
            'numZoomLevels'
          );
          if (this.map.maxZoomLevel && !this.numZoomLevels) {
              this.numZoomLevels = this.map.maxZoomLevel + 1;
          }
          for(var i=0; i < properties.length; i++) {
              if (this[properties[i]] == null) {
                  this[properties[i]] = this.map[properties[i]];
              }    
          }
      },
    
      /**
      * @returns Whether or not the layer is visible
      * @type Boolean
      */
      getVisibility: function() {
          return (this.div.style.display != "none");
      },
  
      /** 
       * @param {Boolean} visible
       * @param {Boolean} noEvent
       */
      setVisibility: function(visible, noEvent) {
          if (visible != this.getVisibility()) {
              this.div.style.display = (visible) ? "block" : "none";
              if ((visible) && (this.map != null)) {
                  var extent = this.map.getExtent();
                  if (extent != null) {
                      this.moveTo(this.map.getExtent());
                  }
              }
              if ((this.map != null) && 
                  ((noEvent == null) || (noEvent == false))) {
                  this.map.events.triggerEvent("changelayer");
              }
          }
      },
      
      
    /********************************************************/
    /*                                                      */
    /*                 Layer Options                        */
    /*                                                      */
    /*    Accessor functions to Layer Options parameters    */
    /*                                                      */
    /********************************************************/
      
      /** 
       * @param {Boolean} isBaseLayer 
       */
      setIsBaseLayer: function(isBaseLayer) {
          this.isBaseLayer = isBaseLayer;
          if (this.map != null) {
              this.map.events.triggerEvent("changelayer");
          }
      },
      
      /**
       * @type String
       */
      getProjection: function() {
          return this.projection;
      },    
      
      /**
       * @type OpenLayers.Bounds
       */
      getMaxExtent: function() {
          return this.maxExtent;
      }, 
  
      /** 
       * @type float
       */
      getMaxResolution: function() {
          return this.maxResolution;
      },
      
      /**
       * @returns The total number of zoom levels this layer can reach
       * @type int
       */
      getNumZoomLevels: function() {
          return this.numZoomLevels;
      },
  
    /********************************************************/
    /*                                                      */
    /*                 Baselayer Functions                  */
    /*                                                      */
    /*    The following functions must all be implemented   */
    /*                  by all base layers                  */
    /*                                                      */
    /********************************************************/
      
      /** 
       * @returns Degrees per Pixel
       * @type float
       */
      getResolution: function() {
          var viewSize = this.map.getSize();
          var extent = this.getExtent();
          return Math.max( extent.getWidth()  / viewSize.w,
                           extent.getHeight() / viewSize.h );
      },
      
      /** Calculates using px-> lonlat translation functions on tl and br 
       *   corners of viewport
       * 
       * @returns A Bounds object which represents the lon/lat bounds of the 
       *          current viewPort.
       * @type OpenLayers.Bounds
       */
      getExtent: function () {
          var extent = null;
          
          
          var size = this.map.getSize();
          
          var tlPx = new OpenLayers.Pixel(0,0);
          var tlLL = this.getLonLatFromViewPortPx(tlPx);
  
          var brPx = new OpenLayers.Pixel(size.w, size.h);
          var brLL = this.getLonLatFromViewPortPx(brPx);
          
          if ((tlLL != null) && (brLL != null)) {
              extent = new OpenLayers.Bounds(tlLL.lon, 
                                         brLL.lat, 
                                         brLL.lon, 
                                         tlLL.lat);
          }
  
          return extent;
      },
  
      
      /**
      * @param {OpenLayers.Pixel} viewPortPx
      *
      * @returns An OpenLayers.LonLat which is the passed-in view port
      *          OpenLayers.Pixel, translated into lon/lat by the layer
      * @type OpenLayers.LonLat
      */
      getLonLatFromViewPortPx: function (viewPortPx) {
          var size = this.map.getSize();
          var center = this.map.getCenter();
          var res  = this.map.getResolution();
      
          var delta_x = viewPortPx.x - (size.w / 2);
          var delta_y = viewPortPx.y - (size.h / 2);
          
          return new OpenLayers.LonLat(center.lon + delta_x * res ,
                                       center.lat - delta_y * res); 
      },
  
      /**
      * @param {OpenLayers.LonLat} lonlat
      *
      * @returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, 
      *          translated into view port pixels
      * @type OpenLayers.Pixel
      */
      getViewPortPxFromLonLat: function (lonlat) {
          var resolution = this.map.getResolution();
          var extent = this.map.getExtent();
          return new OpenLayers.Pixel(
                         Math.round(1/resolution * (lonlat.lon - extent.left)),
                         Math.round(1/resolution * (extent.top - lonlat.lat))
                         );    
      },
      
      /**
      * @param {OpenLayers.Bounds} bounds
      *
      * @return {int}
      */
      getZoomForExtent: function (bounds) {
          // this should be implemented by subclasses
      },
  
  
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer"
  };
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Map.js
  
  Index: Map.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Util.js
   * @requires OpenLayers/Events.js
   */
  OpenLayers.Map = Class.create();
  OpenLayers.Map.TILE_WIDTH = 256;
  OpenLayers.Map.TILE_HEIGHT = 256;
  OpenLayers.Map.prototype = {
      
      /** base z-indexes for different classes of thing 
       * 
       * @type Object
       */
      Z_INDEX_BASE: { BaseLayer: 100, Overlay: 325, Popup: 750, Control: 1000 },
  
      /** supported application event types
       * 
       * @type Array */
      EVENT_TYPES: [ 
          "addlayer", "removelayer", "changelayer", "movestart", "move", 
          "moveend", "zoomend", "popupopen", "popupclose",
          "addmarker", "removemarker", "clearmarkers", "mouseover",
          "mouseout", "mousemove", "dragstart", "drag", "dragend",
          "changebaselayer"],
  
      /** @type OpenLayers.Events */
      events: null,
  
      /** the div that our map lives in
       * 
       * @type DOMElement */
      div: null,
  
      /** Size of the main div (this.div)
       * 
       * @type OpenLayers.Size */
      size: null,
      
      /** @type HTMLDivElement  */
      viewPortDiv: null,
  
      /** The lonlat at which the later container was re-initialized (on-zoom)
       * @type OpenLayers.LonLat */
      layerContainerOrigin: null,
  
      /** @type HTMLDivElement */
      layerContainerDiv: null,
  
      /** ordered list of layers in the map
       * 
       * @type Array(OpenLayers.Layer)
       */
      layers: null,
  
      /** @type Array(OpenLayers.Control) */
      controls: null,
  
      /** @type Array(OpenLayers.Popup) */
      popups: null,
  
      /** The currently selected base layer - this determines min/max zoom level, 
       *  projection, etc.
       * 
       * @type OpenLayers.Layer */
      baseLayer: null,
      
      /** @type OpenLayers.LonLat */
      center: null,
  
      /** @type int */
      zoom: 0,    
  
    // Options
  
      /** @type OpenLayers.Size */
      tileSize: null,
  
      /** @type String */
      projection: "EPSG:4326",    
          
      /** @type String */
      units: 'degrees',
  
      /** default max is 360 deg / 256 px, which corresponds to
       *    zoom level 0 on gmaps
       * 
       * @type float */
      maxResolution: 1.40625,
  
      /** @type float */
      minResolution: null,
  
      /** @type float */
      maxScale: null,
  
      /** @type float */
      minScale: null,
  
      /** @type OpenLayers.Bounds */
      maxExtent: null,
      
      /** @type OpenLayers.Bounds */
      minExtent: null,
      
      /** @type int */
      numZoomLevels: 16,
  
  
      /**
       * @constructor
       * 
       * @param {DOMElement} div
       * @param {Object} options Hashtable of extra options to tag onto the map
       */    
      initialize: function (div, options) {
  
          this.div = div = $(div);
  
          // the viewPortDiv is the outermost div we modify
          var id = div.id + "_OpenLayers_ViewPort";
          this.viewPortDiv = OpenLayers.Util.createDiv(id, null, null, null,
                                                       "relative", null,
                                                       "hidden");
          this.viewPortDiv.style.width = "100%";
          this.viewPortDiv.style.height = "100%";
          this.div.appendChild(this.viewPortDiv);
  
          // the layerContainerDiv is the one that holds all the layers
          id = div.id + "_OpenLayers_Container";
          this.layerContainerDiv = OpenLayers.Util.createDiv(id);
          this.layerContainerDiv.style.zIndex=this.Z_INDEX_BASE['Popup']-1;
          
          this.viewPortDiv.appendChild(this.layerContainerDiv);
  
          this.events = new OpenLayers.Events(this, div, this.EVENT_TYPES);
  
          this.updateSize();
   
      // Because Mozilla does not support the "resize" event for elements other
      //  than "window", we need to put a hack here. 
      // 
          if (navigator.appName.contains("Microsoft")) {
              // If IE, register the resize on the div
              this.events.register("resize", this, this.updateSize);
          } else {
              // Else updateSize on catching the window's resize
              //  Note that this is ok, as updateSize() does nothing if the 
              //  map's size has not actually changed.
              Event.observe(window, 'resize', 
                            this.updateSize.bindAsEventListener(this));
          }
          
          //set the default options
          this.setOptions(options);
  
          this.layers = [];
          
          if (this.controls == null) {
              this.controls = [ new OpenLayers.Control.MouseDefaults(),
                                new OpenLayers.Control.PanZoom()];
          }
  
          for(var i=0; i < this.controls.length; i++) {
              this.addControlToMap(this.controls[i]);
          }
  
          this.popups = new Array();
  
          // always call map.destroy()
          Event.observe(window, 
                        'unload', 
                        this.destroy.bindAsEventListener(this));
  
      },
  
      /**
      * @private
      */
      destroy:function() {
          if (this.layers != null) {
              for(var i=0; i< this.layers.length; i++) {
                  this.layers[i].destroy();
              } 
              this.layers = null;
          }
          if (this.controls != null) {
              for(var i=0; i< this.controls.length; i++) {
                  this.controls[i].destroy();
              } 
              this.controls = null;
          }
      },
  
      /**
       * @private
       * 
       * @param {Object} options Hashtable of options to tag to the map
       */
      setOptions: function(options) {
  
          // Simple-type defaults are set in class definition. 
          //  Now set complex-type defaults 
          this.tileSize = new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH,
                                              OpenLayers.Map.TILE_HEIGHT);
          
          this.maxExtent = new OpenLayers.Bounds(-180, -90, 180, 90);
  
          // now add the options declared by the user
          //  (these will override defaults)
          Object.extend(this, options);
      },
  
      /**
       * @type OpenLayers.Size
       */
       getTileSize: function() {
           return this.tileSize;
       },
  
    /********************************************************/
    /*                                                      */
    /*           Layers, Controls, Popup Functions          */
    /*                                                      */
    /*     The following functions deal with adding and     */
    /*        removing Layers, Controls, and Popups         */
    /*                to and from the Map                   */
    /*                                                      */
    /********************************************************/         
  
      /**
       * @param {String} name
       * 
       * @returns The Layer with the corresponding id from the map's 
       *           layer collection, or null if not found.
       * @type OpenLayers.Layer
       */
      getLayer: function(id) {
          var foundLayer = null;
          for (var i = 0; i < this.layers.length; i++) {
              var layer = this.layers[i];
              if (layer.id == id) {
                  foundLayer = layer;
              }
          }
          return foundLayer;
      },
  
      /**
      * @param {OpenLayers.Layer} layer
      */    
      addLayer: function (layer) {
          layer.div.style.overflow = "";
          layer.div.style.zIndex = 
              this.Z_INDEX_BASE[layer.isBaseLayer ? 'BaseLayer' : 'Overlay']
              + this.layers.length * 5;
  
          if (layer.isFixed) {
              this.viewPortDiv.appendChild(layer.div);
          } else {
              this.layerContainerDiv.appendChild(layer.div);
          }
          this.layers.push(layer);
          layer.setMap(this);
  
          this.events.triggerEvent("addlayer");
  
          //make sure layer draws itself!
          if (this.center != null) {
              var bounds = this.getExtent();
              layer.moveTo(bounds, true);
          }
  
          if (layer.isBaseLayer) {
              // set the first baselaye we add as the baselayer
              if (this.baseLayer == null) {
                  this.setBaseLayer(layer);
                  this.events.triggerEvent("changebaselayer");
              } else {
                  layer.setVisibility(false);
              }
          }
      },
  
      /**
      * @param {Array(OpenLayers.Layer)} layers
      */    
      addLayers: function (layers) {
          for (var i = 0; i <  layers.length; i++) {
              this.addLayer(layers[i]);
          }
      },
  
      /** Removes a layer from the map by removing its visual element (the 
       *   layer.div property), then removing it from the map's internal list 
       *   of layers, setting the layer's map property to null. 
       * 
       *   a "removelayer" event is triggered.
       * 
       *   very worthy of mention is that simply removing a layer from a map
       *   will not cause the removal of any popups which may have been created
       *   by the layer. this is due to the fact that it was decided at some
       *   point that popups would not belong to layers. thus there is no way 
       *   for us to know here to which layer the popup belongs.
       *    
       *     A simple solution to this is simply to call destroy() on the layer.
       *     the default OpenLayers.Layer class's destroy() function
       *     automatically takes care to remove itself from whatever map it has
       *     been attached to. 
       * 
       *     The correct solution is for the layer itself to register an 
       *     event-handler on "removelayer" and when it is called, if it 
       *     recognizes itself as the layer being removed, then it cycles through
       *     its own personal list of popups, removing them from the map.
       * 
       * @param {OpenLayers.Layer} layer
       */
      removeLayer: function(layer) {
          if (layer.isFixed) {
              this.viewPortDiv.removeChild(layer.div);
          } else {
              this.layerContainerDiv.removeChild(layer.div);
          }
          layer.map = null;
          this.layers.remove(layer);
  
          // if we removed the base layer, need to set a new one
          if (this.baseLayer == layer) {
              this.baseLayer = null;
              for(i=0; i < this.layers.length; i++) {
                  var iLayer = this.layers[i];
                  if (iLayer.isBaseLayer) {
                      this.setBaseLayer(iLayer);
                      break;
                  }
              }
          }
          this.events.triggerEvent("removelayer");
      },
      
      /** Allows user to specify one of the currently-loaded layers as the Map's
       *   new base layer.
       * 
       * @param {OpenLayers.Layer} newBaseLayer
       * @param {Boolean} noEvent
       */
      setBaseLayer: function(newBaseLayer, noEvent) {
  
          if (newBaseLayer != this.baseLayer) {
            
              // is newBaseLayer an already loaded layer?
              var foundLayer = (this.layers.indexOf(newBaseLayer) != -1);    
              if (foundLayer) {
  
                  // make the old base layer invisible 
                  if (this.baseLayer != null) {
                      this.baseLayer.setVisibility(false, noEvent);
                  }
  
                  // set new baselayer and make it visible
                  this.baseLayer = newBaseLayer;
                  this.baseLayer.setVisibility(true, noEvent);
  
                  //redraw all layers
                  var center = this.getCenter();
                  if (center != null) {
                      var zoom = this.getZoom();
                      this.zoom = null;
                      if (zoom > this.baseLayer.numZoomLevels - 1) {
                          zoom = this.baseLayer.numZoomLevels - 1;
                      }    
                      this.setCenter(center, zoom);            
                  
                  }
                  if ((noEvent == null) || (noEvent == false)) {
                      this.events.triggerEvent("changebaselayer");
                  }
              }        
          }
      },
  
      /**
      * @param {OpenLayers.Control} control
      * @param {OpenLayers.Pixel} px
      */    
      addControl: function (control, px) {
          this.controls.push(control);
          this.addControlToMap(control, px);
      },
  
      /**
       * @private
       * 
       * @param {OpenLayers.Control} control
       * @param {OpenLayers.Pixel} px
       */    
      addControlToMap: function (control, px) {
          control.setMap(this);
          var div = control.draw(px);
          if (div) {
              div.style.zIndex = this.Z_INDEX_BASE['Control'] +
                                  this.controls.length;
              this.viewPortDiv.appendChild( div );
          }
      },
      
      /** 
      * @param {OpenLayers.Popup} popup
      * @param {Boolean} exclusive If true, closes all other popups first
      */
      addPopup: function(popup, exclusive) {
  
          if (exclusive) {
              //remove all other popups from screen
              for(var i=0; i < this.popups.length; i++) {
                  this.removePopup(this.popups[i]);
              }
          }
  
          popup.map = this;
          this.popups.push(popup);
          var popupDiv = popup.draw();
          if (popupDiv) {
              popupDiv.style.zIndex = this.Z_INDEX_BASE['Popup'] +
                                      this.popups.length;
              this.layerContainerDiv.appendChild(popupDiv);
          }
      },
      
      /** 
      * @param {OpenLayers.Popup} popup
      */
      removePopup: function(popup) {
          this.popups.remove(popup);
          if (popup.div) {
              this.layerContainerDiv.removeChild(popup.div);
          }
          popup.map = null;
      },
  
    /********************************************************/
    /*                                                      */
    /*              Container Div Functions                 */
    /*                                                      */
    /*   The following functions deal with the access to    */
    /*    and maintenance of the size of the container div  */
    /*                                                      */
    /********************************************************/     
  
      /**
      * @returns {OpenLayers.Size}
      */
      getSize: function () {
          return this.size;
      },
  
      /**
      * This function should be called by any external code which dynamically
      * changes the size of the map div (because mozilla wont let us catch the
      * "onresize" for an element)
      */
      updateSize: function() {
          var newSize = this.getCurrentSize();
          var oldSize = this.getSize();
          if (oldSize == null)
              this.size = oldSize = newSize;
          if (!newSize.equals(oldSize)) {
              
              //notify layers of mapresize
              for(var i=0; i < this.layers.length; i++) {
                  this.layers[i].onMapResize();                
              }
  
              var center = new OpenLayers.Pixel(newSize.w /2, newSize.h / 2);
              
              var zoom = this.getZoom();
              this.zoom = null;
              this.setCenter(center, zoom);
              
              // store the new size
              this.size = newSize;
              // the div might have moved on the page, also
              this.events.element.offsets = null;
          }
      },
      
      /**
       * @private 
       * 
       * @returns A new OpenLayers.Size object with the dimensions of the map div
       * @type OpenLayers.Size
       */
      getCurrentSize: function() {
  
          var size = new OpenLayers.Size(this.div.clientWidth, 
                                         this.div.clientHeight);
  
          // Workaround for the fact that hidden elements return 0 for size.
          if (size.w == 0 && size.h == 0) {
              var dim = Element.getDimensions(this.div);
              size.w = dim.width;
              size.h = dim.height;
          }
          if (size.w == 0 && size.h == 0) {
              size.w = parseInt(this.div.style.width);
              size.h = parseInt(this.div.style.height);
          }
          return size;
      },
  
    /********************************************************/
    /*                                                      */
    /*            Zoom, Center, Pan Functions               */
    /*                                                      */
    /*    The following functions handle the validation,    */
    /*   getting and setting of the Zoom Level and Center   */
    /*       as well as the panning of the Map              */
    /*                                                      */
    /********************************************************/
      /**
      * @return {OpenLayers.LonLat}
      */
      getCenter: function () {
          return this.center;
      },
  
  
      /**
      * @return {int}
      */
      getZoom: function () {
          return this.zoom;
      },
      
      /** Allows user to pan by a value of screen pixels
       * 
       * @param {int} dx
       * @param {int} dy
       */
      pan: function(dx, dy) {
  
          // getCenter
          var centerPx = this.getViewPortPxFromLonLat(this.getCenter());
  
          // adjust
          var newCenterPx = centerPx.add(dx, dy);
          
          // only call setCenter if there has been a change
          if (!newCenterPx.equals(centerPx)) {
              var newCenterLonLat = this.getLonLatFromViewPortPx(newCenterPx);
              this.setCenter(newCenterLonLat);
          }
  
     },
  
      /**
      * @param {OpenLayers.LonLat} lonlat
      * @param {int} zoom
      * @param {Boolean} minor Specifies whether or not to 
      *                        trigger movestart/end events
      */
      setCenter: function (lonlat, zoom, minor) {
          var zoomChanged = (this.isValidZoomLevel(zoom)) && 
                            (zoom != this.getZoom());
  
          var centerChanged = (this.isValidLonLat(lonlat)) && 
                              (!lonlat.equals(this.center));
  
  
          // if neither center nor zoom will change, no need to do anything
          if (zoomChanged || centerChanged || !minor) {
  
              if (!minor) { this.events.triggerEvent("movestart"); }
  
              if (centerChanged) {
                  if ((!zoomChanged) && (this.center)) { 
                      // if zoom hasnt changed, just slide layerContainer
                      //  (must be done before setting this.center to new value)
                      this.centerLayerContainer(lonlat);
                  }
                  this.center = lonlat.clone();
              }
  
              // (re)set the layerContainerDiv's location
              if ((zoomChanged) || (this.layerContainerOrigin == null)) {
                  this.layerContainerOrigin = this.center.clone();
                  this.layerContainerDiv.style.left = "0px";
                  this.layerContainerDiv.style.top  = "0px";
              }
  
              if (zoomChanged) {
                  this.zoom = zoom;
                      
                  //redraw popups
                  for (var i = 0; i < this.popups.length; i++) {
                      this.popups[i].updatePosition();
                  }
              }    
              
              //send the move call to the baselayer and all the overlays    
              var bounds = this.getExtent();
              for (var i = 0; i < this.layers.length; i++) {
                  var layer = this.layers[i];
                  if ((layer == this.baseLayer) || !layer.isBaseLayer) {
                      layer.moveTo(bounds, zoomChanged, minor);
                  }
              }
              
              this.events.triggerEvent("move");
      
              if (zoomChanged) { this.events.triggerEvent("zoomend"); }
          }
  
          // even if nothing was done, we want to notify of this
          if (!minor) { this.events.triggerEvent("moveend"); }
      },
  
      /** This function takes care to recenter the layerContainerDiv 
       * 
       * @private 
       * 
       * @param {OpenLayers.LonLat} lonlat
       */
      centerLayerContainer: function (lonlat) {
  
          var originPx = this.getViewPortPxFromLonLat(this.layerContainerOrigin);
          var newPx = this.getViewPortPxFromLonLat(lonlat);
  
          this.layerContainerDiv.style.left = (originPx.x - newPx.x) + "px";
          this.layerContainerDiv.style.top  = (originPx.y - newPx.y) + "px";
      },
  
      /**
       * @private 
       * 
       * @param {int} zoomLevel
       * 
       * @returns Whether or not the zoom level passed in is non-null and 
       *           within the min/max range of zoom levels.
       * @type Boolean
       */
      isValidZoomLevel: function(zoomLevel) {
         return ( (zoomLevel != null) &&
                  (zoomLevel >= 0) && 
                  (zoomLevel < this.getNumZoomLevels()) );
      },
      
      /**
       * @private 
       * 
       * @param {OpenLayers.LonLat} lonlat
       * 
       * @returns Whether or not the lonlat passed in is non-null and within
       *             the maxExtent bounds
       * 
       * @type Boolean
       */
      isValidLonLat: function(lonlat) {
          var valid = false;
          if (lonlat != null) {
              var maxExtent = this.getMaxExtent();
              valid = maxExtent.contains(lonlat.lon, lonlat.lat);        
          }
          return valid;
      },
  
    /********************************************************/
    /*                                                      */
    /*                 Layer Options                        */
    /*                                                      */
    /*    Accessor functions to Layer Options parameters    */
    /*                                                      */
    /********************************************************/
      
      /**
       * @returns The Projection of the base layer
       * @type String
       */
      getProjection: function() {
          var projection = null;
          if (this.baseLayer != null) {
              projection = this.baseLayer.getProjection();
          }
          return projection;
      },
      
      /**
       * @returns The Map's Maximum Resolution
       * @type String
       */
      getMaxResolution: function() {
          var maxResolution = null;
          if (this.baseLayer != null) {
              maxResolution = this.baseLayer.getMaxResolution();
          }
          return maxResolution;
      },
          
      /**
      * @type OpenLayers.Bounds
      */
      getMaxExtent: function () {
          var maxExtent = null;
          if (this.baseLayer != null) {
              maxExtent = this.baseLayer.getMaxExtent();
          }        
          return maxExtent;
      },
      
      /**
       * @returns The total number of zoom levels that can be displayed by the 
       *           current baseLayer.
       * @type int
       */
      getNumZoomLevels: function() {
          var numZoomLevels = null;
          if (this.baseLayer != null) {
              numZoomLevels = this.baseLayer.getNumZoomLevels();
          }
          return numZoomLevels;
      },
  
    /********************************************************/
    /*                                                      */
    /*                 Baselayer Functions                  */
    /*                                                      */
    /*    The following functions, all publicly exposed     */
    /*       in the API?, are all merely wrappers to the    */
    /*       the same calls on whatever layer is set as     */
    /*                the current base layer                */
    /*                                                      */
    /********************************************************/
  
      /**
       * @returns A Bounds object which represents the lon/lat bounds of the 
       *          current viewPort. 
       *          If no baselayer is set, returns null.
       * @type OpenLayers.Bounds
       */
      getExtent: function () {
          var extent = null;
          if (this.baseLayer != null) {
              extent = this.baseLayer.getExtent();
          }
          return extent;
      },
  
      /**
       * @returns The current resolution of the map. 
       *          If no baselayer is set, returns null.
       * @type float
       */
      getResolution: function () {
          var resolution = null;
          if (this.baseLayer != null) {
              resolution = this.baseLayer.getResolution();
          }
          return resolution;
      },
  
       /**
        * @returns The current scale denominator of the map. 
        *          If no baselayer is set, returns null.
        * @type float
        */
      getScale: function () {
          var scale = null;
          if (this.baseLayer != null) {
              var res = this.getResolution();
              var units = this.baseLayer.units;
              scale = res * OpenLayers.INCHES_PER_UNIT[units] *
                      OpenLayers.DOTS_PER_INCH;
          }
          return scale;
      },
  
  
      /**
      * @param {OpenLayers.Bounds} bounds
      *
      * @returns A suitable zoom level for the specified bounds.
      *          If no baselayer is set, returns null.
      * @type int
      */
      getZoomForExtent: function (bounds) {
          zoom = null;
          if (this.baseLayer != null) {
              zoom = this.baseLayer.getZoomForExtent(bounds);
          }
          return zoom;
      },
  
    /********************************************************/
    /*                                                      */
    /*                  Zooming Functions                   */
    /*                                                      */
    /*    The following functions, all publicly exposed     */
    /*       in the API, are all merely wrappers to the     */
    /*               the setCenter() function               */
    /*                                                      */
    /********************************************************/
    
      /** Zoom to a specific zoom level
       * 
       * @param {int} zoom
       */
      zoomTo: function(zoom) {
          if (this.isValidZoomLevel(zoom)) {
              this.setCenter(null, zoom);
          }
      },
      
      /**
       * @param {int} zoom
       */
      zoomIn: function() {
          this.zoomTo(this.getZoom() + 1);
      },
      
      /**
       * @param {int} zoom
       */
      zoomOut: function() {
          this.zoomTo(this.getZoom() - 1);
      },
  
      /** Zoom to the passed in bounds, recenter
       * 
       * @param {OpenLayers.Bounds} bounds
       */
      zoomToExtent: function(bounds) {
          this.setCenter(bounds.getCenterLonLat(), 
                         this.getZoomForExtent(bounds));
      },
  
      /** Zoom to the full extent and recenter.
       */
      zoomToMaxExtent: function() {
          this.zoomToExtent(this.getMaxExtent());
      },
  
      /** zoom to a specified scale 
       * 
       * @param {float} scale
       */
      zoomToScale: function(scale) {
          var res = OpenLayers.Util.getResolutionFromScale(scale, 
                                                           this.baseLayer.units);
          var size = this.getSize();
          var w_deg = size.w * res;
          var h_deg = size.h * res;
          var center = this.getCenter();
  
          var extent = new OpenLayers.Bounds(center.lon - w_deg / 2,
                                             center.lat - h_deg / 2,
                                             center.lon + w_deg / 2,
                                             center.lat + h_deg / 2);
          this.zoomToExtent(extent);
      },
      
    /********************************************************/
    /*                                                      */
    /*             Translation Functions                    */
    /*                                                      */
    /*      The following functions translate between       */
    /*           LonLat, LayerPx, and ViewPortPx            */
    /*                                                      */
    /********************************************************/
        
    //
    // TRANSLATION: LonLat <-> ViewPortPx
    //
  
      /**
      * @param {OpenLayers.Pixel} viewPortPx
      *
      * @returns An OpenLayers.LonLat which is the passed-in view port
      *          OpenLayers.Pixel, translated into lon/lat by the 
      *          current base layer
      * @type OpenLayers.LonLat
      * @private
      */
      getLonLatFromViewPortPx: function (viewPortPx) {
          var lonlat = null; 
          if (this.baseLayer != null) {
              lonlat = this.baseLayer.getLonLatFromViewPortPx(viewPortPx);
          }
          return lonlat;
      },
  
      /**
      * @param {OpenLayers.LonLat} lonlat
      *
      * @returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, 
      *          translated into view port pixels by the 
      *          current base layer
      * @type OpenLayers.Pixel
      * @private
      */
      getViewPortPxFromLonLat: function (lonlat) {
          var px = null; 
          if (this.baseLayer != null) {
              px = this.baseLayer.getViewPortPxFromLonLat(lonlat);
          }
          return px;
      },
  
      
    //
    // CONVENIENCE TRANSLATION FUNCTIONS FOR API
    //
  
      /**
       * @param {OpenLayers.Pixel} pixel
       *
       * @returns An OpenLayers.LonLat corresponding to the given
       *          OpenLayers.Pixel, translated into lon/lat by the 
       *          current base layer
       * @type OpenLayers.LonLat
       */
      getLonLatFromPixel: function (px) {
          return this.getLonLatFromViewPortPx(px);
      },
  
      /**
       * @param {OpenLayers.LonLat} lonlat
       *
       * @returns An OpenLayers.Pixel corresponding to the OpenLayers.LonLat
       *          translated into view port pixels by the 
       *          current base layer
       * @type OpenLayers.Pixel
       */
      getPixelFromLonLat: function (lonlat) {
          return this.getViewPortPxFromLonLat(lonlat);
      },
  
  
  
    //
    // TRANSLATION: ViewPortPx <-> LayerPx
    //
  
      /**
       * @private
       * 
       * @param {OpenLayers.Pixel} layerPx
       * 
       * @returns Layer Pixel translated into ViewPort Pixel coordinates
       * @type OpenLayers.Pixel
       */
      getViewPortPxFromLayerPx:function(layerPx) {
          var viewPortPx = null;
          if (layerPx != null) {
              var dX = parseInt(this.layerContainerDiv.style.left);
              var dY = parseInt(this.layerContainerDiv.style.top);
              viewPortPx = layerPx.add(dX, dY);            
          }
          return viewPortPx;
      },
      
      /**
       * @private
       * 
       * @param {OpenLayers.Pixel} viewPortPx
       * 
       * @returns ViewPort Pixel translated into Layer Pixel coordinates
       * @type OpenLayers.Pixel
       */
      getLayerPxFromViewPortPx:function(viewPortPx) {
          var layerPx = null;
          if (viewPortPx != null) {
              var dX = -parseInt(this.layerContainerDiv.style.left);
              var dY = -parseInt(this.layerContainerDiv.style.top);
              layerPx = viewPortPx.add(dX, dY);
          }
          if (!isNaN(layerPx.x) && !isNaN(layerPx.y)) {
              return layerPx;
          }
          return null;
      },
      
    //
    // TRANSLATION: LonLat <-> LayerPx
    //
  
      /**
      * @param {OpenLayers.Pixel} px
      *
      * @type OpenLayers.LonLat
      */
      getLonLatFromLayerPx: function (px) {
         //adjust for displacement of layerContainerDiv
         px = this.getViewPortPxFromLayerPx(px);
         return this.getLonLatFromViewPortPx(px);         
      },
      
      /**
      * @param {OpenLayers.LonLat} lonlat
      *
      * @returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, 
      *          translated into layer pixels by the current base layer
      * @type OpenLayers.Pixel
      */
      getLayerPxFromLonLat: function (lonlat) {
         //adjust for displacement of layerContainerDiv
         var px = this.getViewPortPxFromLonLat(lonlat);
         return this.getLayerPxFromViewPortPx(px);         
      },
  
  
      CLASS_NAME: "OpenLayers.Map"
  };
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Marker.js
  
  Index: Marker.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   */
  OpenLayers.Marker = Class.create();
  OpenLayers.Marker.prototype = {
      
      /** @type OpenLayers.Icon */
      icon: null,
  
      /** location of object
      * @type OpenLayers.LonLat */
      lonlat: null,
      
      /** @type OpenLayers.Events*/
      events: null,
      
      /** @type OpenLayers.Map */
      map: null,
      
      /** 
      * @constructor
      *
      * @param {OpenLayers.Icon} icon
      * @param {OpenLayers.LonLat lonlat
      */
      initialize: function(lonlat, icon) {
          if (arguments.length > 0) {
              this.lonlat = lonlat;
              this.icon = (icon) ? icon : OpenLayers.Marker.defaultIcon();
              this.events = new OpenLayers.Events(this, this.icon.imageDiv, null);
          }
      },
      
      destroy: function() {
          this.map = null;
          
          if (this.icon != null) {
              this.icon.destroy();
              this.icon = null;
          }
      },
      
      /** 
      * @param {OpenLayers.Pixel} px
      * 
      * @return A new DOM Image with this marker´s icon set at the 
      *         location passed-in
      * @type DOMElement
      */
      draw: function(px) {
          return this.icon.draw(px);
      }, 
  
      /**
      * @param {OpenLayers.Pixel} px
      */
      moveTo: function (px) {
          if ((px != null) && (this.icon != null)) {
              this.icon.moveTo(px);
          }            
      },
  
      /**
       * @returns Whether or not the marker is currently visible on screen.
       * @type Boolean
       */
      onScreen:function() {
          
          var onScreen = false;
          if (this.map) {
              var screenBounds = this.map.getExtent();
              onScreen = screenBounds.contains(this.lonlat.lon, this.lonlat.lat);
          }    
          return onScreen;
      },
      
      /**
       * @param {float} inflate
       */
      inflate: function(inflate) {
          if (this.icon) {
              var newSize = new OpenLayers.Size(this.icon.size.w * inflate,
                                                this.icon.size.h * inflate);
              this.icon.setSize(newSize);
          }        
      },
      
      /** Hide or show the icon
       * 
       * @param {Boolean} display
       */
      display: function(display) {
          this.icon.display(display);
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Marker"
  };
  
  
  /** 
   * @returns A default OpenLayers.Icon to use for a marker
   * @type OpenLayers.Icon
   */
  OpenLayers.Marker.defaultIcon = function() {
      var url = OpenLayers.Util.getImagesLocation() + "marker.png";
      var size = new OpenLayers.Size(21, 25);
      var calculateOffset = function(size) {
                      return new OpenLayers.Pixel(-(size.w/2), -size.h);
                   };
  
      return new OpenLayers.Icon(url, size, null, calculateOffset);        
  };
      
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Popup.js
  
  Index: Popup.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   */
  OpenLayers.Popup = Class.create();
  
  OpenLayers.Popup.count = 0;
  OpenLayers.Popup.WIDTH = 200;
  OpenLayers.Popup.HEIGHT = 200;
  OpenLayers.Popup.COLOR = "white";
  OpenLayers.Popup.OPACITY = 1;
  OpenLayers.Popup.BORDER = "0px";
  
  OpenLayers.Popup.prototype = {
  
      /** @type OpenLayers.Events*/
      events: null,
      
      /** @type String */
      id: "",
  
      /** @type OpenLayers.LonLat */
      lonlat: null,
  
      /** @type DOMElement */
      div: null,
  
      /** @type OpenLayers.Size*/
      size: null,    
  
      /** @type String */
      contentHTML: "",
      
      /** @type String */
      backgroundColor: "",
      
      /** @type float */
      opacity: "",
  
      /** @type String */
      border: "",
  
      /** this gets set in Map.js when the popup is added to the map
       * @type OpenLayers.Map */
      map: null,
  
      /** 
      * @constructor
      * 
      * @param {String} id
      * @param {OpenLayers.LonLat} lonlat
      * @param {OpenLayers.Size} size
      * @param {String} contentHTML
      */
      initialize:function(id, lonlat, size, contentHTML) {
          OpenLayers.Popup.count += 1;
          this.id = (id != null) ? id : "Popup" + OpenLayers.Popup.count;
          this.lonlat = lonlat;
          this.size = (size != null) ? size 
                                    : new OpenLayers.Size(
                                                     OpenLayers.Popup.WIDTH,
                                                     OpenLayers.Popup.HEIGHT);
          if (contentHTML != null) { 
               this.contentHTML = contentHTML;
          }
          this.backgroundColor = OpenLayers.Popup.COLOR;
          this.opacity = OpenLayers.Popup.OPACITY;
          this.border = OpenLayers.Popup.BORDER;
  
          this.div = OpenLayers.Util.createDiv(this.id + "_div", null, null, 
                                               null, null, null, "hidden");
  
          this.events = new OpenLayers.Events(this, this.div, null);
      },
  
      /** 
      */
      destroy: function() {
          if (this.map != null) {
              this.map.removePopup(this);
          }
          this.div = null;
          this.map = null;
      },
  
      /** 
      * @param {OpenLayers.Pixel} px
      * 
      * @returns Reference to a div that contains the drawn popup
      * @type DOMElement
      */
      draw: function(px) {
          if (px == null) {
              if ((this.lonlat != null) && (this.map != null)) {
                  px = this.map.getLayerPxFromLonLat(this.lonlat);
              }
          }
          
          this.setSize();
          this.setBackgroundColor();
          this.setOpacity();
          this.setBorder();
          this.setContentHTML();
          this.moveTo(px);
  
          return this.div;
      },
  
      /** 
       * if the popup has a lonlat and its map members set, 
       *  then have it move itself to its proper position
       */
      updatePosition: function() {
          if ((this.lonlat) && (this.map)) {
                  var px = this.map.getLayerPxFromLonLat(this.lonlat);
                  this.moveTo(px);            
          }
      },
  
      /**
      * @param {OpenLayers.Pixel} px
      */
      moveTo: function(px) {
          if ((px != null) && (this.div != null)) {
              this.div.style.left = px.x + "px";
              this.div.style.top = px.y + "px";
          }
      },
  
      /**
       * @returns Boolean indicating whether or not the popup is visible
       * @type Boolean
       */
      visible: function() {
          return Element.visible(this.div);
      },
  
      /**
       * 
       */
      toggle: function() {
          Element.toggle(this.div);
      },
  
      /**
       *
       */
      show: function() {
          Element.show(this.div);
      },
  
      /**
       *
       */
      hide: function() {
          Element.hide(this.div);
      },
  
      /**
      * @param {OpenLayers.Size} size
      */
      setSize:function(size) { 
          if (size != undefined) {
              this.size = size; 
          }
          
          if (this.div != null) {
              this.div.style.width = this.size.w + "px";
              this.div.style.height = this.size.h + "px";
          }
      },  
  
      /**
      * @param {String} color
      */
      setBackgroundColor:function(color) { 
          if (color != undefined) {
              this.backgroundColor = color; 
          }
          
          if (this.div != null) {
              this.div.style.backgroundColor = this.backgroundColor;
          }
      },  
      
      /**
      * @param {float} opacity
      */
      setOpacity:function(opacity) { 
          if (opacity != undefined) {
              this.opacity = opacity; 
          }
          
          if (this.div != null) {
              // for Mozilla and Safari
              this.div.style.opacity = this.opacity;
  
              // for IE
              this.div.style.filter = 'alpha(opacity=' + this.opacity*100 + ')';
          }
      },  
      
      /**
      * @param {int} border
      */
      setBorder:function(border) { 
          if (border != undefined) {
              this.border = border;
          }
          
          if (this.div != null) {
              this.div.style.border = this.border;
          }
      },      
      
      /**
      * @param {String} contentHTML
      */
      setContentHTML:function(contentHTML) {
          if (contentHTML != null) {
              this.contentHTML = contentHTML;
          }
          
          if (this.div != null) {
              this.div.innerHTML = this.contentHTML;
          }    
      },
  
      CLASS_NAME: "OpenLayers.Popup"
  };
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/SingleFile.js
  
  Index: SingleFile.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  _OPENLAYERS_SFL_=true
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Tile.js
  
  Index: Tile.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /*
   * @class 
   * 
   * This is a class designed to designate a single tile, however
   * it is explicitly designed to do relatively little. Tiles store information
   * about themselves -- such as the URL that they are related to, and their 
   * size - but do not add themselves to the layer div automatically, for 
   * example.
   */
  OpenLayers.Tile = Class.create();
  OpenLayers.Tile.prototype = {
      
      /** @type String */
      id: null,
      
      /** @type OpenLayers.Layer */
      layer: null,
      
      /** @type String url of the request */
      url:null,
  
      /** @type OpenLayers.Bounds */
      bounds:null,
      
      /** @type OpenLayers.Size */
      size:null,
      
      /** Top Left pixel of the tile
      * @type OpenLayers.Pixel */
      position:null,
  
      /** @type Boolean */
      drawn: false,
  
      /**
      * @constructor
      *
      * @param {OpenLayers.Layer} layer
      * @param {OpenLayers.Pixel} position
      * @param {OpenLayers.Bounds} bounds
      * @param {String} url
      * @param {OpenLayers.Size} size
      */   
      initialize: function(layer, position, bounds, url, size) {
          if (arguments.length > 0) {
              this.layer = layer;
              this.position = position;
              this.bounds = bounds;
              this.url = url;
              this.size = size;
  
              //give the tile a unique id based on its BBOX.
              this.id = OpenLayers.Util.createUniqueID("Tile_");
          }
      },
      
      /** nullify references to prevent circular references and memory leaks
      */
      destroy:function() {
          this.layer  = null;
          this.bounds = null;
          this.size = null;
          this.position = null;
      },
  
      /**
      */
      draw:function() {
          this.drawn = true;
      },
      
      /** 
       * @param {OpenLayers.Bounds}
       * @param {OpenLayers.pixel} position
       * @param {Boolean} redraw Redraw tile after moving? 
       *                         Default is true
       */
      moveTo: function (bounds, position, redraw) {
          if (redraw == null) {
              redraw = true;
          }
  
          this.clear();
          this.bounds = bounds.clone();
          this.position = position.clone();
          if (redraw) {
              this.draw();
          }
      },
  
      /** Clear the tile of any bounds/position-related data so that it can 
       *   be reused in a new location.
       */
      clear: function() {
          this.drawn = false;
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Tile"
  };
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Util.js
  
  Index: Util.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   */
  OpenLayers.Util = new Object();
  
  /**
   * @param {String} id
   * @param {OpenLayers.Pixel} px
   * @param {OpenLayers.Size} sz
   * @param {String} position
   * @param {String} border
   * @param {String} overflow
   */
  OpenLayers.Util.modifyDOMElement = function(element, id, px, sz, position, 
                                              border, overflow) {
  
      if (id) {
          element.id = id;
      }
      if (px) {
          element.style.left = px.x + "px";
          element.style.top = px.y + "px";
      }
      if (sz) {
          element.style.width = sz.w + "px";
          element.style.height = sz.h + "px";
      }
      if (position) {
          element.style.position = position;
      }
      if (border) {
          element.style.border = border;
      }
      if (overflow) {
          element.style.overflow = overflow;
      }
  };
  
  /** 
  * zIndex is NOT set
  *
  * @param {String} id
  * @param {OpenLayers.Pixel} px
  * @param {OpenLayers.Size} sz
  * @param {String} imgURL
  * @param {String} position
  * @param {String} border
  * @param {String} overflow
  *
  * @returns A DOM Div created with the specified attributes.
  * @type DOMElement
  */
  OpenLayers.Util.createDiv = function(id, px, sz, imgURL, position, 
                                       border, overflow) {
  
      var dom = document.createElement('div');
  
      //set specific properties
      dom.style.padding = "0";
      dom.style.margin = "0";
      if (imgURL) {
          dom.style.backgroundImage = 'url(' + imgURL + ')';
      }
  
      //set generic properties
      if (!id) {
          id = OpenLayers.Util.createUniqueID("OpenLayersDiv");
      }
      if (!position) {
          position = "absolute";
      }
      OpenLayers.Util.modifyDOMElement(dom, id, px, sz, 
                                       position, border, overflow);
  
      return dom;
  };
  
  /** 
  * @param {String} id
  * @param {OpenLayers.Pixel} px
  * @param {OpenLayers.Size} sz
  * @param {String} imgURL
  * @param {String} position
  * @param {String} border
  * @param {Boolean} delayDisplay
  *
  * @returns A DOM Image created with the specified attributes.
  * @type DOMElement
  */
  OpenLayers.Util.createImage = function(id, px, sz, imgURL, position, border, 
                                         delayDisplay) {
  
      image = document.createElement("img");
  
      if(delayDisplay) {
          image.style.display = "none";
          Event.observe(image, "load", 
                        OpenLayers.Util.onImageLoad.bindAsEventListener(image));
          Event.observe(image, "error", 
                        OpenLayers.Util.onImageLoadError.bindAsEventListener(image));
          
      }
      
      //set special properties
      image.style.alt = id;
      image.galleryImg = "no";
      if (imgURL) {
          image.src = imgURL;
      }
  
      //set generic properties
      if (!id) {
          id = OpenLayers.Util.createUniqueID("OpenLayersDiv");
      }
      if (!position) {
          position = "relative";
      }
      OpenLayers.Util.modifyDOMElement(image, id, px, sz, position, border);
  
          
      return image;
  };
  
  
  OpenLayers.Util.onImageLoad = function() {
      this.style.backgroundColor = null;
      this.style.display = "";  
  };
  
  OpenLayers.Util.onImageLoadError = function() {
      this.style.backgroundColor = "pink";
  };
  
  
  OpenLayers.Util.alphaHack = function() {
      var arVersion = navigator.appVersion.split("MSIE");
      var version = parseFloat(arVersion[1]);
      
      return ( (document.body.filters) &&
                        (version >= 5.5) && (version < 7) );
  }
  
  /** 
  * @param {DOMElement} div Div containing Alpha-adjusted Image
  * @param {String} id
  * @param {OpenLayers.Pixel} px
  * @param {OpenLayers.Size} sz
  * @param {String} imgURL
  * @param {String} position
  * @param {String} border
  * @param {String} sizing 'crop', 'scale', or 'image'. Default is "scale"
  */ 
  OpenLayers.Util.modifyAlphaImageDiv = function(div, id, px, sz, imgURL, 
                                                 position, border, sizing) {
  
      OpenLayers.Util.modifyDOMElement(div, id, px, sz);
  
      var img = div.childNodes[0];
  
      if (imgURL) {
          img.src = imgURL;
      }
      OpenLayers.Util.modifyDOMElement(img, div.id + "_innerImage", null, sz, 
                                       "relative", border);
  
      if (OpenLayers.Util.alphaHack()) {
          div.style.display = "inline-block";
          if (sizing == null) {
              sizing = "scale";
          }
          div.style.filter = "progid:DXImageTransform.Microsoft" +
                             ".AlphaImageLoader(src='" + img.src + "', " +
                             "sizingMethod='" + sizing + "')";
          img.style.filter = "progid:DXImageTransform.Microsoft" +
                                  ".Alpha(opacity=0)";
      }
  };
  
  /** 
  * @param {String} id
  * @param {OpenLayers.Pixel} px
  * @param {OpenLayers.Size} sz
  * @param {String} imgURL
  * @param {String} position
  * @param {String} border
  * @param {String} sizing 'crop', 'scale', or 'image'. Default is "scale"
  * @param {Boolean} delayDisplay
  *
  * @returns A DOM Div created with a DOM Image inside it. If the hack is 
  *           needed for transparency in IE, it is added.
  * @type DOMElement
  */ 
  OpenLayers.Util.createAlphaImageDiv = function(id, px, sz, imgURL, 
                                                 position, border, sizing, delayDisplay) {
      
      var div = OpenLayers.Util.createDiv();
      var img = OpenLayers.Util.createImage(null, null, null, null, null, null, 
                                            false);
      div.appendChild(img);
  
      if (delayDisplay) {
          img.style.display = "none";
          Event.observe(img, "load",
                        OpenLayers.Util.onImageLoad.bindAsEventListener(div));
          Event.observe(img, "error",
                        OpenLayers.Util.onImageLoadError.bindAsEventListener(div));
      }
  
      OpenLayers.Util.modifyAlphaImageDiv(div, id, px, sz, imgURL, 
                                          position, border, sizing);
      
      return div;
  };
  
  
  /** Creates a new hashtable and copies over all the keys from the 
  *    passed-in object, but storing them under an uppercased
  *    version of the key at which they were stored.
  * 
  * @param {Object} object
  *
  * @returns A new Object with all the same keys but uppercased
  * @type Object
  */
  OpenLayers.Util.upperCaseObject = function (object) {
      var uObject = new Object();
      for (var key in object) {
          uObject[key.toUpperCase()] = object[key];
      }
      return uObject;
  };
  
  /** Takes a hashtable and copies any keys that don't exist from
  *   another hashtable, by analogy with Object.extend() from
  *   Prototype.js.
  *
  * @param {Object} to
  * @param {Object} from
  */
  OpenLayers.Util.applyDefaults = function (to, from) {
      for (var key in from) {
          if (to[key] == null) {
              to[key] = from[key];
          }
      }
  };
  
  /**
  * @param {Object} params
  *
  * @returns a concatenation of the properties of an object in 
  *    http parameter notation. 
  *    (ex. <i>"key1=value1&key2=value2&key3=value3"</i>)
  * @type String
  */
  OpenLayers.Util.getParameterString = function(params) {
      paramsArray = new Array();
      
      for (var key in params) {
          var value = params[key];
          if ((value != null) && (typeof value != 'function')) {
              paramsArray.push(key + "=" + value);
          }
      }
      
      return paramsArray.join("&");
  };
  
  /** 
  * @returns The fully formatted image location string
  * @type String
  */
  OpenLayers.Util.getImagesLocation = function() {
      return OpenLayers._getScriptLocation() + "img/";
  };
  
  
  
  /** These could/should be made namespace aware?
  *
  * @param {} p
  * @param {str} tagName
  *
  * @return {Array}
  */
  OpenLayers.Util.getNodes=function(p, tagName) {
      var nodes = Try.these(
          function () {
              return OpenLayers.Util._getNodes(p.documentElement.childNodes,
                                              tagName);
          },
          function () {
              return OpenLayers.Util._getNodes(p.childNodes, tagName);
          }
      );
      return nodes;
  };
  
  /**
  * @param {Array} nodes
  * @param {str} tagName
  *
  * @return {Array}
  */
  OpenLayers.Util._getNodes=function(nodes, tagName) {
      var retArray = new Array();
      for (var i=0;i<nodes.length;i++) {
          if (nodes[i].nodeName==tagName) {
              retArray.push(nodes[i]);
          }
      }
  
      return retArray;
  };
  
  
  
  /**
  * @param {} parent
  * @param {str} item
  * @param {int} index
  *
  * @return {str}
  */
  OpenLayers.Util.getTagText = function (parent, item, index) {
      var result = OpenLayers.Util.getNodes(parent, item);
      if (result && (result.length > 0))
      {
          if (!index) {
              index=0;
          }
          if (result[index].childNodes.length > 1) {
              return result.childNodes[1].nodeValue; 
          }
          else if (result[index].childNodes.length == 1) {
              return result[index].firstChild.nodeValue; 
          }
      } else { 
          return ""; 
      }
  };
  
  /**
   * @param {XMLNode} node
   * 
   * @returns The text value of the given node, without breaking in firefox or IE
   * @type String
   */
  OpenLayers.Util.getXmlNodeValue = function(node) {
      var val = null;
      Try.these( 
          function() {
              val = node.text;
              if (!val)
                  val = node.textContent;
          }, 
          function() {
              val = node.textContent;
          }); 
      return val;
  };
  
  /** 
  * @param {Event} evt
  * @param {HTMLDivElement} div
  *
  * @return {boolean}
  */
  OpenLayers.Util.mouseLeft = function (evt, div) {
      // start with the element to which the mouse has moved
      var target = (evt.relatedTarget) ? evt.relatedTarget : evt.toElement;
      // walk up the DOM tree.
      while (target != div && target != null) {
          target = target.parentNode;
      }
      // if the target we stop at isn't the div, then we've left the div.
      return (target != div);
  };
  
  OpenLayers.Util.rad = function(x) {return x*Math.PI/180;};
  OpenLayers.Util.distVincenty=function(p1, p2) {
      var a = 6378137, b = 6356752.3142,  f = 1/298.257223563;
      var L = OpenLayers.Util.rad(p2.lon - p1.lon);
      var U1 = Math.atan((1-f) * Math.tan(OpenLayers.Util.rad(p1.lat)));
      var U2 = Math.atan((1-f) * Math.tan(OpenLayers.Util.rad(p2.lat)));
      var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);
      var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);
      var lambda = L, lambdaP = 2*Math.PI;
      var iterLimit = 20;
      while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0) {
          var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);
          var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) +
          (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
          if (sinSigma==0) return 0;  // co-incident points
          var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;
          var sigma = Math.atan2(sinSigma, cosSigma);
          var alpha = Math.asin(cosU1 * cosU2 * sinLambda / sinSigma);
          var cosSqAlpha = Math.cos(alpha) * Math.cos(alpha);
          var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;
          var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
          lambdaP = lambda;
          lambda = L + (1-C) * f * Math.sin(alpha) *
          (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
      }
      if (iterLimit==0) return NaN  // formula failed to converge
      var uSq = cosSqAlpha * (a*a - b*b) / (b*b);
      var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
      var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
      var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
          B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
      var s = b*A*(sigma-deltaSigma);
      var d = s.toFixed(3)/1000; // round to 1mm precision
      return d;
  };
      
  OpenLayers.Util.getArgs = function() {
      var args = new Object();
      var query = location.search.substring(1);  // Get query string.
      var pairs = query.split("&");              // Break at ampersand. //+pjl
  
      for(var i = 0; i < pairs.length; i++) {
          var pos = pairs[i].indexOf('=');       // Look for "name=value".
          if (pos == -1) continue;               // If not found, skip.
          var argname = pairs[i].substring(0,pos);  // Extract the name.
          var value = pairs[i].substring(pos+1); // Extract the value.
          args[argname] = unescape(value);          // Store as a property.
      }
      return args;                               // Return the object.
  };
  
  /**
   * @param {String} prefix String to prefix random id. If null, default
   *                         is "id_"
   * 
   * @returns A unique id string, built on the passed in prefix
   * @type String
   */
  OpenLayers.Util.createUniqueID = function(prefix) {
      if (prefix == null) {
          prefix = "id_";
      }
      return prefix + Math.round(Math.random() * 10000);        
  };
  
  /** Constant inches per unit 
   *    -- borrowed from MapServer mapscale.c
   * 
   * @type Object */
  OpenLayers.INCHES_PER_UNIT = { 
      'inches': 1.0,
      'ft': 12.0,
      'mi': 63360.0,
      'm': 39.3701,
      'km': 39370.1,
      'dd': 4374754
  };
  OpenLayers.INCHES_PER_UNIT["in"]= OpenLayers.INCHES_PER_UNIT.inches;
  OpenLayers.INCHES_PER_UNIT["degrees"] = OpenLayers.INCHES_PER_UNIT.dd;
  
  /** A sensible default 
   * @type int */
  OpenLayers.DOTS_PER_INCH = 72;
  
  /**
   * @param {float} scale
   * 
   * @returns A normalized scale value, in 1 / X format. 
   *          This means that if a value less than one ( already 1/x) is passed
   *          in, it just returns scale directly. Otherwise, it returns 
   *          1 / scale
   * @type float
   */
  OpenLayers.Util.normalizeScale = function (scale) {
      var normScale = (scale > 1.0) ? (1.0 / scale) 
                                    : scale;
      return normScale;
  };
  
  /**
   * @param {float} scale
   * @param {String} units Index into OpenLayers.INCHES_PER_UNIT hashtable.
   *                       Default is degrees
   * 
   * @returns The corresponding resolution given passed-in scale and unit 
   *          parameters.
   * @type float
   */
  OpenLayers.Util.getResolutionFromScale = function (scale, units) {
  
      if (units == null) {
          units = "degrees";
      }
  
      var normScale = OpenLayers.Util.normalizeScale(scale);
  
      var resolution = 1 / (normScale * OpenLayers.INCHES_PER_UNIT[units]
                                      * OpenLayers.DOTS_PER_INCH);
      return resolution;
  };
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/KeyboardDefaults.js
  
  Index: KeyboardDefaults.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Control.js
   */
  OpenLayers.Control.KeyboardDefaults = Class.create();
  OpenLayers.Control.KeyboardDefaults.prototype = 
    Object.extend( new OpenLayers.Control(), {
  
      /** @type int */
      slideFactor: 50,
  
      /**
       * @constructor
       */
      initialize: function() {
          OpenLayers.Control.prototype.initialize.apply(this, arguments);
      },
      
      /**
       * 
       */
      draw: function() {
          Event.observe(document, 
                        'keypress', 
                        this.defaultKeyDown.bind(this));
      },
      
      /**
      * @param {Event} evt
      */
      defaultKeyDown: function (evt) {
          switch(evt.keyCode) {
              case Event.KEY_LEFT:
                  this.map.pan(-50, 0);
                  break;
              case Event.KEY_RIGHT: 
                  this.map.pan(50, 0);
                  break;
              case Event.KEY_UP:
                  this.map.pan(0, -50);
                  break;
              case Event.KEY_DOWN:
                  this.map.pan(0, 50);
                  break;
          }
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Control.KeyboardDefaults"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/LayerSwitcher.js
  
  Index: LayerSwitcher.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /** 
   * @class
   * 
   * @requires OpenLayers/Control.js
   */
  OpenLayers.Control.LayerSwitcher = Class.create();
  OpenLayers.Control.LayerSwitcher.prototype = 
    Object.extend( new OpenLayers.Control(), {
  
      /** @type String */
      activeColor: "darkblue",
      
  
    // DOM Elements
    
      /** @type DOMElement */
      layersDiv: null,
      
      /** @type DOMElement */
      baseLayersDiv: null,
  
      /** @type Array */
      baseLayerInputs: null,
      
      
      /** @type DOMElement */
      dataLbl: null,
      
      /** @type DOMElement */
      dataLayersDiv: null,
  
      /** @type Array */
      dataLayerInputs: null,
  
  
      /** @type DOMElement */
      minimizeDiv: null,
  
      /** @type DOMElement */
      maximizeDiv: null,
      
      /**
      * @constructor
      */
      initialize: function(options) {
          OpenLayers.Control.prototype.initialize.apply(this, arguments);
      },
  
      /** 
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          OpenLayers.Control.prototype.setMap.apply(this, arguments);
  
          this.map.events.register("addlayer", this, this.redraw);
          this.map.events.register("changelayer", this, this.redraw);
          this.map.events.register("removelayer", this, this.redraw);
          this.map.events.register("changebaselayer", this, this.redraw);
      },
  
      /**
      * @returns A reference to the DIV DOMElement containing the switcher tabs
      * @type DOMElement
      */  
      draw: function() {
          OpenLayers.Control.prototype.draw.apply(this);
  
          // create layout divs
          this.loadContents();
  
          // set mode to minimize
          this.minimizeControl();
          
          // populate div with current info
          this.redraw();    
  
          return this.div;
      },
  
      /** Goes through and takes the current state of the Map and rebuilds the
       *   control to display that state. Groups base layers into a radio-button
       *   group and lists each data layer with a checkbox.
       * 
       * @returns A reference to the DIV DOMElement containing the control
       * @type DOMElement
       */  
      redraw: function() {
  
          //clear out previous layers 
          this.baseLayersDiv.innerHTML = "";
          this.baseLayerInputs = new Array();
          
          this.dataLayersDiv.innerHTML = "";
          this.dataLayerInputs = new Array();
          
          var containsOverlays = false;
          
          for( var i = 0; i < this.map.layers.length; i++) {
              var layer = this.map.layers[i];
              var baseLayer = layer.isBaseLayer;
  
              if (!baseLayer) {
                  containsOverlays = true;
              }
  
              // only check a baselayer if it is *the* baselayer, check data
              //  layers if they are visible
              var checked = (baseLayer) ? (layer == this.map.baseLayer)
                                        : layer.getVisibility();
  
              // create input element
              var inputElem = document.createElement("input");
              inputElem.id = "input_" + layer.name;
              inputElem.name = (baseLayer) ? "baseLayers" : layer.name;
              inputElem.type = (baseLayer) ? "radio" : "checkbox";
              inputElem.value = layer.name;
              inputElem.checked = checked;
              inputElem.defaultChecked = checked;
              inputElem.layer = layer;
              inputElem.control = this;
              Event.observe(inputElem, "mouseup", 
                            this.onInputClick.bindAsEventListener(inputElem));
              
              // create span
              var labelSpan = document.createElement("span");
              labelSpan.innerHTML = layer.name;
              labelSpan.style.verticalAlign = (baseLayer) ? "bottom" : "auto";
              Event.observe(labelSpan, "click", 
                            this.onInputClick.bindAsEventListener(inputElem));
              // create line break
              var br = document.createElement("br");
  
              
              var groupArray = (baseLayer) ? this.baseLayerInputs
                                           : this.dataLayerInputs;
              groupArray.push(inputElem);
                                                   
  
              var groupDiv = (baseLayer) ? this.baseLayersDiv
                                         : this.dataLayersDiv;
              groupDiv.appendChild(inputElem);
              groupDiv.appendChild(labelSpan);
              groupDiv.appendChild(br);
  
          }
  
          // if no overlays, dont display the overlay label
          this.dataLbl.style.display = (containsOverlays) ? "" : "none";        
  
          return this.div;
      },
  
      /** A label has been clicked, check or uncheck its corresponding input
       * 
       * @private
       * 
       * @param {Event} e
       */
  
      onInputClick: function(e) {
          if (this.type == "radio") {
              this.checked = true;
              this.layer.map.setBaseLayer(this.layer, true);
              this.layer.map.events.triggerEvent("changebaselayer");
          } else {
              this.checked = !this.checked;
              this.control.updateMap();
          }
          Event.stop(e);
      },
      
      /** Need to update the map accordingly whenever user clicks in either of
       *   the layers.
       * 
       * @private
       * 
       * @param {Event} e
       */
      onLayerClick: function(e) {
          this.updateMap();
      },
  
  
      /** Cycles through the loaded data and base layer input arrays and makes
       *   the necessary calls to the Map object such that that the map's 
       *   visual state corresponds to what the user has selected in the control
       * 
       * @private
       */
      updateMap: function() {
  
          // set the newly selected base layer        
          for(var i=0; i < this.baseLayerInputs.length; i++) {
              var input = this.baseLayerInputs[i];   
              if (input.checked) {
                  this.map.setBaseLayer(input.layer, false);
              }
          }
  
          // set the correct visibilities for the overlays
          for(var i=0; i < this.dataLayerInputs.length; i++) {
              var input = this.dataLayerInputs[i];   
              input.layer.setVisibility(input.checked, true);
          }
  
      },
  
      /** Set up the labels and divs for the control
       * 
       * @param {Event} e
       */
      maximizeControl: function(e) {
  
          //HACK HACK HACK - find a way to auto-size this layerswitcher
          this.div.style.width = "20em";
          this.div.style.height = "";
  
          this.showControls(false);
  
          if (e != null) {
              Event.stop(e);                                            
          }
      },
      
      /** Hide all the contents of the control, shrink the size, 
       *   add the maximize icon
       * 
       * @param {Event} e
       */
      minimizeControl: function(e) {
  
          this.div.style.width = "0px";
          this.div.style.height = "0px";
  
          this.showControls(true);
  
          if (e != null) {
              Event.stop(e);                                            
          }
      },
  
      /** Hide/Show all LayerSwitcher controls depending on whether we are
       *   minimized or not
       * 
       * @private
       * 
       * @param {Boolean} minimize
       */
      showControls: function(minimize) {
  
          this.maximizeDiv.style.display = minimize ? "" : "none";
          this.minimizeDiv.style.display = minimize ? "none" : "";
  
          this.layersDiv.style.display = minimize ? "none" : "";
      },
      
      /** Set up the labels and divs for the control
       * 
       */
      loadContents: function() {
  
          //configure main div
          this.div.style.position = "absolute";
          this.div.style.top = "10px";
          this.div.style.right = "0px";
          this.div.style.left = "";
          this.div.style.fontFamily = "sans-serif";
          this.div.style.fontWeight = "bold";
          this.div.style.marginTop = "3px";
          this.div.style.marginLeft = "3px";
          this.div.style.marginBottom = "3px";
          this.div.style.fontSize = "smaller";   
          this.div.style.color = "white";   
          this.div.style.backgroundColor = "transparent";
      
          Event.observe(this.div, "mouseup", 
                        this.mouseUp.bindAsEventListener(this));
          Event.observe(this.div, "click",
                        this.ignoreEvent);
          Event.observe(this.div, "mousedown",
                        this.mouseDown.bindAsEventListener(this));
          Event.observe(this.div, "dblclick", this.ignoreEvent);
  
  
          // layers list div        
          this.layersDiv = document.createElement("div");
          this.layersDiv.id = "layersDiv";
          this.layersDiv.style.paddingTop = "5px";
          this.layersDiv.style.paddingLeft = "10px";
          this.layersDiv.style.paddingBottom = "5px";
          this.layersDiv.style.paddingRight = "75px";
          this.layersDiv.style.backgroundColor = this.activeColor;        
  
          // had to set width/height to get transparency in IE to work.
          // thanks -- http://jszen.blogspot.com/2005/04/ie6-opacity-filter-caveat.html
          //
          this.layersDiv.style.width = "100%";
          this.layersDiv.style.height = "100%";
  
  
          var baseLbl = document.createElement("div");
          baseLbl.innerHTML = "<u>Base Layer</u>";
          baseLbl.style.marginTop = "3px";
          baseLbl.style.marginLeft = "3px";
          baseLbl.style.marginBottom = "3px";
          this.layersDiv.appendChild(baseLbl);
          
          this.baseLayersDiv = document.createElement("div");
          this.baseLayersDiv.style.paddingLeft = "10px";
          /*Event.observe(this.baseLayersDiv, "click", 
                        this.onLayerClick.bindAsEventListener(this));
          */
          this.layersDiv.appendChild(this.baseLayersDiv);
                       
  
          this.dataLbl = document.createElement("div");
          this.dataLbl.innerHTML = "<u>Overlays</u>";
          this.dataLbl.style.marginTop = "3px";
          this.dataLbl.style.marginLeft = "3px";
          this.dataLbl.style.marginBottom = "3px";
          this.layersDiv.appendChild(this.dataLbl);
          
          this.dataLayersDiv = document.createElement("div");
          this.dataLayersDiv.style.paddingLeft = "10px";
          /*Event.observe(this.dataLayersDiv, "click", 
                        this.onLayerClick.bindAsEventListener(this));
          */
          this.layersDiv.appendChild(this.dataLayersDiv);
  
          this.div.appendChild(this.layersDiv);
  
          Rico.Corner.round(this.div, {corners: "tl bl",
                                        bgColor: "transparent",
                                        color: this.activeColor,
                                        blend: false});
  
          Rico.Corner.changeOpacity(this.layersDiv, 0.75);
  
          var imgLocation = OpenLayers.Util.getImagesLocation();
          var sz = new OpenLayers.Size(18,18);        
  
          // maximize button div
          var img = imgLocation + 'layer-switcher-maximize.png';
          this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv(
                                      "OpenLayers_Control_MaximizeDiv", 
                                      null, 
                                      sz, 
                                      img, 
                                      "absolute");
          this.maximizeDiv.style.top = "5px";
          this.maximizeDiv.style.right = "0px";
          this.maximizeDiv.style.left = "";
          this.maximizeDiv.style.display = "none";
          Event.observe(this.maximizeDiv, 
                        "click", 
                        this.maximizeControl.bindAsEventListener(this));
          
          this.div.appendChild(this.maximizeDiv);
  
          // minimize button div
          var img = imgLocation + 'layer-switcher-minimize.png';
          var sz = new OpenLayers.Size(18,18);        
          this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv(
                                      "OpenLayers_Control_MinimizeDiv", 
                                      null, 
                                      sz, 
                                      img, 
                                      "absolute");
          this.minimizeDiv.style.top = "5px";
          this.minimizeDiv.style.right = "0px";
          this.minimizeDiv.style.left = "";
          this.minimizeDiv.style.display = "none";
          Event.observe(this.minimizeDiv, 
                        "click", 
                        this.minimizeControl.bindAsEventListener(this));
  
          this.div.appendChild(this.minimizeDiv);
      },
      
      /** 
       * @private
       *
       * @param {Event} evt
       */
      ignoreEvent: function(evt) {
          Event.stop(evt);
      },
  
      /** Register a local 'mouseDown' flag so that we'll know whether or not
       *   to ignore a mouseUp event
       * 
       * @private
       *
       * @param {Event} evt
       */
      mouseDown: function(evt) {
          this.mouseDown = true;
          this.ignoreEvent(evt);
      },
  
      /** If the 'mouseDown' flag has been set, that means that the drag was 
       *   started from within the LayerSwitcher control, and thus we can 
       *   ignore the mouseup. Otherwise, let the Event continue.
       *  
       * @private
       *
       * @param {Event} evt
       */
      mouseUp: function(evt) {
          if (this.mouseDown) {
              this.mouseDown = false;
              this.ignoreEvent(evt);
          }
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Control.LayerSwitcher"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/LayerTabs.js
  
  Index: LayerTabs.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /** 
   * @class
   * 
   * @requires OpenLayers/Control.js
   */
  OpenLayers.Control.LayerTabs = Class.create();
  
  /** color used in the UI to show a layer is active/displayed
  *
  * @final
  * @type String 
  */
  OpenLayers.Control.LayerTabs.ACTIVE_COLOR = "darkblue";
  
  /** color used in the UI to show a layer is deactivated/hidden
  *
  * @final
  * @type String 
  */
  OpenLayers.Control.LayerTabs.NONACTIVE_COLOR = "lightblue";
  
  
  OpenLayers.Control.LayerTabs.prototype = 
    Object.extend( new OpenLayers.Control(), {
  
      /** @type String */
      activeColor: "",
      
      /** @type String */
      nonActiveColor: "",
      
      /** @type String */
      mode: "checkbox",
  
      /**
      * @constructor
      */
      initialize: function(options) {
          this.activeColor = OpenLayers.Control.LayerTabs.ACTIVE_COLOR;
          this.nonActiveColor = OpenLayers.Control.LayerTabs.NONACTIVE_COLOR;
          this.backdrops = [];
          OpenLayers.Control.prototype.initialize.apply(this, arguments);
      },
  
      /**
      * @returns A reference to the DIV DOMElement containing the switcher tabs
      * @type DOMElement
      */  
      draw: function() {
          // initialize our internal div
          OpenLayers.Control.prototype.draw.apply(this);
  
          this.div.style.position = "absolute";
          this.div.style.top = "10px";
          this.div.style.right = "0px";
          this.div.style.left = "";
          this.div.style.fontFamily = "sans-serif";
          this.div.style.color = "white";
          this.div.style.fontWeight = "bold";
          this.div.style.marginTop = "3px";
          this.div.style.marginLeft = "3px";
          this.div.style.marginBottom = "3px";
          this.div.style.fontSize="smaller";   
          this.div.style.width = "10em";
  
          this.map.events.register("addlayer", this, this.redraw);
          this.map.events.register("removelayer", this, this.redraw);
          return this.redraw();    
      },
  
      /**
      * @returns A reference to the DIV DOMElement containing the switcher tabs
      * @type DOMElement
      */  
      redraw: function() {
  
          //clear out previous incarnation of LayerTabs tabs
          this.div.innerHTML = "";
          var visible = false;
          for( var i = 0; i < this.map.layers.length; i++) {
              if (visible && this.mode == "radio") {
                  this.map.layers[i].setVisibility(false);
              } else {
                  visible = this.map.layers[i].getVisibility();
              }
              this.addTab(this.map.layers[i]);
          }
              
          return this.div;
      },
      
      /** 
      * @param {Event} evt
      */
      singleClick: function(evt) {
          var div = Event.element(evt);
  
          // See comment about OL #57 fix below.
          // If the click occurred on the corner spans we need
          // to make sure we act on the actual label tab instead.
          div = div.labelElement || div;
  
          var layer = div.layer;
          if (this.mode == "radio") {
              for(var i=0; i < this.backdrops.length; i++) {
                  this.setTabActivation(this.backdrops[i], false);
                  this.backdrops[i].layer.setVisibility(false);
              }
              this.setTabActivation(div, true);
              layer.setVisibility(true);
          } else {
              var visible = layer.getVisibility();
              
              this.setTabActivation(div, !visible);
              layer.setVisibility(!visible);
          }
          Event.stop(evt);
      },
      
      /** 
      * @private
      *
      * @param {Event} evt
      */
      ignoreEvent: function(evt) {
          Event.stop(evt);
          return false;
      },
  
      /** 
      * @private
      * 
      * @param {OpenLayers.Layer} layer
      */            
      addTab: function(layer) {
  
          // Outer DIV - for Rico Corners
          //
          var backdropLabelOuter = document.createElement('div');
          backdropLabelOuter.id = "LayerTabs_" + layer.name + "_Tab";
          backdropLabelOuter.style.marginTop = "4px";
          backdropLabelOuter.style.marginBottom = "4px";
          
          this._setEventHandlers(backdropLabelOuter);
  
          // Inner Label - for Rico Corners
          //
          var backdropLabel = document.createElement('p');
          backdropLabel.innerHTML = layer.name;
          backdropLabel.style.marginTop = "0px";
          backdropLabel.style.marginBottom = "0px";
          backdropLabel.style.paddingLeft = "10px";
          backdropLabel.style.paddingRight = "10px";
          
          // add reference to layer onto the div for use in event handlers
          backdropLabel.layer = layer;
  
          // set event handlers
          this._setEventHandlers(backdropLabel);
  
          // add label to div
          backdropLabelOuter.appendChild(backdropLabel);
          
          this.backdrops.push(backdropLabel); 
          
          // add div to main LayerTabs Div
          this.div.appendChild(backdropLabelOuter);
  
          Rico.Corner.round(backdropLabelOuter, {corners: "tl bl",
                                        bgColor: "transparent",
                                        color: "white",
                                        blend: false});
  
          // extend the event handlers to operate on the
          // rounded corners as well. (Fixes OL #57.)
          var spanElements=backdropLabel.parentNode.getElementsByTagName("span");
          
          for (var currIdx = 0; currIdx < spanElements.length; currIdx++) {
              this._setEventHandlers(spanElements[currIdx], backdropLabel);
          }
  
          this.setTabActivation(backdropLabel, layer.getVisibility());
      },
  
      /*
        @private
      
        @param {DOMElement} div
        @param {Boolean} activate
      */
      _setEventHandlers : function(element, labelDiv) {
  
          // We only want to respond to a mousedown event.
          element.onclick = this.singleClick.bindAsEventListener(this);
          element.ondblclick = this.singleClick.bindAsEventListener(this);
          element.onmouseup = this.ignoreEvent.bindAsEventListener(this);
          element.onmousedown = this.ignoreEvent.bindAsEventListener(this);
  
          // If we are operating on a corner span we need to store a
          // reference to the actual tab. (See comment about OL #57 fix above.)
          if (labelDiv) {
              element.labelElement = labelDiv;
          }
      },
  
      /**
      * @private
      *
      * @param {DOMElement} div
      * @param {Boolean} activate
      */
      setTabActivation:function(div, activate) {
          var color = (activate) ? this.activeColor : this.nonActiveColor;
          Rico.Corner.changeColor(div, color);
      },
  
  
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Control.LayerTabs"
  });
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/MouseDefaults.js
  
  Index: MouseDefaults.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Control.js
   */
  OpenLayers.Control.MouseDefaults = Class.create();
  OpenLayers.Control.MouseDefaults.prototype = 
    Object.extend( new OpenLayers.Control(), {
  
      /** @type Boolean */
      performedDrag: false,
  
      /** 
       * @constructor
       */
      initialize: function() {
          OpenLayers.Control.prototype.initialize.apply(this, arguments);
  
          //register mousewheel events specifically on the window and document
          Event.observe(window, "DOMMouseScroll", 
                        this.onWheelEvent.bindAsEventListener(this));
          Event.observe(window, "mousewheel", 
                        this.onWheelEvent.bindAsEventListener(this));
          Event.observe(document, "mousewheel", 
                        this.onWheelEvent.bindAsEventListener(this));
      },
  
      /**
       * 
       */    
      draw: function() {
          this.map.events.register( "click", this, this.defaultClick );
          this.map.events.register( "dblclick", this, this.defaultDblClick );
          this.map.events.register( "mousedown", this, this.defaultMouseDown );
          this.map.events.register( "mouseup", this, this.defaultMouseUp );
          this.map.events.register( "mousemove", this, this.defaultMouseMove );
          this.map.events.register( "mouseout", this, this.defaultMouseOut );
      },
  
      /**
       * @param {Event} evt
       * 
       * @type Boolean
       */
      defaultClick: function (evt) {
          if (!Event.isLeftClick(evt)) return;
          var notAfterDrag = !this.performedDrag;
          this.performedDrag = false;
          return notAfterDrag;
      },
  
      /**
      * @param {Event} evt
      */
      defaultDblClick: function (evt) {
          var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
          this.map.setCenter(newCenter, this.map.zoom + 1);
          Event.stop(evt);
          return false;
      },
  
      /**
      * @param {Event} evt
      */
      defaultMouseDown: function (evt) {
          if (!Event.isLeftClick(evt)) return;
          this.mouseDragStart = evt.xy.clone();
          this.performedDrag  = false;
          if (evt.shiftKey) {
              this.map.div.style.cursor = "crosshair";
              this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
                                                       this.mouseDragStart,
                                                       null,
                                                       null,
                                                       "absolute",
                                                       "2px solid red");
              this.zoomBox.style.backgroundColor = "white";
              this.zoomBox.style.filter = "alpha(opacity=50)"; // IE
              this.zoomBox.style.opacity = "0.50";
              this.zoomBox.style.fontSize = "1px";
              this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
              this.map.viewPortDiv.appendChild(this.zoomBox);
          }
          document.onselectstart=function() { return false; }
          Event.stop(evt);
      },
  
      /**
      * @param {Event} evt
      */
      defaultMouseMove: function (evt) {
          if (this.mouseDragStart != null) {
              if (this.zoomBox) {
                  var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x);
                  var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y);
                  this.zoomBox.style.width = Math.max(1, deltaX) + "px";
                  this.zoomBox.style.height = Math.max(1, deltaY) + "px";
                  if (evt.xy.x < this.mouseDragStart.x) {
                      this.zoomBox.style.left = evt.xy.x+"px";
                  }
                  if (evt.xy.y < this.mouseDragStart.y) {
                      this.zoomBox.style.top = evt.xy.y+"px";
                  }
              } else {
                  var deltaX = this.mouseDragStart.x - evt.xy.x;
                  var deltaY = this.mouseDragStart.y - evt.xy.y;
                  var size = this.map.getSize();
                  var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX,
                                                   size.h / 2 + deltaY);
                  var newCenter = this.map.getLonLatFromViewPortPx( newXY ); 
                  this.map.setCenter(newCenter, null, true);
                  this.mouseDragStart = evt.xy.clone();
                  this.map.div.style.cursor = "move";
              }
              this.performedDrag = true;
          }
      },
  
      /**
      * @param {Event} evt
      */
      defaultMouseUp: function (evt) {
          if (!Event.isLeftClick(evt)) return;
          if (this.zoomBox) {
              this.zoomBoxEnd(evt);    
          } else {
              if (this.performedDrag) {
                  this.map.setCenter(this.map.center);
              }
          }
          document.onselectstart=null;
          this.mouseDragStart = null;
          this.map.div.style.cursor = "default";
      },
  
      /**
      * @param {Event} evt
      */
      defaultMouseOut: function (evt) {
          if (this.mouseDragStart != null
              && OpenLayers.Util.mouseLeft(evt, this.map.div)) {
                  this.defaultMouseUp(evt);
          }
      },
  
  
      /** User spun scroll wheel up
       * 
       */
      defaultWheelUp: function()  {
          this.map.zoomIn();
      },
  
      /** User spun scroll wheel down
       * 
       */
      defaultWheelDown: function()  {
          this.map.zoomOut();
      },
  
      /** Zoombox function. 
       *
       */
      zoomBoxEnd: function(evt) {
          if (this.mouseDragStart != null) {
              if (Math.abs(this.mouseDragStart.x - evt.xy.x) > 5 ||    
                  Math.abs(this.mouseDragStart.y - evt.xy.y) > 5) {   
                  var start = this.map.getLonLatFromViewPortPx( this.mouseDragStart ); 
                  var end = this.map.getLonLatFromViewPortPx( evt.xy );
                  var top = Math.max(start.lat, end.lat);
                  var bottom = Math.min(start.lat, end.lat);
                  var left = Math.min(start.lon, end.lon);
                  var right = Math.max(start.lon, end.lon);
                  var bounds = new OpenLayers.Bounds(left, bottom, right, top);
                  var zoom = this.map.getZoomForExtent(bounds);
                  this.map.setCenter(new OpenLayers.LonLat(
                    (start.lon + end.lon) / 2,
                    (start.lat + end.lat) / 2
                   ), zoom);
              } else {
                  var end = this.map.getLonLatFromViewPortPx( evt.xy );
                  this.map.setCenter(new OpenLayers.LonLat(
                    (end.lon),
                    (end.lat)
                   ), this.map.getZoom() + 1);
              }    
              this.map.viewPortDiv.removeChild(document.getElementById("zoomBox"));
              this.zoomBox = null;
         }     
      },
  
  
  /**
   *  Mouse ScrollWheel code thanks to http://adomas.org/javascript-mouse-wheel/
   */
  
  
      /** Catch the wheel event and handle it xbrowserly
       * 
       * @param {Event} e
       */
      onWheelEvent: function(e){
      
          // first determine whether or not the wheeling was inside the map
          var inMap = false;
          var elem = Event.element(e);
          while(elem != null) {
              if (this.map && elem == this.map.div) {
                  inMap = true;
                  break;
              }
              elem = elem.parentNode;
          }
          
          if (inMap) {
              
              var delta = 0;
              if (!e) {
                  e = window.event;
              }
              if (e.wheelDelta) {
                  delta = e.wheelDelta/120; 
                  if (window.opera) {
                      delta = -delta;
                  }
              } else if (e.detail) {
                  delta = -e.detail / 3;
              }
              if (delta) {
                  if (delta < 0) {
                     this.defaultWheelDown();
                  } else {
                     this.defaultWheelUp();
                  }
              }
              
              //only wheel the map, not the window
              Event.stop(e);
          }
      },
      
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Control.MouseDefaults"
  });
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/MouseToolbar.js
  
  Index: MouseToolbar.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Control.js
   * @requires OpenLayers/Control/MouseDefaults.js
   */
  OpenLayers.Control.MouseToolbar = Class.create();
  OpenLayers.Control.MouseToolbar.X = 6;
  OpenLayers.Control.MouseToolbar.Y = 300;
  OpenLayers.Control.MouseToolbar.prototype = 
    Object.extend( new OpenLayers.Control(), 
      Object.extend( new OpenLayers.Control.MouseDefaults(), {
      
      mode: null,
  
      buttons: null,
  
      direction: "vertical",
      
      initialize: function(position, direction) {
          OpenLayers.Control.prototype.initialize.apply(this, arguments);
          this.position = new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,
                                               OpenLayers.Control.MouseToolbar.Y);
          if (position) {
              this.position = position;
          }
          if (direction) {
              this.direction = direction; 
          }
          this.measureDivs = [];
      },
      
      draw: function() {
          OpenLayers.Control.prototype.draw.apply(this, arguments);
          this.buttons = new Object();
          this.map.events.register( "click", this, this.defaultClick );
          this.map.events.register( "dblclick", this, this.defaultDblClick );
          this.map.events.register( "mousedown", this, this.defaultMouseDown );
          this.map.events.register( "mouseup", this, this.defaultMouseUp );
          this.map.events.register( "mousemove", this, this.defaultMouseMove );
          this.map.events.register( "mouseout", this, this.defaultMouseOut );
          var sz = new OpenLayers.Size(28,28);
          var centered = this.position;
          this._addButton("zoombox", "drag-rectangle-off.png", "drag-rectangle-on.png", centered, sz, "Shift->Drag to zoom to area");
          centered = centered.add((this.direction == "vertical" ? 0 : sz.w), (this.direction == "vertical" ? sz.h : 0));
          this._addButton("pan", "panning-hand-off.png", "panning-hand-on.png", centered, sz, "Drag the map to pan.");
          centered = centered.add((this.direction == "vertical" ? 0 : sz.w), (this.direction == "vertical" ? sz.h : 0));
          this.switchModeTo("pan");
          return this.div;
          
      },
      
      _addButton:function(id, img, activeImg, xy, sz, title) {
          var imgLocation = OpenLayers.Util.getImagesLocation() + img;
          var activeImgLocation = OpenLayers.Util.getImagesLocation() + activeImg;
          // var btn = new ol.AlphaImage("_"+id, imgLocation, xy, sz);
          var btn = OpenLayers.Util.createAlphaImageDiv(
                                      "OpenLayers_Control_MouseToolbar_" + id, 
                                      xy, sz, imgLocation, "absolute");
  
          //we want to add the outer div
          this.div.appendChild(btn);
          btn.imgLocation = imgLocation;
          btn.activeImgLocation = activeImgLocation;
          
          btn.events = new OpenLayers.Events(this, btn);
          btn.events.register("mousedown", this, this.buttonClick); 
          btn.events.register("mouseup", this, Event.stop);
          btn.events.register("click", this, Event.stop);
          btn.action = id;
          btn.title = title;
          btn.alt = title;
          btn.map = this.map;
  
          //we want to remember/reference the outer div
          this.buttons[id] = btn;
          return btn;
      },
  
      buttonClick: function(evt) {
          if (!Event.isLeftClick(evt)) return;
          this.switchModeTo(evt.element.action);
          Event.stop(evt);
      },
      
      /**
      * @param {Event} evt
      */
      defaultDblClick: function (evt) {
          this.switchModeTo("pan");
          this.performedDrag = false;
          var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
          this.map.setCenter(newCenter, this.map.zoom + 2);
          Event.stop(evt);
          return false;
      },
  
      /**
      * @param {Event} evt
      */
      defaultMouseDown: function (evt) {
          if (!Event.isLeftClick(evt)) return;
          this.mouseDragStart = evt.xy.clone();
          this.performedDrag = false;
          this.startViaKeyboard = false;
          if (evt.shiftKey && this.mode !="zoombox") {
              this.switchModeTo("zoombox");
              this.startViaKeyboard = true;
          } else if (evt.altKey && this.mode !="measure") {
              this.switchModeTo("measure");
          } else if (!this.mode) {
              this.switchModeTo("pan");
          }
          
          switch (this.mode) {
              case "zoombox":
                  this.map.div.style.cursor = "crosshair";
                  this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
                                                           this.mouseDragStart,
                                                           null,
                                                           null,
                                                           "absolute",
                                                           "2px solid red");
                  this.zoomBox.style.backgroundColor = "white";
                  this.zoomBox.style.filter = "alpha(opacity=50)"; // IE
                  this.zoomBox.style.opacity = "0.50";
                  this.zoomBox.style.fontSize = "1px";
                  this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
                  this.map.viewPortDiv.appendChild(this.zoomBox);
                  this.performedDrag = true;
                  break;
              case "measure":
                  var distance = "";
                  if (this.measureStart) {
                      measureEnd = this.map.getLonLatFromViewPortPx(this.mouseDragStart);
                      distance = OpenLayers.Util.distVincenty(this.measureStart, measureEnd);
                      distance = Math.round(distance * 100) / 100;
                      distance = distance + "km";
                      this.measureStartBox = this.measureBox;
                  }    
                  this.measureStart = this.map.getLonLatFromViewPortPx(this.mouseDragStart);;
                  this.measureBox = OpenLayers.Util.createDiv(null,
                                                           this.mouseDragStart.add(
                                                             -2-parseInt(this.map.layerContainerDiv.style.left),
                                                             -2-parseInt(this.map.layerContainerDiv.style.top)),
                                                           null,
                                                           null,
                                                           "absolute");
                  this.measureBox.style.width="4px";
                  this.measureBox.style.height="4px";
                  this.measureBox.style.fontSize = "1px";
                  this.measureBox.style.backgroundColor="red";
                  this.measureBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
                  this.map.layerContainerDiv.appendChild(this.measureBox);
                  if (distance) {
                      this.measureBoxDistance = OpenLayers.Util.createDiv(null,
                                                           this.mouseDragStart.add(
                                                             -2-parseInt(this.map.layerContainerDiv.style.left),
                                                             2-parseInt(this.map.layerContainerDiv.style.top)),
                                                           null,
                                                           null,
                                                           "absolute");
                      
                      this.measureBoxDistance.innerHTML = distance;
                      this.measureBoxDistance.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
                      this.map.layerContainerDiv.appendChild(this.measureBoxDistance);
                      this.measureDivs.push(this.measureBoxDistance);
                  }
                  this.measureBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
                  this.map.layerContainerDiv.appendChild(this.measureBox);
                  this.measureDivs.push(this.measureBox);
                  break;
              default:
                  this.map.div.style.cursor = "move";
                  break;
          }
          document.onselectstart = function() { return false; } 
          Event.stop(evt);
      },
  
      switchModeTo: function(mode) {
          if (mode != this.mode) {
              if (this.mode && this.buttons[this.mode]) {
                  OpenLayers.Util.modifyAlphaImageDiv(this.buttons[this.mode], null, null, null, this.buttons[this.mode].imgLocation);
              }
              if (this.mode == "measure" && mode != "measure") {
                  for(var i = 0; i < this.measureDivs.length; i++) {
                      if (this.measureDivs[i]) { 
                          this.map.layerContainerDiv.removeChild(this.measureDivs[i]);
                      }
                  }
                  this.measureDivs = [];
                  this.measureStart = null;
              }
              this.mode = mode;
              if (this.buttons[mode]) {
                  OpenLayers.Util.modifyAlphaImageDiv(this.buttons[mode], null, null, null, this.buttons[mode].activeImgLocation);
              }
          } 
      }, 
  
      leaveMode: function() {
          this.switchModeTo("pan");
      },
      
      /**
      * @param {Event} evt
      */
      defaultMouseMove: function (evt) {
          if (this.mouseDragStart != null) {
              switch (this.mode) {
                  case "zoombox": 
                      var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x);
                      var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y);
                      this.zoomBox.style.width = Math.max(1, deltaX) + "px";
                      this.zoomBox.style.height = Math.max(1, deltaY) + "px";
                      if (evt.xy.x < this.mouseDragStart.x) {
                          this.zoomBox.style.left = evt.xy.x+"px";
                      }
                      if (evt.xy.y < this.mouseDragStart.y) {
                          this.zoomBox.style.top = evt.xy.y+"px";
                      }
                      break;
                  default:
                      var deltaX = this.mouseDragStart.x - evt.xy.x;
                      var deltaY = this.mouseDragStart.y - evt.xy.y;
                      var size = this.map.getSize();
                      var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX,
                                                       size.h / 2 + deltaY);
                      var newCenter = this.map.getLonLatFromViewPortPx( newXY ); 
                      this.map.setCenter(newCenter, null, true);
                      this.mouseDragStart = evt.xy.clone();
              }
              this.performedDrag = true;
          }
      },
  
      /**
      * @param {Event} evt
      */
      defaultMouseUp: function (evt) {
          if (!Event.isLeftClick(evt)) return;
          switch (this.mode) {
              case "zoombox":
                  this.zoomBoxEnd(evt);
                  if (this.startViaKeyboard) this.leaveMode();
                  break;
              case "pan":
                  if (this.performedDrag) {
                      this.map.setCenter(this.map.center);
                  }        
          }
          document.onselectstart = null;
          this.mouseDragStart = null;
          this.map.div.style.cursor = "default";
      },
  
      defaultMouseOut: function (evt) {
          if (this.mouseDragStart != null
              && OpenLayers.Util.mouseLeft(evt, this.map.div)) {
                  this.defaultMouseUp(evt);
          }
      },
      defaultClick: function (evt) {
          if (this.performedDrag)  {
              this.performedDrag = false;
              return false;
          }
      }
  }));
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/PanZoom.js
  
  Index: PanZoom.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Control.js
   */
  OpenLayers.Control.PanZoom = Class.create();
  OpenLayers.Control.PanZoom.X = 4;
  OpenLayers.Control.PanZoom.Y = 4;
  OpenLayers.Control.PanZoom.prototype = 
    Object.extend( new OpenLayers.Control(), {
  
      /** @type int */
      slideFactor: 50,
  
      /** @type Array of Button Divs */
      buttons: null,
  
      /** @type OpenLayers.Pixel */
      position: null,
  
      /**
       * @constructor
       */
      initialize: function() {
          OpenLayers.Control.prototype.initialize.apply(this, arguments);
          this.position = new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,
                                               OpenLayers.Control.PanZoom.Y);
      },
  
      /**
      * @param {OpenLayers.Pixel} px
      * 
      * @returns A reference to the container div for the PanZoom control
      * @type DOMElement
      */
      draw: function(px) {
          // initialize our internal div
          OpenLayers.Control.prototype.draw.apply(this, arguments);
          px = this.position;
  
          // place the controls
          this.buttons = new Array();
  
          var sz = new OpenLayers.Size(18,18);
          var centered = new OpenLayers.Pixel(px.x+sz.w/2, px.y);
  
          this._addButton("panup", "north-mini.png", centered, sz);
          px.y = centered.y+sz.h;
          this._addButton("panleft", "west-mini.png", px, sz);
          this._addButton("panright", "east-mini.png", px.add(sz.w, 0), sz);
          this._addButton("pandown", "south-mini.png", 
                          centered.add(0, sz.h*2), sz);
          this._addButton("zoomin", "zoom-plus-mini.png", 
                          centered.add(0, sz.h*3+5), sz);
          this._addButton("zoomworld", "zoom-world-mini.png", 
                          centered.add(0, sz.h*4+5), sz);
          this._addButton("zoomout", "zoom-minus-mini.png", 
                          centered.add(0, sz.h*5+5), sz);
          return this.div;
      },
      
      /**
       * @param {String} id
       * @param {String} img
       * @param {OpenLayers.Pixel} xy
       * @param {OpenLayers.Size} sz
       * 
       * @returns A Div (an alphaImageDiv, to be precise) that contains the 
       *          image of the button, and has all the proper event handlers
       *          set.
       * @type DOMElement
       */
      _addButton:function(id, img, xy, sz) {
          var imgLocation = OpenLayers.Util.getImagesLocation() + img;
          // var btn = new ol.AlphaImage("_"+id, imgLocation, xy, sz);
          var btn = OpenLayers.Util.createAlphaImageDiv(
                                      "OpenLayers_Control_PanZoom_" + id, 
                                      xy, sz, imgLocation, "absolute");
  
          //we want to add the outer div
          this.div.appendChild(btn);
  
          btn.onmousedown = this.buttonDown.bindAsEventListener(btn);
          btn.ondblclick  = this.doubleClick.bindAsEventListener(btn);
          btn.onclick  = this.doubleClick.bindAsEventListener(btn);
          btn.action = id;
          btn.map = this.map;
          btn.slideFactor = this.slideFactor;
  
          //we want to remember/reference the outer div
          this.buttons.push(btn);
          return btn;
      },
      
      /**
       * @param {Event} evt
       * 
       * @type Boolean
       */
      doubleClick: function (evt) {
          Event.stop(evt);
          return false;
      },
      
      /**
       * @param {Event} evt
       */
      buttonDown: function (evt) {
          if (!Event.isLeftClick(evt)) return;
  
          switch (this.action) {
              case "panup": 
                  this.map.pan(0, -50);
                  break;
              case "pandown": 
                  this.map.pan(0, 50);
                  break;
              case "panleft": 
                  this.map.pan(-50, 0);
                  break;
              case "panright": 
                  this.map.pan(50, 0);
                  break;
              case "zoomin": 
                  this.map.zoomIn(); 
                  break;
              case "zoomout": 
                  this.map.zoomOut(); 
                  break;
              case "zoomworld": 
                  this.map.zoomToMaxExtent(); 
                  break;
          }
  
          Event.stop(evt);
      },
  
      /**
       * 
       */
      destroy: function() {
          OpenLayers.Control.prototype.destroy.apply(this, arguments);
          for(i=0; i<this.buttons.length; i++) {
              this.buttons[i].map = null;
          }
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Control.PanZoom"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/PanZoomBar.js
  
  Index: PanZoomBar.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class 
   * 
   * @requires OpenLayers/Control/PanZoom.js
   */
  OpenLayers.Control.PanZoomBar = Class.create();
  OpenLayers.Control.PanZoomBar.X = 4;
  OpenLayers.Control.PanZoomBar.Y = 4;
  OpenLayers.Control.PanZoomBar.prototype = 
    Object.extend( new OpenLayers.Control.PanZoom(), {
      /** @type Array(...) */
      buttons: null,
  
      /** @type int */
      zoomStopWidth: 18,
  
      /** @type int */
      zoomStopHeight: 11,
  
      initialize: function() {
          OpenLayers.Control.PanZoom.prototype.initialize.apply(this, arguments);
          this.position = new OpenLayers.Pixel(OpenLayers.Control.PanZoomBar.X,
                                               OpenLayers.Control.PanZoomBar.Y);
      },
  
      /**
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          OpenLayers.Control.PanZoom.prototype.setMap.apply(this, arguments);
          this.map.events.register("changebaselayer", this, this.redraw);
      },
  
      /** clear the div and start over.
       * 
       */
      redraw: function() {
          if (this.div != null) {
              this.div.innerHTML = "";
          }  
          this.draw();
      },
      
      /**
      * @param {OpenLayers.Pixel} px
      */
      draw: function(px) {
          // initialize our internal div
          OpenLayers.Control.prototype.draw.apply(this, arguments);
          px = this.position.clone();
  
          // place the controls
          this.buttons = new Array();
  
          var sz = new OpenLayers.Size(18,18);
          var centered = new OpenLayers.Pixel(px.x+sz.w/2, px.y);
  
          this._addButton("panup", "north-mini.png", centered, sz);
          px.y = centered.y+sz.h;
          this._addButton("panleft", "west-mini.png", px, sz);
          this._addButton("panright", "east-mini.png", px.add(sz.w, 0), sz);
          this._addButton("pandown", "south-mini.png", centered.add(0, sz.h*2), sz);
          this._addButton("zoomin", "zoom-plus-mini.png", centered.add(0, sz.h*3+5), sz);
          centered = this._addZoomBar(centered.add(0, sz.h*4 + 5));
          this._addButton("zoomout", "zoom-minus-mini.png", centered, sz);
          return this.div;
      },
  
      /** 
      * @param {OpenLayers.Pixel} location where zoombar drawing is to start.
      */
      _addZoomBar:function(centered) {
          var imgLocation = OpenLayers.Util.getImagesLocation();
          
          var id = "OpenLayers_Control_PanZoomBar_Slider" + this.map.id;
          var zoomsToEnd = this.map.getNumZoomLevels() - 1 - this.map.getZoom();
          var slider = OpenLayers.Util.createAlphaImageDiv(id,
                         centered.add(-1, zoomsToEnd * this.zoomStopHeight), 
                         new OpenLayers.Size(20,9), 
                         imgLocation+"slider.png",
                         "absolute");
          this.slider = slider;
          
          this.sliderEvents = new OpenLayers.Events(this, slider);
          this.sliderEvents.register("mousedown", this, this.zoomBarDown);
          this.sliderEvents.register("mousemove", this, this.zoomBarDrag);
          this.sliderEvents.register("mouseup", this, this.zoomBarUp);
          this.sliderEvents.register("dblclick", this, this.doubleClick);
          this.sliderEvents.register("click", this, this.doubleClick);
          
          sz = new OpenLayers.Size();
          sz.h = this.zoomStopHeight * this.map.getNumZoomLevels();
          sz.w = this.zoomStopWidth;
          var div = null
          
          if (OpenLayers.Util.alphaHack()) {
              var id = "OpenLayers_Control_PanZoomBar" + this.map.id;
              div = OpenLayers.Util.createAlphaImageDiv(id, centered,
                                        new OpenLayers.Size(sz.w, 
                                                this.zoomStopHeight),
                                        imgLocation + "zoombar.png", 
                                        "absolute", null, "crop");
              div.style.height = sz.h;
          } else {
              div = OpenLayers.Util.createDiv(
                          'OpenLayers_Control_PanZoomBar_Zoombar' + this.map.id,
                          centered,
                          sz,
                          imgLocation+"zoombar.png");
          }
          
          this.zoombarDiv = div;
          
          this.divEvents = new OpenLayers.Events(this, div);
          this.divEvents.register("mousedown", this, this.divClick);
          this.divEvents.register("mousemove", this, this.passEventToSlider);
          this.divEvents.register("dblclick", this, this.doubleClick);
          this.divEvents.register("click", this, this.doubleClick);
          
          this.div.appendChild(div);
  
          this.startTop = parseInt(div.style.top);
          this.div.appendChild(slider);
  
          this.map.events.register("zoomend", this, this.moveZoomBar);
  
          centered = centered.add(0, 
              this.zoomStopHeight * this.map.getNumZoomLevels());
          return centered; 
      },
      /* 
       * @param evt
       * This function is used to pass events that happen on the div, or the map,
       * through to the slider, which then does its moving thing.
       */
      passEventToSlider:function(evt) {
          this.sliderEvents.handleBrowserEvent(evt);
      },
      
      /*
       * divClick: Picks up on clicks directly on the zoombar div
       *           and sets the zoom level appropriately.
       */
      divClick: function (evt) {
          if (!Event.isLeftClick(evt)) return;
          var y = evt.xy.y;
          var top = Position.page(evt.object)[1];
          var levels = Math.floor((y - top)/this.zoomStopHeight);
          this.map.zoomTo((this.map.getNumZoomLevels() -1) -  levels);
          Event.stop(evt);
      },
      
      /* 
       * @param evt
       * event listener for clicks on the slider
       */
      zoomBarDown:function(evt) {
          if (!Event.isLeftClick(evt)) return;
          this.map.events.register("mousemove", this, this.passEventToSlider);
          this.map.events.register("mouseup", this, this.passEventToSlider);
          this.mouseDragStart = evt.xy.clone();
          this.zoomStart = evt.xy.clone();
          this.div.style.cursor = "move";
          Event.stop(evt);
      },
      
      /*
       * @param evt
       * This is what happens when a click has occurred, and the client is dragging.
       * Here we must ensure that the slider doesn't go beyond the bottom/top of the 
       * zoombar div, as well as moving the slider to its new visual location
       */
      zoomBarDrag:function(evt) {
          if (this.mouseDragStart != null) {
              var deltaY = this.mouseDragStart.y - evt.xy.y
              var offsets = Position.page(this.zoombarDiv);
              if ((evt.clientY - offsets[1]) > 0 && 
                  (evt.clientY - offsets[1]) < parseInt(this.zoombarDiv.style.height) - 2) {
                  var newTop = parseInt(this.slider.style.top) - deltaY;
                  this.slider.style.top = newTop+"px";
              }
              this.mouseDragStart = evt.xy.clone();
              Event.stop(evt);
          }
      },
      
      /* 
       * @param evt
       * Perform cleanup when a mouseup event is received -- discover new zoom level
       * and switch to it.
       */
      zoomBarUp:function(evt) {
          if (!Event.isLeftClick(evt)) return;
          if (this.zoomStart) {
              this.div.style.cursor="default";
              this.map.events.unregister("mouseup", this, this.passEventToSlider);
              this.map.events.unregister("mousemove", this, this.passEventToSlider);
              var deltaY = this.zoomStart.y - evt.xy.y
              this.map.zoomTo(this.map.zoom + Math.round(deltaY/this.zoomStopHeight));
              this.moveZoomBar();
              this.mouseDragStart = null;
              Event.stop(evt);
          }
      },
      
      /* 
      * Change the location of the slider to match the current zoom level.
      */
      moveZoomBar:function() {
          var newTop = 
              ((this.map.getNumZoomLevels()-1) - this.map.getZoom()) * 
              this.zoomStopHeight + this.startTop + 1;
          this.slider.style.top = newTop + "px";
      },    
      
      CLASS_NAME: "OpenLayers.Control.PanZoomBar"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/Permalink.js
  
  Index: Permalink.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Control.js
   */
  OpenLayers.Control.Permalink = Class.create();
  OpenLayers.Control.Permalink.prototype = 
    Object.extend( new OpenLayers.Control(), {
  
      /** @type DOMElement */
      element: null,
      
      /** @type String */
      base: '',
      
      /**
       * @constructor
       * 
       * @param {DOMElement} element
       * @param {String} base
       */
      initialize: function(element, base) {
          OpenLayers.Control.prototype.initialize.apply(this, arguments);
          this.element = element;        
          if (base) this.base = base;
      },
  
      /**
       * @type DOMElement
       */    
      draw: function() {
          OpenLayers.Control.prototype.draw.apply(this, arguments);
          var args = OpenLayers.Util.getArgs();
          if (args.lat && args.lon) {
              this.map.setCenter(
                 new OpenLayers.LonLat(parseFloat(args.lon), parseFloat(args.lat))
              );
          }
          if (args.zoom) {
              this.map.zoomTo(parseInt(args.zoom));
          }
          if (!this.element) {
              this.element = document.createElement("a");
              this.div.style.right = "3px";
              this.div.style.bottom = "3px";
              this.div.style.left = "";
              this.div.style.top = "";
              this.div.style.display = "block";
              this.div.style.position = "absolute";
              this.element.style.fontSize="smaller";
              this.element.innerHTML = "Permalink";
              this.element.href="";
              this.div.appendChild(this.element);
          }
          this.map.events.register( 'moveend', this, this.updateLink);
          return this.div;
      },
     
      /**
       * 
       */
      updateLink: function() {
          var center = this.map.getCenter();
          var zoom = this.map.getZoom(); 
          var lat = Math.round(center.lat*100000)/100000;
          var lon = Math.round(center.lon*100000)/100000;
          this.element.href = this.base+"?lat="+lat+"&lon="+lon+"&zoom="+zoom; 
      }, 
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Control.Permalink"
  });
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Control/Scale.js
  
  Index: Scale.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Control.js
   */
  OpenLayers.Control.Scale = Class.create();
  OpenLayers.Control.Scale.prototype = 
    Object.extend( new OpenLayers.Control(), {
      /** @type DOMElement */
      element: null,
      
      /**
       * @constructor
       * 
       * @param {DOMElement} element
       * @param {String} base
       */
      initialize: function(element) {
          OpenLayers.Control.prototype.initialize.apply(this, arguments);
          this.element = element;        
      },
  
      /**
       * @type DOMElement
       */    
      draw: function() {
          OpenLayers.Control.prototype.draw.apply(this, arguments);
          if (!this.element) {
              this.element = document.createElement("div");
              this.div.style.right = "3px";
              this.div.style.bottom = "2em";
              this.div.style.left = "";
              this.div.style.top = "";
              this.div.style.display = "block";
              this.div.style.position = "absolute";
              this.element.style.fontSize="smaller";
              this.div.appendChild(this.element);
          }
          this.map.events.register( 'moveend', this, this.updateScale);
          this.updateScale();
          return this.div;
      },
     
      /**
       * 
       */
      updateScale: function() {
          var scale = this.map.getScale();
          if (!scale) return;
  
          if (scale >= 9500 && scale <= 950000) {
              scale = Math.round(scale / 1000) + "K";
          } else if (scale >= 950000) {
              scale = Math.round(scale / 1000000) + "M";
          } else {
              scale = Math.round(scale / 100) * 100;
          }
          this.element.innerHTML = "Scale = 1 : " + scale;
      }, 
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Control.Scale"
  });
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Feature/WFS.js
  
  Index: WFS.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Feature.js
   */
  OpenLayers.Feature.WFS = Class.create();
  OpenLayers.Feature.WFS.prototype = 
    Object.extend( new OpenLayers.Feature(), {
        
      /** 
       * @constructor
       * 
       * @param {OpenLayers.Layer} layer
       * @param {XMLNode} xmlNode
       */
      initialize: function(layer, xmlNode) {
          var newArguments = arguments;
          if (arguments.length > 0) {
              var data = this.processXMLNode(xmlNode);
              newArguments = new Array(layer, data.lonlat, data)
          }
          OpenLayers.Feature.prototype.initialize.apply(this, newArguments);
          
          if (arguments.length > 0) {
              this.createMarker();
              this.layer.addMarker(this.marker);
          }
      },
      
      destroy: function() {
          if (this.marker != null) {
              this.layer.removeMarker(this.marker);  
          }
          OpenLayers.Feature.prototype.destroy.apply(this, arguments);
      },
  
      /**
       * @param {XMLNode} xmlNode
       * 
       * @returns Data Object with 'id', 'lonlat', and private properties set
       * @type Object
       */
      processXMLNode: function(xmlNode) {
          //this should be overridden by subclasses
          // must return an Object with 'id' and 'lonlat' values set
          var point = xmlNode.getElementsByTagName("Point");
          var text  = OpenLayers.Util.getXmlNodeValue(point[0].getElementsByTagName("coordinates")[0]);
          var floats = text.split(",");
          return {lonlat: new OpenLayers.LonLat(parseFloat(floats[0]),
                                                parseFloat(floats[1])),
                  id: null};
  
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Feature.WFS"
  });
    
    
    
    
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/Boxes.js
  
  Index: Boxes.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer.js
   * @requires OpenLayers/Layer/Markers.js
   */
  OpenLayers.Layer.Boxes = Class.create();
  OpenLayers.Layer.Boxes.prototype = 
      Object.extend( new OpenLayers.Layer.Markers(), {
  
      initialize: function () {
          OpenLayers.Layer.Markers.prototype.initialize.apply(this, arguments);
      },
      
      /** Calculate the pixel location for the marker, create it, and
      *    add it to the layer's div
      *
      * @private
      *
      * @param {OpenLayers.Marker.Box} marker
      */
      drawMarker: function(marker) {
          var bounds   = marker.bounds;
          var topleft  = this.map.getLayerPxFromLonLat(
                              new OpenLayers.LonLat(bounds.left,  bounds.top));
          var botright = this.map.getLayerPxFromLonLat(
                               new OpenLayers.LonLat(bounds.right, bounds.bottom));
          if (botright == null || topleft == null) {
              marker.display(false);
          } else {
              var sz = new OpenLayers.Size(
                  botright.x - topleft.x, botright.y - topleft.y);
              var markerDiv = marker.draw(topleft, sz);
              if (!marker.drawn) {
                  this.div.appendChild(markerDiv);
                  marker.drawn = true;
              }
          }
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.Boxes"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/EventPane.js
  
  Index: EventPane.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer.js
   * @requires OpenLayers/Util.js
   */
  OpenLayers.Layer.EventPane = Class.create();
  OpenLayers.Layer.EventPane.prototype = 
    Object.extend(new OpenLayers.Layer, {
  
      /** EventPaned layers are always base layers, by necessity.
       * 
       * @type Boolean */
      isBaseLayer: true,
  
      /** EventPaned layers are fixed by default.
       * 
       * @type Boolean */
      isFixed: true,
  
      /** @type DOMElement */
      pane: null,
  
      /**
       * @constructor
       * 
       * @param {String} name
       * @param {Object} options Hashtable of extra options to tag onto the layer
       */
      initialize: function(name, options) {
          OpenLayers.Layer.prototype.initialize.apply(this, arguments);
  
          if (arguments.length > 0) {
              if (this.pane == null) {
                  this.pane = OpenLayers.Util.createDiv();
              }
          }
      },
      
      /** Set the map property for the layer. This is done through an accessor
       *   so that subclasses can override this and take special action once 
       *   they have their map variable set. 
       * 
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          OpenLayers.Layer.prototype.setMap.apply(this, arguments);
          
          this.pane.style.zIndex = parseInt(this.div.style.zIndex) + 1;
          this.pane.style.display = this.div.style.display;
          this.pane.style.width="100%";
          this.pane.style.height="100%";
          if (/MSIE/.test(navigator.userAgent)) {
            this.pane.style.background = "url("+OpenLayers.Util.getImagesLocation()+"blank.gif)";
          }
  
          if (this.isFixed) {
              this.map.viewPortDiv.appendChild(this.pane);
          } else {
              this.map.layerContainerDiv.appendChild(this.pane);
          }
      },
    
      /** 
       * @param {Boolean} visible
       * @param {Boolean} noEvent
       */
      setVisibility: function(visible, noEvent) {
          OpenLayers.Layer.prototype.setVisibility.apply(this, arguments);
  
          this.pane.style.display = this.div.style.display;
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.EventPane"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/GeoRSS.js
  
  Index: GeoRSS.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/Markers.js
   */
  OpenLayers.Layer.GeoRSS = Class.create();
  OpenLayers.Layer.GeoRSS.prototype = 
    Object.extend( new OpenLayers.Layer.Markers(), {
  
      /** store url of text file
      * @type str */
      location:null,
  
      /** @type Array(OpenLayers.Feature) */
      features: null,
  
      /** @type OpenLayers.Feature */
      selectedFeature: null,
  
      /**
      * @constructor
      *
      * @param {String} name
      * @param {String} location
      */
      initialize: function(name, location) {
          OpenLayers.Layer.Markers.prototype.initialize.apply(this, [name]);
          this.location = location;
          this.features = new Array();
          OpenLayers.loadURL(location, null, this, this.parseData);
      },
  
      /**
       * 
       */
      destroy: function() {
          this.clearFeatures();
          this.features = null;
          OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
      },
          
      /**
       * @param {?} ajaxRequest
       */
      parseData: function(ajaxRequest) {
          var doc = ajaxRequest.responseXML;
          if (!doc || ajaxRequest.fileType!="XML") {
              doc = OpenLayers.parseXMLString(ajaxRequest.responseText);
          }
          this.name = doc.getElementsByTagName("title")[0].firstChild.nodeValue;    
          var itemlist = doc.getElementsByTagName('item');
          for (var i = 0; i < itemlist.length; i++) {
              var data = {};
              var point = OpenLayers.Util.getNodes(itemlist[i], 'georss:point');
              var lat = OpenLayers.Util.getNodes(itemlist[i], 'geo:lat');
              var lon = OpenLayers.Util.getNodes(itemlist[i], 'geo:long');
              if (point.length > 0) {
                  var location = point[0].firstChild.nodeValue.split(" ");
                  
                  if (location.length !=2) {
                      var location = point[0].firstChild.nodeValue.split(",");
                  }
              } else if (lat.length > 0 && lon.length > 0) {
                  var location = [parseFloat(lat[0].firstChild.nodeValue), parseFloat(lon[0].firstChild.nodeValue)];
              } else {
                  continue;
              }
              location = new OpenLayers.LonLat(parseFloat(location[1]), parseFloat(location[0]));
              var title = OpenLayers.Util.getNodes(itemlist[i], "title")[0].firstChild.nodeValue;
              var description = OpenLayers.Util.getNodes(itemlist[i], "description")[0].firstChild.nodeValue;
              try { var link = OpenLayers.Util.getNodes(itemlist[i], "link")[0].firstChild.nodeValue; } catch (e) { } 
              data.icon = OpenLayers.Marker.defaultIcon();
              data.popupSize = new OpenLayers.Size(250, 100);
              if ((title != null) && (description != null)) {
                  contentHTML = "<br />";
                  contentHTML += "<div style='margin: -0.5em 0.5em 0.5em 0.5em'>" 
                  
                  contentHTML += "<div style='height: 1.3em; overflow: hidden'>";
                  contentHTML += "<span style='font-size: 1.2em; font-weight: bold'>"; 
                  if (link)  contentHTML += "<a href='"+link+"' target='_blank'>"; 
                  contentHTML +=     title;
                  if (link) contentHTML += "</a>";
                  contentHTML += "</span>";
                  contentHTML += "</div>";
  
  
                  contentHTML += "<span style='font-size: 0.7em; align:center'>";
                  contentHTML += description;
                  contentHTML += "</span>";
  
                  contentHTML += "</div>"
                  data['popupContentHTML'] = contentHTML;
                  
                  //data['popupContentHTML'] = '<h2>'+title+'</h2><p>'+description+'</p>';
              }
              var feature = new OpenLayers.Feature(this, location, data);
              this.features.push(feature);
              var marker = feature.createMarker();
              marker.events.register('click', feature, this.markerClick);
              this.addMarker(marker);
          }
      },
      
      /**
       * @param {Event} evt
       */
      markerClick: function(evt) {
          sameMarkerClicked = (this == this.layer.selectedFeature);
          this.layer.selectedFeature = (!sameMarkerClicked) ? this : null;
          for(var i=0; i < this.layer.map.popups.length; i++) {
              this.layer.map.removePopup(this.layer.map.popups[i]);
          }
          if (!sameMarkerClicked) {
              var popup = this.createPopup();
              Event.observe(popup.div, "click",
              function() { 
                for(var i=0; i < this.layer.map.popups.length; i++) { 
                  this.layer.map.removePopup(this.layer.map.popups[i]); 
                } 
              }.bindAsEventListener(this));
              this.layer.map.addPopup(popup); 
          }
          Event.stop(evt);
      },
  
      /**
       * 
       */
      clearFeatures: function() {
          if (this.features != null) {
              while(this.features.length > 0) {
                  var feature = this.features[0];
                  this.features.remove(feature);
                  feature.destroy();
              }
          }        
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.GeoRSS"
  });
       
      
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/Google.js
  
  Index: Google.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  
  
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/EventPane.js
   */
  OpenLayers.Layer.Google = Class.create();
  OpenLayers.Layer.Google.prototype =
      Object.extend( new OpenLayers.Layer.EventPane(), {
      
      /** @type Boolean */
      isFixed: true,
  
      /** @type GMap2 gmap stores the Google Map element */
      gmap:null,
  
      /** @type GMapType */
      type: null,
     
    // OPTIONS
  
      /** @type int */
      minZoomLevel: 0,
      
      /** @type int */
      maxZoomLevel: 16,
  
      
      /** 
       * @constructor
       * 
       * @param {String} name
       */
      initialize: function(name, options) {
          OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
          if (this.maxExtent == null) {
              this.maxExtent = new OpenLayers.Bounds(-180, -90, 180, 90);
          }
          this.addContainerPxFunction();      
          this.numZoomLevels = this.maxZoomLevel - this.minZoomLevel + 1;
      },
      
      /**
       * 
       */
      destroy: function() {
          this.gmap = null;
          OpenLayers.Layer.EventPane.prototype.destroy.apply(this, arguments); 
      },
  
       /** 
       * @param {OpenLayers.Map} map
       */
      setMap:function(map) {
          OpenLayers.Layer.EventPane.prototype.setMap.apply(this, arguments);
  
          // once our layer has been added to the map, we can load it
          this.loadGMap();
      },
      
      /** Assuming we are not dragging (in which case GMaps is moving itself, 
       *   and the dragging flag is set) we need to move the gmap to the 
       *   new center/zoom
       * 
       * @param {OpenLayers.Bounds} bounds
       * @param {Boolean} zoomChanged
       * @param {Boolean} minor
       */
      moveTo:function(bounds, zoomChanged, minor) {
  
          if ((this.gmap != null) && (!this.dragging)) {
  
              var newOLCenter = this.map.getCenter();
              var newOLZoom = this.map.getZoom();
  
              if (newOLCenter != null) {
  
                  var oldGCenter = this.gmap.getCenter();
                  var oldOLCenter = this.getOLLonLatFromGLatLng(oldGCenter);
  
                  var oldGZoom = this.gmap.getZoom();
                  var oldOLZoom = this.getOLZoomFromGZoom(oldGZoom);
                  
                  if ( !(newOLCenter.equals(oldOLCenter)) || 
                       !(newOLZoom == oldOLZoom) ) {
      
                      var newGCenter = this.getGLatLngFromOLLonLat(newOLCenter);
                      var newGZoom = this.getGZoomFromOLZoom(newOLZoom);
  
                      this.gmap.setCenter(newGCenter, newGZoom); 
                                              
                      if (this.type != null) {
                          this.gmap.setMapType(this.type);
                          this.type = null;
                      }
                  }
              }
          }
      },
  
      /** Load the GMap and register appropriate event listeners. If we can't 
       *   load GMap2, then display a warning message.
       * 
       * @private
       * 
       */
      loadGMap:function() {
          
          //has gmaps library has been loaded?
          try {
              // create GMap, hide nav controls
              this.gmap = new GMap2( this.div );
              this.gmap.disableDragging();
              
              // this causes the GMap to set itself to Map's center/zoom
              this.moveTo();
  
          } catch (e) {
              this.loadWarningMessage();
          }
      },
  
      /**
       * @param {Event} evt
       */
      onMapResize: function() {
          this.gmap.checkResize();  
      },
  
      /** If we can't load the GMap, then display an error message to the 
       *   user and tell them where to go for help.
       * 
       * @private
       * 
       */
      loadWarningMessage:function() {
  
          this.div.style.backgroundColor = "darkblue";
  
          var html = "";
          html += "The Google Layer was unable to load correctly.<br>";
          html += "<br>";
          html += "To get rid of this message, click on the Google Layer's "
          html += "tab in the layer switcher in the upper-right corner.<br>";
          html += "<br>";
          html += "Most likely, this is because the Google Maps library";
          html += " script was either not included, or does not contain the";
          html += " correct API key for your site.<br>";
          html += "<br>";
          html += "Developers: For help getting this working correctly, ";
          html += "<a href='http://trac.openlayers.org/wiki/GoogleMapsLayer' "
          html +=  "target='_blank'>";
          html +=     "click here";
          html += "</a>";
          
          var viewSize = this.map.getSize();
          
          msgW = Math.min(viewSize.w, 300);
          msgH = Math.min(viewSize.h, 200);
          var size = new OpenLayers.Size(msgW, msgH);
  
          var centerPx = new OpenLayers.Pixel(viewSize.w/2, viewSize.h/2);
  
          var topLeft = centerPx.add(-size.w/2, -size.h/2);            
  
          var div = OpenLayers.Util.createDiv("gmapsWarning", 
                                              topLeft, 
                                              size,
                                              null,
                                              null,
                                              null,
                                              "auto");
  
          div.style.padding = "7px";
          div.style.backgroundColor = "yellow";
  
          div.innerHTML = html;
          this.div.appendChild(div);
      },
  
  
  
    /********************************************************/
    /*                                                      */
    /*                 Baselayer Functions                  */
    /*                                                      */
    /********************************************************/
  
      /**
       * @param {OpenLayers.Pixel} viewPortPx
       *
       * @returns An OpenLayers.LonLat which is the passed-in view port
       *          OpenLayers.Pixel, translated into lon/lat by GMAPS
       *          If gmap is not loaded or not centered, returns null
       * @type OpenLayers.LonLat
       */
      getLonLatFromViewPortPx: function (viewPortPx) {
          var lonlat = null;
          if ((this.gmap != null) && (this.gmap.getCenter() != null)) {
              var gPoint = this.getGPointFromOLPixel(viewPortPx);
              var gLatLng = this.gmap.fromContainerPixelToLatLng(gPoint)
              lonlat = this.getOLLonLatFromGLatLng(gLatLng);
          }
          return lonlat;
      },
  
   
      /**
       * @param {OpenLayers.LonLat} lonlat
       *
       * @returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, 
       *          translated into view port pixels BY GMAPS
       *          If gmap is not loaded or not centered, returns null
       * @type OpenLayers.Pixel
       */
      getViewPortPxFromLonLat: function (lonlat) {
          var viewPortPx = null;
          if ((this.gmap != null) && (this.gmap.getCenter() != null)) {
              var gLatLng = this.getGLatLngFromOLLonLat(lonlat);
          
              // note we use special hacked function here
              var gPoint = this.gmap.fromLatLngToContainerPixel(gLatLng);
          
              viewPortPx = this.getOLPixelFromGPoint(gPoint);
          }
          return viewPortPx;
      },
  
  
      /**
       * @param {OpenLayers.Bounds} bounds
       *
       * @returns Corresponding zoom level for a specified Bounds. 
       *          If gmap is not loaded or not centered, returns null
       * @type int
       */
      getZoomForExtent: function (bounds) {
          var zoom = null;
          if ((this.gmap != null) && (this.gmap.getCenter() != null)) {
              var gBounds = this.getGLatLngBoundsFromOLBounds(bounds);
              var gZoom = this.gmap.getBoundsZoomLevel(gBounds);
  
              //make sure zoom is within bounds    
              var gZoom = Math.min(Math.max(gZoom, this.minZoomLevel), 
                                   this.maxZoomLevel);
           
  
              zoom = this.getOLZoomFromGZoom(gZoom);
          }
          return zoom;
      },
      
    /********************************************************/
    /*                                                      */
    /*             Translation Functions                    */
    /*                                                      */
    /*    The following functions translate GMaps and OL    */ 
    /*     formats for Pixel, LonLat, Bounds, and Zoom      */
    /*                                                      */
    /********************************************************/
  
    //
    // TRANSLATION: GZoom <-> OpenLayers Zoom
    //
    
      /**
       * @param {int} gZoom
       * 
       * @returns An OpenLayers Zoom level, translated from the passed in gZoom
       *          Returns null if null value is passed in
       * @type int
       */
      getOLZoomFromGZoom: function(gZoom) {
          var zoom = null;
          if (gZoom != null) {
              zoom = gZoom - this.minZoomLevel;
          }
          return zoom;
      },
      
      /**
       * @param {int} olZoom
       * 
       * @returns A GZoom level, translated from the passed in olZoom
       *          Returns null if null value is passed in
       * @type int
       */
      getGZoomFromOLZoom: function(olZoom) {
          var zoom = null; 
          if (olZoom != null) {
              zoom = olZoom + this.minZoomLevel;
          }
          return zoom;
      },
  
    //
    // TRANSLATION: GLatLng <-> LonLat
    //
  
      /**
       * @param {GLatLng} gLatLng
       * 
       * @returns An OpenLayers.LonLat, translated from the passed in GLatLng
       *          Returns null if null value is passed in
       * @type OpenLayers.LonLat
       */
      getOLLonLatFromGLatLng: function(gLatLng) {
          var olLonLat = null;
          if (gLatLng != null) {
              olLonLat = new OpenLayers.LonLat(gLatLng.lng(), gLatLng.lat());
          }
          return olLonLat;
      },
  
      /**
       * @param {OpenLayers.LonLat} olLonLat
       * 
       * @returns A GLatLng, translated from the passed in OpenLayers.LonLat
       *          Returns null if null value is passed in
       * @type GLatLng
       */
      getGLatLngFromOLLonLat: function(olLonLat) {
          var gLatLng = null;
          if (olLonLat != null) {
              gLatLng = new GLatLng(olLonLat.lat, olLonLat.lon);
          }
          return gLatLng;
      },
  
  
    //
    // TRANSLATION: GPoint <-> OpenLayers.Pixel
    //
  
      /**
       * @param {GPoint} gPoint
       * 
       * @returns An OpenLayers.Pixel, translated from the passed in GPoint
       *          Returns null if null value is passed in
       * @type OpenLayers.Pixel
       */
      getOLPixelFromGPoint: function(gPoint) {
          var olPixel = null;
          if (gPoint != null) {
              olPixel = new OpenLayers.Pixel(gPoint.x, gPoint.y);
          }
          return olPixel;
      },
  
      /**
       * @param {OpenLayers.Pixel} olPixel
       * 
       * @returns A GPoint, translated from the passed in OpenLayers.Pixel
       *          Returns null if null value is passed in
       * @type GPoint
       */
      getGPointFromOLPixel: function(olPixel) {
          var gPoint = null;
          if (olPixel != null) {
              gPoint = new GPoint(olPixel.x, olPixel.y);
          }
          return gPoint;
      },
  
    //
    // TRANSLATION: GLatLngBounds <-> OpenLayers.Bounds
    //
  
      /**
       * @param {GLatLngBounds} gLatLngBounds
       * 
       * @returns An OpenLayers.Bounds, translated from gLatLngBounds
       *          Returns null if null value is passed in
       * @type OpenLayers.Bounds
       */
      getOLBoundsFromGLatLngBounds: function(gLatLngBounds) {
          var olBounds = null;
          if (gLatLngBounds != null) {
              var sw = gLatLngBounds.getSouthWest();
              var ne = gLatLngBounds.getNorthEast();
              olBounds = new OpenLayers.Bounds(sw.lng(), 
                                               sw.lat(), 
                                               ne.lng(), 
                                               ne.lat() );
          }
          return olBounds;
      },
  
      /**
       * @param {OpenLayers.Bounds} olBounds
       * 
       * @returns A GLatLngBounds, translated from olBounds
       *          Returns null if null value is passed in
       * @type GLatLngBounds
       */
      getGLatLngBoundsFromOLBounds: function(olBounds) {
          var gLatLngBounds = null;
          if (olBounds != null) {
              var sw = new GLatLng(olBounds.bottom, olBounds.left);
              var ne = new GLatLng(olBounds.top, olBounds.right);
              gLatLngBounds = new GLatLngBounds(sw, ne);
          }
          return gLatLngBounds;
      },
      
      addContainerPxFunction: function() {
        if (typeof GMap2 != "undefined" && !GMap2.fromLatLngToContainerPixel) {
            
            /** Hack-on function because GMAPS does not give it to us
             * 
             * @param {GLatLng} gLatLng 
             *
             * @returns A GPoint specifying gLatLng translated into "Container" coords
             * @type GPoint
             */
            GMap2.prototype.fromLatLngToContainerPixel = function(gLatLng) {
            
                // first we translate into "DivPixel"
                var gPoint = this.fromLatLngToDivPixel(gLatLng);
            
                // locate the sliding "Div" div
                //  it seems like "b" is the main div
                var div = this.b.firstChild.firstChild;
            
                // adjust by the offset of "Div" and voila!
                gPoint.x += div.offsetLeft;
                gPoint.y += div.offsetTop;
            
                return gPoint;
            };
        }
      },
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.Google"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/Grid.js
  
  Index: Grid.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/HTTPRequest.js
   */
  OpenLayers.Layer.Grid = Class.create();
  OpenLayers.Layer.Grid.prototype = 
    Object.extend( new OpenLayers.Layer.HTTPRequest(), {
      
      /** @type OpenLayers.Size */
      tileSize: null,
      
      /** this is an array of rows, each row is an array of tiles
       * 
       * @type Array(Array) */
      grid: null,
  
      /** @type Integer */
      buffer: 2,
  
      /**
       * @constructor
       * 
       * @param {String} name
       * @param {String} url
       * @param {Object} params
       * @param {Object} options Hashtable of extra options to tag onto the layer
      */
      initialize: function(name, url, params, options) {
          OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this, 
                                                                  arguments);
          this.grid = new Array();
      },
  
      /** on destroy, clear the grid.
       *
       */
      destroy: function() {
          this.clearGrid();
          this.grid = null;
          this.tileSize = null;
          OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments); 
      },
  
      /**
       * @param {Object} obj
       * 
       * @returns An exact clone of this OpenLayers.Layer.Grid
       * @type OpenLayers.Layer.Grid
       */
      clone: function (obj) {
          
          if (obj == null) {
              obj = new OpenLayers.Layer.Grid(this.name,
                                              this.url,
                                              this.params,
                                              this.options);
          }
  
          //get all additions from superclasses
          obj = OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this, [obj]);
  
          // copy/set any non-init, non-simple values here
          if (this.tileSize != null) {
              obj.tileSize = this.tileSize.clone();
          }
          
          // we do not want to copy reference to grid. that should stay at null
          obj.grid = null;
  
          return obj;
      },    
  
      /** When the layer is added to a map, then we can ask the map for
       *   its default tile size
       * 
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          OpenLayers.Layer.HTTPRequest.prototype.setMap.apply(this, arguments);
          if (this.tileSize == null) {
              this.tileSize = this.map.getTileSize();
          }
      },
  
      /** This function is called whenever the map is moved. All the moving
       * of actual 'tiles' is done by the map, but moveTo's role is to accept
       * a bounds and make sure the data that that bounds requires is pre-loaded.
       * 
       * @param {OpenLayers.Bounds} bounds
       * @param {Boolean} zoomChanged
       * @param {Boolean} dragging
       */
      moveTo:function(bounds, zoomChanged, dragging) {
          if (bounds == null) {
              bounds = this.map.getExtent();
          }
          if (bounds != null) {
              if (!this.grid.length || zoomChanged 
                  || !this.getGridBounds().containsBounds(bounds, true)) { 
                  this._initTiles();
              } else {
                  while (true) {
                      var tlLayer = this.grid[0][0].position;
                      var tlViewPort = 
                          this.map.getViewPortPxFromLayerPx(tlLayer);
                      if (tlViewPort.x > -this.tileSize.w * (this.buffer - 1)) {
                          this.shiftColumn(true);
                      } else if (tlViewPort.x < -this.tileSize.w * this.buffer) {
                          this.shiftColumn(false);
                      } else if (tlViewPort.y > -this.tileSize.h * (this.buffer - 1)) {
                          this.shiftRow(true);
                      } else if (tlViewPort.y < -this.tileSize.h * this.buffer) {
                          this.shiftRow(false);
                      } else {
                          break;
                      }
                  }
              }
          }
      },
      
      /**
       * @private
       * 
       * @returns A Bounds object representing the bounds of all the currently 
       *           loaded tiles (including those partially or not at all seen 
       *           onscreen)
       * @type OpenLayers.Bounds
       */
      getGridBounds:function() {
          
          var bottom = this.grid.length - 1;
          var bottomLeftTile = this.grid[bottom][0];
  
          var right = this.grid[0].length - 1; 
          var topRightTile = this.grid[0][right];
  
          return new OpenLayers.Bounds(bottomLeftTile.bounds.left, 
                                       bottomLeftTile.bounds.bottom,
                                       topRightTile.bounds.right, 
                                       topRightTile.bounds.top);
      },
  
      /**
       * @private
       */
      _initTiles:function() {
          var viewSize = this.map.getSize();
          var bounds = this.map.getExtent();
          var extent = this.map.getMaxExtent();
          var resolution = this.map.getResolution();
          var tilelon = resolution * this.tileSize.w;
          var tilelat = resolution * this.tileSize.h;
          
          var offsetlon = bounds.left - extent.left;
          var tilecol = Math.floor(offsetlon/tilelon) - this.buffer;
          var tilecolremain = offsetlon/tilelon - tilecol;
          var tileoffsetx = -tilecolremain * this.tileSize.w;
          var tileoffsetlon = extent.left + tilecol * tilelon;
          
          var offsetlat = bounds.top - (extent.bottom + tilelat);  
          var tilerow = Math.ceil(offsetlat/tilelat) + this.buffer;
          var tilerowremain = tilerow - offsetlat/tilelat;
          var tileoffsety = -tilerowremain * this.tileSize.h;
          var tileoffsetlat = extent.bottom + tilerow * tilelat;
          
          tileoffsetx = Math.round(tileoffsetx); // heaven help us
          tileoffsety = Math.round(tileoffsety);
  
          this.origin = new OpenLayers.Pixel(tileoffsetx, tileoffsety);
  
          var startX = tileoffsetx; 
          var startLon = tileoffsetlon;
  
          var rowidx = 0;
      
          do {
              var row = this.grid[rowidx++];
              if (!row) {
                  row = new Array();
                  this.grid.push(row);
              }
  
              tileoffsetlon = startLon;
              tileoffsetx = startX;
              var colidx = 0;
   
              do {
                  var tileBounds = new OpenLayers.Bounds(tileoffsetlon, 
                                                        tileoffsetlat, 
                                                        tileoffsetlon + tilelon,
                                                        tileoffsetlat + tilelat);
  
                  var x = tileoffsetx;
                  x -= parseInt(this.map.layerContainerDiv.style.left);
  
                  var y = tileoffsety;
                  y -= parseInt(this.map.layerContainerDiv.style.top);
  
                  var px = new OpenLayers.Pixel(x, y);
                  var tile = row[colidx++];
                  if (!tile) {
                      tile = this.addTile(tileBounds, px);
                      row.push(tile);
                  } else {
                      tile.moveTo(tileBounds, px, false);
                  }
       
                  tileoffsetlon += tilelon;       
                  tileoffsetx += this.tileSize.w;
              } while (tileoffsetlon <= bounds.right + tilelon * this.buffer)  
              
              tileoffsetlat -= tilelat;
              tileoffsety += this.tileSize.h;
          } while(tileoffsetlat >= bounds.bottom - tilelat * this.buffer)
  
          //now actually draw the tiles
          this.spiralTileLoad();
      },
      
      /** 
       * @private 
       * 
       *   Starts at the top right corner of the grid and proceeds in a spiral 
       *    towards the center, adding tiles one at a time to the beginning of a 
       *    queue. 
       * 
       *   Once all the grid's tiles have been added to the queue, we go back 
       *    and iterate through the queue (thus reversing the spiral order from 
       *    outside-in to inside-out), calling draw() on each tile. 
       */
      spiralTileLoad: function() {
          var tileQueue = new Array();
   
          var directions = ["right", "down", "left", "up"];
  
          var iRow = 0;
          var iCell = -1;
          var direction = directions.indexOf("right");
          var directionsTried = 0;
          
          while( directionsTried < directions.length) {
  
              var testRow = iRow;
              var testCell = iCell;
  
              switch (directions[direction]) {
                  case "right":
                      testCell++;
                      break;
                  case "down":
                      testRow++;
                      break;
                  case "left":
                      testCell--;
                      break;
                  case "up":
                      testRow--;
                      break;
              } 
      
              // if the test grid coordinates are within the bounds of the 
              //  grid, get a reference to the tile.
              var tile = null;
              if ((testRow < this.grid.length) && 
                  (testCell < this.grid[0].length)) {
                  tile = this.grid[testRow][testCell];
              }
              
              if ((tile != null) && (!tile.queued)) {
                  //add tile to beginning of queue, mark it as queued.
                  tileQueue.unshift(tile);
                  tile.queued = true;
                  
                  //restart the directions counter and take on the new coords
                  directionsTried = 0;
                  iRow = testRow;
                  iCell = testCell;
              } else {
                  //need to try to load a tile in a different direction
                  direction = (direction + 1) % 4;
                  directionsTried++;
              }
          } 
          
          // now we go through and draw the tiles in forward order
          for(var i=0; i < tileQueue.length; i++) {
              var tile = tileQueue[i]
              tile.draw();
              //mark tile as unqueued for the next time (since tiles are reused)
              tile.queued = false;       
          }
      },
  
      /**
       * addTile gives subclasses of Grid the opportunity to create an 
       * OpenLayer.Tile of their choosing. The implementer should initialize 
       * the new tile and take whatever steps necessary to display it.
       *
       * @param {OpenLayers.Bounds} bounds
       *
       * @returns The added OpenLayers.Tile
       * @type OpenLayers.Tile
       */
      addTile:function(bounds, position) {
          // Should be implemented by subclasses
      },
  
      
      /** go through and remove all tiles from the grid, calling
       *    destroy() on each of them to kill circular references
       * 
       * @private
       */
      clearGrid:function() {
          if (this.grid) {
              for(var iRow=0; iRow < this.grid.length; iRow++) {
                  var row = this.grid[iRow];
                  for(var iCol=0; iCol < row.length; iCol++) {
                      row[iCol].clear();
                  }
              }
          }
      },
  
      /**
       * @private 
       * 
       * @param {Boolean} prepend if true, prepend to beginning.
       *                          if false, then append to end
       */
      shiftRow:function(prepend) {
          var modelRowIndex = (prepend) ? 0 : (this.grid.length - 1);
          var modelRow = this.grid[modelRowIndex];
  
          var resolution = this.map.getResolution();
          var deltaY = (prepend) ? -this.tileSize.h : this.tileSize.h;
          var deltaLat = resolution * -deltaY;
  
          var row = (prepend) ? this.grid.pop() : this.grid.shift();
  
          for (var i=0; i < modelRow.length; i++) {
              var modelTile = modelRow[i];
              var bounds = modelTile.bounds.clone();
              var position = modelTile.position.clone();
              bounds.bottom = bounds.bottom + deltaLat;
              bounds.top = bounds.top + deltaLat;
              position.y = position.y + deltaY;
              row[i].moveTo(bounds, position);
          }
  
          if (prepend) {
              this.grid.unshift(row);
          } else {
              this.grid.push(row);
          }
      },
  
      /**
       * @private
       * 
       * @param {Boolean} prepend if true, prepend to beginning.
       *                          if false, then append to end
       */
      shiftColumn: function(prepend) {
          var deltaX = (prepend) ? -this.tileSize.w : this.tileSize.w;
          var resolution = this.map.getResolution();
          var deltaLon = resolution * deltaX;
  
          for (var i=0; i<this.grid.length; i++) {
              var row = this.grid[i];
              var modelTileIndex = (prepend) ? 0 : (row.length - 1);
              var modelTile = row[modelTileIndex];
              
              var bounds = modelTile.bounds.clone();
              var position = modelTile.position.clone();
              bounds.left = bounds.left + deltaLon;
              bounds.right = bounds.right + deltaLon;
              position.x = position.x + deltaX;
  
              var tile = prepend ? this.grid[i].pop() : this.grid[i].shift()
              tile.moveTo(bounds, position);
              if (prepend) {
                  this.grid[i].unshift(tile);
              } else {
                  this.grid[i].push(tile);
              }
          }
      },
  
    /********************************************************/
    /*                                                      */
    /*                 Baselayer Functions                  */
    /*                                                      */
    /********************************************************/
    
      /** Calculates based on resolution, center, and mapsize
       * 
       * @returns A Bounds object which represents the lon/lat bounds of the 
       *          current viewPort.
       * @type OpenLayers.Bounds
       */
      getExtent: function () {
          var extent = null;
  
          var center = this.map.getCenter();
          if (center != null) {
  
              var res = this.map.getResolution();
              var size = this.map.getSize();
              var w_deg = size.w * res;
              var h_deg = size.h * res;
  
              extent = new OpenLayers.Bounds(center.lon - w_deg / 2,
                                             center.lat - h_deg / 2,
                                             center.lon + w_deg / 2,
                                             center.lat + h_deg / 2);
  
          }
  
          return extent;
      },
      
      /**
       * @param {OpenLayers.Bounds} bounds
       *
       * @return {int}
       */
      getZoomForExtent: function (bounds) {
  
          var maxRes = this.map.getMaxResolution();
          var viewSize = this.map.getSize();
  
          var width = bounds.getWidth();
          var height = bounds.getHeight();
  
          var degPerPixel = (width > height) ? width / viewSize.w 
                                             : height / viewSize.h;
          
          var zoom = Math.floor( (Math.log(maxRes/degPerPixel)) / Math.log(2) );
  
          //make sure zoom is within bounds    
          zoom = Math.min( Math.max(zoom, 0), 
                           this.getNumZoomLevels() - 1);
  
          return zoom;
      },
  
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.Grid"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/HTTPRequest.js
  
  Index: HTTPRequest.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer.js
   */
  OpenLayers.Layer.HTTPRequest = Class.create();
  OpenLayers.Layer.HTTPRequest.prototype = 
    Object.extend( new OpenLayers.Layer(), {
  
      /** @type String */
      url: null,
  
      /** Hashtable of key/value parameters
       * @type Object */
      params: null,
  
      /**
       * @constructor
       * 
       * @param {String} name
       * @param {String} url
       * @param {Object} params
       * @param {Object} options Hashtable of extra options to tag onto the layer
       */
      initialize: function(name, url, params, options) {
          var newArguments = arguments;
          if (arguments.length > 0) {
              newArguments = [name, options];
          }          
          OpenLayers.Layer.prototype.initialize.apply(this, newArguments);
          this.url = url;
          this.params = Object.extend( new Object(), params);
      },
  
      /** When the layer is added to the map, once it has taken all the 
       *   relevant properties from the map (in Layer.setMap()), we will
       *   make the call to initialize the layer's resolutions array.
       * 
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          OpenLayers.Layer.prototype.setMap.apply(this, arguments);
          this.initResolutions();
      },
      
      /**
       * 
       */
      destroy: function() {
          this.url = null;
          this.params = null;
          OpenLayers.Layer.prototype.destroy.apply(this, arguments); 
      },
      
      /**
       * @param {Object} obj
       * 
       * @returns An exact clone of this OpenLayers.Layer.HTTPRequest
       * @type OpenLayers.Layer.HTTPRequest
       */
      clone: function (obj) {
          
          if (obj == null) {
              obj = new OpenLayers.Layer.HTTPRequest(this.name,
                                                     this.url,
                                                     this.params,
                                                     this.options);
          }
          
          //get all additions from superclasses
          obj = OpenLayers.Layer.prototype.clone.apply(this, [obj]);
  
          // copy/set any non-init, non-simple values here
          
          return obj;
      },
  
      /** 
       * @param {String} newUrl
       */
      setUrl: function(newUrl) {
          this.url = newUrl;
      },
  
      /**
       * @param {Object} newParams
       */
      mergeNewParams:function(newParams) {
          this.params = Object.extend(this.params, newParams);
      },
      
  
      /** combine url with layer's params and these newParams. 
       *   
       *    does checking on the serverPath variable, allowing for cases when it 
       *     is supplied with trailing ? or &, as well as cases where not. 
       *
       *    return in formatted string like this:
       *        "server?key1=value1&key2=value2&key3=value3"
       * 
       * @param {Object} newParams
       * @param {String} altUrl Use this as the url instead of the layer's url
       * 
       * @type String
       */
      getFullRequestString:function(newParams, altUrl) {
          
          // use layer's url unless altUrl passed in
          var url = (altUrl == null) ? this.url : altUrl;
          
          // requestString always starts with url
          var requestString = url;        
  
          // create a new params hashtable with all the layer params and the 
          // new params together. then convert to string
          var allParams = Object.extend(new Object(), this.params);
          var allParams = Object.extend(allParams, newParams);
          var paramsString = OpenLayers.Util.getParameterString(allParams);
  
          if (paramsString != "") {
              var lastServerChar = this.url.charAt(this.url.length - 1);
              if ((lastServerChar == "&") || (lastServerChar == "?")) {
                  requestString += paramsString;
              } else {
                  if (this.url.indexOf('?') == -1) {
                      //serverPath has no ? -- add one
                      requestString += '?' + paramsString;
                  } else {
                      //serverPath contains ?, so must already have paramsString at the end
                      requestString += '&' + paramsString;
                  }
              }
          }
          return requestString;
      },
      
      /** This method's responsibility is to set up the 'resolutions' array 
       *   for the layer -- this array is what the layer will use to interface
       *   between the zoom levels of the map and the resolution display of the
       *   layer.
       * 
       *  The user has several options that determine how the array is set up.
       *  
       *  For a detailed explanation, see the following wiki from the 
       *   openlayers.org homepage:
       * 
       *  http://trac.openlayers.org/wiki/SettingZoomLevels
       * 
       * @private
       */
      initResolutions: function() {
          
          if ((this.scales != null) || (this.resolutions != null)) {
            //preset levels
              if (this.scales != null) {
                  this.resolutions = new Array();
                  for(var i = 0; i < this.scales.length; i++) {
                      this.resolutions[i] = 
                         OpenLayers.Util.getResolutionFromScale(this.scales[i], 
                                                                this.units);
                  }
              }
              this.numZoomLevels = this.resolutions.length;
  
          } else {
            //maxResolution and numZoomLevels
              
              this.resolutions = new Array();
              
              // determine maxResolution
              if (this.minScale) {
                  this.maxResolution = 
                      OpenLayers.Util.getResolutionFromScale(this.minScale, 
                                                             this.units);
              } else if (this.maxResolution == "auto") {
                  var viewSize = this.map.getSize();
                  var wRes = this.maxExtent.getWidth() / viewSize.w;
                  var hRes = this.maxExtent.getHeight()/ viewSize.h;
                  this.maxResolution = Math.max(wRes, hRes);
              } 
  
              // determine minResolution
              if (this.maxScale != null) {           
                  this.minResolution = 
                      OpenLayers.Util.getResolutionFromScale(this.maxScale);
              } else if ((this.minResolution == "auto") && 
                         (this.minExtent != null)){
                  var viewSize = this.map.getSize();
                  var wRes = this.minExtent.getWidth() / viewSize.w;
                  var hRes = this.minExtent.getHeight()/ viewSize.h;
                  this.minResolution = Math.max(wRes, hRes);
              } 
  
              // determine numZoomLevels
              if (this.minResolution != null) {
                  var ratio = this.maxResolution / this.minResolution;
                  this.numZoomLevels = 
                      Math.floor(Math.log(ratio) / Math.log(2)) + 1;
              }
              
              // now we have numZoomLevels and maxResolution, 
              //  we can populate the resolutions array
              for (var i=0; i < this.numZoomLevels; i++) {
                  this.resolutions.push(this.maxResolution / Math.pow(2, i));
              }    
          }
      },
      
      /**
       * @returns The currently selected resolution of the map, taken from the
       *          resolutions array, indexed by current zoom level.
       * @type float
       */
      getResolution: function() {
          var zoom = this.map.getZoom();
  
          return this.resolutions[zoom];
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.HTTPRequest"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/KaMap.js
  
  Index: KaMap.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/Grid.js
   */
  OpenLayers.Layer.KaMap = Class.create();
  OpenLayers.Layer.KaMap.prototype = 
    Object.extend( new OpenLayers.Layer.Grid(), {
  
      /** KaMap Layer is always a base layer 
       * 
       * @type Boolean
       */    
      isBaseLayer: true,
      
      units: null,
  
      resolution: OpenLayers.DOTS_PER_INCH,
      
      DEFAULT_PARAMS: {
          i: 'jpeg',
          map: ''
      },
          
      initialize: function(name, url, params, options) {
          var newArguments = new Array();
          newArguments.push(name, url, params, options);
          OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
          this.params = (params ? params : {});
          if (arguments.length > 0 && params) {
              OpenLayers.Util.applyDefaults(
                             this.params, 
                             this.DEFAULT_PARAMS
                             );
          }
      },
  
      /**
       * @param {OpenLayers.Bounds} bounds
       * 
       * @returns A string with the layer's url and parameters and also the 
       *           passed-in bounds and appropriate tile size specified as 
       *           parameters
       * @type String
       */
      getURL: function (bounds) {
          var mapRes = this.map.getResolution();
          var scale = Math.round((this.map.getScale() * 10000)) / 10000;        
          var cellSize = new OpenLayers.Size(mapRes*this.tileSize.w, mapRes*this.tileSize.h);
          var pX = Math.round(((bounds.left) / cellSize.w) * this.tileSize.w);
          var pY = -Math.round(((bounds.top) / cellSize.h) * this.tileSize.h);
          return this.getFullRequestString(
                        { t: pY, 
                          l: pX,
                          s: scale
                        });
      },
      
      addTile:function(bounds,position) {
          var url = this.getURL(bounds);
          return new OpenLayers.Tile.Image(this, position, bounds, 
                                               url, this.tileSize);
      },
      
      _initTiles:function() {
  
          var viewSize = this.map.getSize();
          var bounds = this.map.getExtent();
          var extent = this.map.getMaxExtent();
          var resolution = this.map.getResolution();
          var tilelon = resolution*this.tileSize.w;
          var tilelat = resolution*this.tileSize.h;
          
          var offsetlon = bounds.left;
          var tilecol = Math.floor(offsetlon/tilelon);
          var tilecolremain = offsetlon/tilelon - tilecol;
          var tileoffsetx = -tilecolremain * this.tileSize.w;
          var tileoffsetlon = tilecol * tilelon;
          
          var offsetlat = bounds.top;  
          var tilerow = Math.ceil(offsetlat/tilelat);
          var tilerowremain = tilerow - offsetlat/tilelat;
          var tileoffsety = -(tilerowremain+1) * this.tileSize.h;
          var tileoffsetlat = tilerow * tilelat;
          
          tileoffsetx = Math.round(tileoffsetx); // heaven help us
          tileoffsety = Math.round(tileoffsety);
  
          this.origin = new OpenLayers.Pixel(tileoffsetx,tileoffsety);
  
          var startX = tileoffsetx; 
          var startLon = tileoffsetlon;
          
          var rowidx = 0;
          
          do {
              var row;
              
              row = this.grid[rowidx++];
              if (!row) {
                  row = new Array();
                  this.grid.push(row);
              }
  
              tileoffsetlon = startLon;
              tileoffsetx = startX;
  
              var colidx = 0;
   
              do {
                  var tileBounds = new OpenLayers.Bounds(tileoffsetlon, 
                                                        tileoffsetlat, 
                                                        tileoffsetlon + tilelon,
                                                        tileoffsetlat + tilelat);
  
                  var x = tileoffsetx;
                  x -= parseInt(this.map.layerContainerDiv.style.left);
  
                  var y = tileoffsety;
                  y -= parseInt(this.map.layerContainerDiv.style.top);
  
                  var px = new OpenLayers.Pixel(x, y);
                  var tile;
                  
                  tile = row[colidx++];
                  if (!tile) {
                      tile = this.addTile(tileBounds, px);
                      row.push(tile);
                  } else {
                      tile.moveTo(tileBounds, px, false);
                  }
       
                  tileoffsetlon += tilelon;       
                  tileoffsetx += this.tileSize.w;
              } while (tileoffsetlon <= bounds.right + tilelon * this.buffer)  
              
              tileoffsetlat -= tilelat;
              tileoffsety += this.tileSize.h;
          } while(tileoffsetlat >= bounds.bottom - tilelat * this.buffer)
          
          this.spiralTileLoad();
  
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.KaMap"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/Markers.js
  
  Index: Markers.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer.js
   */
  OpenLayers.Layer.Markers = Class.create();
  OpenLayers.Layer.Markers.prototype = 
    Object.extend( new OpenLayers.Layer(), {
      
      /** Markers layer is never a base layer. 
       * 
       * @type Boolean
       */
      isBaseLayer: false,
      
      /** internal marker list
      * @type Array(OpenLayers.Marker) */
      markers: null,
      
      /**
      * @constructor
      *
      * @param {String} name
      * @param {Object} options Hashtable of extra options to tag onto the layer
      */
      initialize: function(name, options) {
          OpenLayers.Layer.prototype.initialize.apply(this, arguments);
          this.markers = new Array();
      },
      
      /**
       * 
       */
      destroy: function() {
          this.clearMarkers();
          markers = null;
          OpenLayers.Layer.prototype.destroy.apply(this, arguments);
      },
  
      
      /** 
       * @param {OpenLayers.Bounds} bounds
       * @param {Boolean} zoomChanged
       * @param {Boolean} minor
       */
      moveTo:function(bounds, zoomChanged, minor) {
          if (zoomChanged) {
              this.redraw();
          }
      },
  
      /**
       * @param {OpenLayers.Marker} marker
       */
      addMarker: function(marker) {
          this.markers.push(marker);
          if (this.map && this.map.getExtent()) {
              marker.map = this.map;
              this.drawMarker(marker);
          }
      },
  
      /**
       * @param {OpenLayers.Marker} marker
       */
      removeMarker: function(marker) {
          this.markers.remove(marker);
          if ((marker.icon != null) && (marker.icon.imageDiv != null) &&
              (marker.icon.imageDiv.parentNode == this.div) ) {
              this.div.removeChild(marker.icon.imageDiv);    
          }
      },
  
      /**
       * 
       */
      clearMarkers: function() {
          if (this.markers != null) {
              while(this.markers.length > 0) {
                  this.removeMarker(this.markers[0]);
              }
          }
      },
  
      /** clear all the marker div's from the layer and then redraw all of them.
      *    Use the map to recalculate new placement of markers.
      */
      redraw: function() {
          for(i=0; i < this.markers.length; i++) {
              this.drawMarker(this.markers[i]);
          }
      },
  
      /** Calculate the pixel location for the marker, create it, and 
      *    add it to the layer's div
      * 
      * @private 
      * 
      * @param {OpenLayers.Marker} marker
      */
      drawMarker: function(marker) {
          var px = this.map.getLayerPxFromLonLat(marker.lonlat);
          if (px == null) {
              marker.display(false);
          } else {
              var markerImg = marker.draw(px);
              if (!marker.drawn) {
                  this.div.appendChild(markerImg);
                  marker.drawn = true;
              }
          }
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.Markers"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/Text.js
  
  Index: Text.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/Markers.js
   */
  OpenLayers.Layer.Text = Class.create();
  OpenLayers.Layer.Text.prototype = 
    Object.extend( new OpenLayers.Layer.Markers(), {
  
      /** store url of text file - this should be specified in the 
       *   "options" hashtable
      * @type str */
      location:null,
  
      /** @type Array(OpenLayers.Feature) */
      features: null,
  
      /** @type OpenLayers.Feature */
      selectedFeature: null,
  
      /**
      * @constructor
      *
      * @param {String} name
      * @param {String} location
      * @param {Object} options Hashtable of extra options to tag onto the layer
      */
      initialize: function(name, options) {
          OpenLayers.Layer.Markers.prototype.initialize.apply(this, arguments);
          this.features = new Array();
          if (this.location != null) {
              OpenLayers.loadURL(this.location, null, this, this.parseData);
          }
      },
  
     /**
       * 
       */
      destroy: function() {
          this.clearFeatures();
          this.features = null;
          OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
      },
      
      
      /**
       * @param {?} ajaxRequest
       */
      parseData: function(ajaxRequest) {
          var text = ajaxRequest.responseText;
          var lines = text.split('\n');
          var columns;
          // length - 1 to allow for trailing new line
          for (var lcv = 0; lcv < (lines.length - 1); lcv++) {
              var currLine = lines[lcv].replace(/^\s*/,'').replace(/\s*$/,'');
          
              if (currLine.charAt(0) != '#') { /* not a comment */
              
                  if (!columns) {
                      //First line is columns
                      columns = currLine.split('\t');
                  } else {
                      var vals = currLine.split('\t');
                      var location = new OpenLayers.LonLat(0,0);
                      var title; var url;
                      var icon, iconSize, iconOffset;
                      var set = false;
                      for (var valIndex = 0; valIndex < vals.length; valIndex++) {
                          if (vals[valIndex]) {
                              if (columns[valIndex] == 'point') {
                                  var coords = vals[valIndex].split(',');
                                  location.lat = parseFloat(coords[0]);
                                  location.lon = parseFloat(coords[1]);
                                  set = true;
                              } else if (columns[valIndex] == 'lat') {
                                  location.lat = parseFloat(vals[valIndex]);
                                  set = true;
                              } else if (columns[valIndex] == 'lon') {
                                  location.lon = parseFloat(vals[valIndex]);
                                  set = true;
                              } else if (columns[valIndex] == 'title')
                                  title = vals[valIndex];
                              else if (columns[valIndex] == 'image' ||
                                       columns[valIndex] == 'icon')
                                  url = vals[valIndex];
                              else if (columns[valIndex] == 'iconSize') {
                                  var size = vals[valIndex].split(',');
                                  iconSize = new OpenLayers.Size(parseFloat(size[0]),
                                                             parseFloat(size[1]));
                              } else if (columns[valIndex] == 'iconOffset') {
                                  var offset = vals[valIndex].split(',');
                                  iconOffset = new OpenLayers.Pixel(parseFloat(offset[0]),
                                                             parseFloat(offset[1]));
                              } else if (columns[valIndex] == 'title') {
                                  title = vals[valIndex];
                              } else if (columns[valIndex] == 'description') {
                                  description = vals[valIndex];
                              }
                          }
                      }
                      if (set) {
                        var data = new Object();
                        if (url != null) {
                            data.icon = new OpenLayers.Icon(url, 
                                                            iconSize, 
                                                            iconOffset);
                        } else {
                            data.icon = OpenLayers.Marker.defaultIcon();
  
                            //allows for the case where the image url is not 
                            // specified but the size is. use a default icon
                            // but change the size
                            if (iconSize != null) {
                                data.icon.setSize(iconSize);
                            }
                          
                        }
                        if ((title != null) && (description != null)) {
                            data['popupContentHTML'] = '<h2>'+title+'</h2><p>'+description+'</p>';
                        }
                        var feature = new OpenLayers.Feature(this, location, data);
                        this.features.push(feature);
                        var marker = feature.createMarker();
                        marker.events.register('click', feature, this.markerClick);
                        this.addMarker(marker);
                      }
                  }
              }
          }
      },
      
      /**
       * @param {Event} evt
       */
      markerClick: function(evt) {
          sameMarkerClicked = (this == this.layer.selectedFeature);
          this.layer.selectedFeature = (!sameMarkerClicked) ? this : null;
          for(var i=0; i < this.layer.map.popups.length; i++) {
              this.layer.map.removePopup(this.layer.map.popups[i]);
          }
          if (!sameMarkerClicked) {
              this.layer.map.addPopup(this.createPopup()); 
          }
          Event.stop(evt);
      },
  
      /**
       * 
       */
      clearFeatures: function() {
          if (this.features != null) {
              while(this.features.length > 0) {
                  var feature = this.features[0];
                  this.features.remove(feature);
                  feature.destroy();
              }
          }        
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Text"
  });
       
      
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/VirtualEarth.js
  
  Index: VirtualEarth.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class 
   * 
   * @requires OpenLayers/Layer/EventPane.js
   */
  OpenLayers.Layer.VirtualEarth = Class.create();
  OpenLayers.Layer.VirtualEarth.prototype = 
    Object.extend( new OpenLayers.Layer.EventPane(), {
  
      /** @type VEMap */
      vemap: null,
      
      /** @type int */
      minZoomLevel: 1,
  
      /** @type int */
      maxZoomLevel: 17,
      
      /**
       * @constructor
       * 
       * @param {String} name
       */
      initialize:function(name) {
          OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
  
          this.numZoomLevels = this.maxZoomLevel - this.minZoomLevel + 1;
      },
  
      /** 
       * @param {OpenLayers.Map} map
       */
      setMap:function(map) {
          OpenLayers.Layer.EventPane.prototype.setMap.apply(this, arguments);
  
          // once our layer has been added to the map, we can load the vemap
          this.loadVEMap();
      },
  
      /** 
       * @param {OpenLayers.Bounds} bounds
       * @param {Boolean} zoomChanged
       * @param {Boolean} minor
       */
      moveTo:function(bounds, zoomChanged, minor) {
  
          if (this.vemap != null) {
              var olCenter = this.map.getCenter();
              var veCenter = this.getVELatLongFromOLLonLat(olCenter);
      
              if (zoomChanged) {
                  var olZoom = this.map.getZoom();
                  var veZoom = this.getVEZoomFromOLZoom(olZoom);
      
                  this.vemap.SetCenterAndZoom(veCenter, veZoom);
              } else {
                  this.vemap.PanToLatLong(veCenter);
              }
      
          }
      },
  
  
      /**
       * 
       */
      loadVEMap:function() {
  
          // create div and set to same size as map
          var veDiv = OpenLayers.Util.createDiv(this.name);
          var sz = this.map.getSize();
          veDiv.style.width = sz.w;
          veDiv.style.height = sz.h;
          this.div.appendChild(veDiv);
  
          try {
  
              // create VEMap, hide nav controls
              this.vemap = new VEMap(this.name);
          } catch (e) {
              // do nothing this is to keep from crashing
              // if the VE library was not loaded. 
          }
  
          
          if (this.vemap == null) {
              this.loadWarningMessage();
          } else {
  
  
              try {
                  this.vemap.LoadMap();
              } catch (e) {
                  // this is to catch a Mozilla bug without falling apart
              }
  
              this.vemap.HideDashboard();
          }
   
      },
  
      /** If we can't load the vemap, then display an error message to the 
       *   user and tell them where to go for help.
       * 
       * @private
       * 
       */
      loadWarningMessage:function() {
  
          this.div.style.backgroundColor = "darkblue";
  
          var html = "";
          html += "The VE Layer was unable to load correctly.<br>";
          html += "<br>";
          html += "To get rid of this message, click on the VE Layer's "
          html += "tab in the layer switcher in the upper-right corner.<br>";
          html += "<br>";
          html += "Most likely, this is because the VE library";
          html += " script was either not correctly included.<br>";
          html += "<br>";
          html += "Developers: For help getting this working correctly, ";
          html += "<a href='http://trac.openlayers.org/wiki/VirtualEarthLayer' "
          html +=  "target='_blank'>";
          html +=     "click here";
          html += "</a>";
          
          var viewSize = this.map.getSize();
          
          msgW = Math.min(viewSize.w, 300);
          msgH = Math.min(viewSize.h, 200);
          var size = new OpenLayers.Size(msgW, msgH);
  
          var centerPx = new OpenLayers.Pixel(viewSize.w/2, viewSize.h/2);
  
          var topLeft = centerPx.add(-size.w/2, -size.h/2);            
  
          var div = OpenLayers.Util.createDiv("veWarning", 
                                              topLeft, 
                                              size,
                                              null,
                                              null,
                                              null,
                                              "auto");
  
          div.style.padding = "7px";
          div.style.backgroundColor = "yellow";
  
          div.innerHTML = html;
          this.div.appendChild(div);
      },
  
  
    /********************************************************/
    /*                                                      */
    /*                 Baselayer Functions                  */
    /*                                                      */
    /********************************************************/
  
      /**
       * @param {OpenLayers.Pixel} viewPortPx
       *
       * @returns An OpenLayers.LonLat which is the passed-in view port
       *          OpenLayers.Pixel, translated into lon/lat by VE
       *          If vemap is not loaded, returns null.
       * @type OpenLayers.LonLat
       */
      getLonLatFromViewPortPx: function (viewPortPx) {
          var lonlat = null;
          if (this.vemap != null) {
              var pixel = this.getPixelFromOLPixel(viewPortPx);
              var zoom = this.vemap.GetZoomLevel();
              var veLatLong = this.vemap.PixelToLatLong(pixel.x, pixel.y, zoom);
              lonlat = this.getOLLonLatFromVELatLong(veLatLong);
          }
          return lonlat;
      },
  
   
      /**
       * @param {OpenLayers.LonLat} lonlat
       *
       * @returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, 
       *          translated into view port pixels BY VE
       *          If vemap is not loaded, returns null.
       * @type OpenLayers.Pixel
       */
      getViewPortPxFromLonLat: function (lonlat) {
          var viewPortPx = null;
          if (this.vemap != null) {
              var veLatLong = this.getVELatLongFromOLLonLat(lonlat);
              var pixel = this.vemap.LatLongToPixel(veLatLong);
              viewPortPx = this.getOLPixelFromPixel(pixel);
          }
          return viewPortPx;
      },
  
  
      /**
       * @param {OpenLayers.Bounds} bounds
       *
       * @returns Corresponding zoom level for a specified Bounds. 
       *          If vemap is not loaded, returns null.
       * @type int
       */
      getZoomForExtent: function (bounds) {
  
          var zoom = null;
          if (this.vemap != null) {
              var maxRes = this.map.getMaxResolution();
              var viewSize = this.map.getSize();
      
              var width = bounds.getWidth();
              var height = bounds.getHeight();
      
              var degPerPixel = (width > height) ? width / viewSize.w 
                                                 : height / viewSize.h;
              
              var veZoom = Math.floor( (Math.log(maxRes/degPerPixel)) / 
                                       Math.log(2) );
      
              //make sure zoom is within bounds    
              var veZoom = Math.min(Math.max(veZoom, this.minZoomLevel), 
                                    this.maxZoomLevel);
      
              zoom = this.getOLZoomFromVEZoom(veZoom);         
          }
          return zoom;
      },
   
   
    /********************************************************/
    /*                                                      */
    /*             Translation Functions                    */
    /*                                                      */
    /*    The following functions translate GMaps and OL    */ 
    /*     formats for Pixel, LonLat, Bounds, and Zoom      */
    /*                                                      */
    /********************************************************/
  
    //
    // TRANSLATION: GZoom <-> OpenLayers Zoom
    //
    
      /**
       * @param {int} veZoom
       * 
       * @returns An OpenLayers Zoom level, translated from the passed in veZoom
       *          Returns null if null value is passed in
       * @type int
       */
      getOLZoomFromVEZoom: function(veZoom) {
          var zoom = null;
          if (veZoom != null) {
              zoom = veZoom - this.minZoomLevel;
          }
          return zoom;
      },
      
      /**
       * @param {int} olZoom
       * 
       * @returns A VEZoom level, translated from the passed in olZoom
       *          Returns null if null value is passed in
       * @type int
       */
      getVEZoomFromOLZoom: function(olZoom) {
          var zoom = null; 
          if (olZoom != null) {
              zoom = olZoom + this.minZoomLevel;
          }
          return zoom;
      },
  
    //
    // TRANSLATION: VELatLong <-> LonLat
    //
  
      /**
       * @param {VELatLong} veLatLong
       * 
       * @returns An OpenLayers.LonLat, translated from the passed in VELatLong
       *          Returns null if null value is passed in
       * @type OpenLayers.LonLat
       */
      getOLLonLatFromVELatLong: function(veLatLong) {
          var olLonLat = null;
          if (veLatLong != null) {
              olLonLat = new OpenLayers.LonLat(veLatLong.Longitude, 
                                               veLatLong.Latitude);
          }
          return olLonLat;
      },
  
      /**
       * @param {OpenLayers.LonLat} olLonLat
       * 
       * @returns A VELatLong, translated from the passed in OpenLayers.LonLat
       *          Returns null if null value is passed in
       * @type VELatLong
       */
      getVELatLongFromOLLonLat: function(olLonLat) {
          var veLatLong = null;
          if (olLonLat != null) {
              veLatLong = new VELatLong(olLonLat.lat, olLonLat.lon);
          }
          return veLatLong;
      },
  
  
    //
    // TRANSLATION: Pixel <-> OpenLayers.Pixel
    //
  
      /**
       * @param {Pixel} pixel
       * 
       * @returns An OpenLayers.Pixel, translated from the passed in Pixel
       *          Returns null if null value is passed in
       * @type OpenLayers.Pixel
       */
      getOLPixelFromPixel: function(pixel) {
          var olPixel = null;
          if (pixel != null) {
              olPixel = new OpenLayers.Pixel(pixel.x, pixel.y);
          }
          return olPixel;
      },
  
      /**
       * @param {OpenLayers.Pixel} olPixel
       * 
       * @returns A Pixel, translated from the passed in OpenLayers.Pixel
       *          Returns null if null value is passed in
       * 
       *          As it turns out, the only specifications we can see for the
       *          VE-compatible Pixel is an x & y property, which every 
       *          OpenLayers.Pixel has by default. So just leave it as-is.
       * 
       * @type Pixel
       */
      getPixelFromOLPixel: function(olPixel) {
          var pixel = null;
          if (olPixel != null) {
              pixel = new Msn.VE.Pixel(olPixel.x, olPixel.y);
          }
          return pixel;
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.VirtualEarth"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/WFS.js
  
  Index: WFS.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/Grid.js
   * @requires OpenLayers/Layer/Markers.js
   */
  OpenLayers.Layer.WFS = Class.create();
  OpenLayers.Layer.WFS.prototype = 
    Object.extend(new OpenLayers.Layer.Grid(),
      Object.extend(new OpenLayers.Layer.Markers(), {
  
      /** WFS layer is never a base layer. 
       * 
       * @type Boolean
       */
      isBaseLayer: false,
  
      buffer: 1,
      
      /** Allow the user to specify special classes for features and tiles.
       * 
       *   This allows for easy-definition of behaviour. The defaults are 
       *    set here, but to override it, the property should be set via 
       *    the "options" parameter.
       */
       
      /** @type Object */
      featureClass: OpenLayers.Feature.WFS,
  
      /** @type Object */
      tileClass: OpenLayers.Tile.WFS,
  
      /** Hashtable of default key/value parameters
       * @final @type Object */
      DEFAULT_PARAMS: { service: "WFS",
                        version: "1.0.0",
                        request: "GetFeature",
                        typename: "docpoint"
                      },
  
      /**
      * @constructor
      *
      * @param {String} name
      * @param {String} url
      * @param {Object} params
      * @param {Object} options Hashtable of extra options to tag onto the layer
      */
      initialize: function(name, url, params, options) {
          var newArguments = new Array();
          if (arguments.length > 0) {
              //uppercase params
              params = OpenLayers.Util.upperCaseObject(params);
              newArguments.push(name, url, params, options);
          }
          OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
  
          var newArguments = new Array();
          if (arguments.length > 0) {
              //uppercase params
              newArguments.push(name, options);
          }
          OpenLayers.Layer.Markers.prototype.initialize.apply(this, newArguments);
      
          if (arguments.length > 0) {
              OpenLayers.Util.applyDefaults(
                             this.params, 
                             OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
                             );
          }
      },    
      
  
      /**
       * 
       */
      destroy: function() {
          OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);
          OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
      },
      
      /**
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments);
          OpenLayers.Layer.Markers.prototype.setMap.apply(this, arguments);
      },
      
      /** 
       * @param {OpenLayers.Bounds} bounds
       * @param {Boolean} zoomChanged
       * @param {Boolean} minor
       */
      moveTo:function(bounds, zoomChanged, minor) {
          OpenLayers.Layer.Grid.prototype.moveTo.apply(this, arguments);
          OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
      },
          
      /**
       * @param {Object} obj
       * 
       * @returns An exact clone of this OpenLayers.Layer.WMS
       * @type OpenLayers.Layer.WMS
       */
      clone: function (obj) {
          
          if (obj == null) {
              obj = new OpenLayers.Layer.WFS(this.name,
                                             this.url,
                                             this.params,
                                             this.options);
          }
  
          //get all additions from superclasses
          obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
  
          // copy/set any non-init, non-simple values here
  
          return obj;
      },    
  
  
      /**
      * addTile creates a tile, initializes it (via 'draw' in this case), and 
      * adds it to the layer div. 
      *
      * @param {OpenLayers.Bounds} bounds
      *
      * @returns The added OpenLayers.Tile.WFS
      * @type OpenLayers.Tile.WFS
      */
      addTile:function(bounds, position) {
          var urls = new Array();
  
          //add standard URL
          urls.push( this.getFullRequestString() );
  
          if (this.urls != null) {
              // if there are more urls, add them.
              for(var i=0; i < this.urls.length; i++) {
                  urls.push( this.getFullRequestString(null, this.urls[i]) );
              }
          }
  
          return new this.tileClass(this, position, bounds, 
                                             urls, this.tileSize);
      },
  
  
  
      /**
       * Catch changeParams and uppercase the new params to be merged in
       *  before calling changeParams on the super class.
       * 
       * Once params have been changed, we will need to re-init our tiles
       * 
       * @param {Object} newParams Hashtable of new params to use
       */
      mergeNewParams:function(newParams) {
          var upperParams = OpenLayers.Util.upperCaseObject(newParams);
          var newArguments = [upperParams];
          OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, newArguments);
  
          if (this.grid != null) {
              this._initTiles();
          }
      },
  
      /** combine the layer's url with its params and these newParams. 
      *   
      *    Add the SRS parameter from getProjection() -- this is probably
      *     more eloquently done via a setProjection() method, but this 
      *     works for now and always.
      * 
      * @param {Object} newParams
      * 
      * @type String
      */
      getFullRequestString:function(newParams) {
          var projection = this.map.getProjection();
          this.params.SRS = (projection == "none") ? null : projection;
  
          return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(
                                                      this, arguments);
      },
  
  
      /** 
       * @param {String} featureID
       * 
       * @returns The Feature, found within one of the layer's tiles' features 
       *          array, with a matching id.
       *          If none found or if null passed-in, returns null
       * @type OpenLayers.Feature
       */
      getFeature: function(featureID) {
          var foundFeature = null;
          if (featureID != null) {
  
              if (this.grid) {
      
                  for(var iRow = 0; iRow < this.grid.length; iRow++) {
                      var row = this.grid[iRow];
                      for(var iCol = 0; iCol < row.length; iCol++) {
                          var tile = row[iCol];
      
                          for(var i=0; i < tile.features.length; i++) {
                              var feature = tile.features[i];
                              if (feature.id == featureID) {
                                  foundFeature = feature;
                              }
                          }
                      }
                  }
              }
  
          }
          return foundFeature; 
      },
  
  
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.WFS"
  }
  )
  );
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/WMS.js
  
  Index: WMS.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/Grid.js
   */
  OpenLayers.Layer.WMS = Class.create();
  OpenLayers.Layer.WMS.prototype = 
    Object.extend( new OpenLayers.Layer.Grid(), {
  
      /** Hashtable of default parameter key/value pairs 
       * @final @type Object */
      DEFAULT_PARAMS: { service: "WMS",
                        version: "1.1.1",
                        request: "GetMap",
                        styles: "",
                        exceptions: "application/vnd.ogc.se_inimage",
                        format: "image/jpeg"
                       },
  
      /** @type Boolean */
      isBaseLayer: null,
  
      /**
      * @constructor
      *
      * @param {String} name
      * @param {String} url
      * @param {Object} params
      * @param {Object} options Hashtable of extra options to tag onto the layer
      */
      initialize: function(name, url, params, options) {
          var newArguments = new Array();
          if (arguments.length > 0) {
              //uppercase params
              params = OpenLayers.Util.upperCaseObject(params);
              newArguments.push(name, url, params, options);
          }
          OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
  
          if (arguments.length > 0) {
              OpenLayers.Util.applyDefaults(
                             this.params, 
                             OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
                             );
          }
  
          // if the layer is transparent, it will be an overlay        
          this.isBaseLayer = ((this.params.TRANSPARENT != "true") && 
                              (this.params.TRANSPARENT != true));
      },    
  
      /**
       * 
       */
      destroy: function() {
          // for now, nothing special to do here. 
          OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);  
      },
  
      
      /**
       * @param {Object} obj
       * 
       * @returns An exact clone of this OpenLayers.Layer.WMS
       * @type OpenLayers.Layer.WMS
       */
      clone: function (obj) {
          
          if (obj == null) {
              obj = new OpenLayers.Layer.WMS(this.name,
                                             this.url,
                                             this.params,
                                             this.options);
          }
  
          //get all additions from superclasses
          obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
  
          // copy/set any non-init, non-simple values here
  
          return obj;
      },    
      
      /**
       * @param {OpenLayers.Bounds} bounds
       * 
       * @returns A string with the layer's url and parameters and also the 
       *           passed-in bounds and appropriate tile size specified as 
       *           parameters
       * @type String
       */
      getURL: function (bounds) {
          return this.getFullRequestString(
                       {BBOX:bounds.toBBOX(),
                        WIDTH:this.tileSize.w,
                        HEIGHT:this.tileSize.h});
      },
  
      /**
      * addTile creates a tile, initializes it, and 
      * adds it to the layer div. 
      *
      * @param {OpenLayers.Bounds} bounds
      *
      * @returns The added OpenLayers.Tile.Image
      * @type OpenLayers.Tile.Image
      */
      addTile:function(bounds,position) {
          url = this.getURL(bounds);
          return new OpenLayers.Tile.Image(this, position, bounds, 
                                               url, this.tileSize);
      },
  
      /**
       * Catch changeParams and uppercase the new params to be merged in
       *  before calling changeParams on the super class.
       * 
       * Once params have been changed, we will need to re-init our tiles
       * 
       * @param {Object} newParams Hashtable of new params to use
       */
      mergeNewParams:function(newParams) {
          var upperParams = OpenLayers.Util.upperCaseObject(newParams);
          var newArguments = [upperParams];
          OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this, 
                                                               newArguments);
  
          if (this.map != null) {
              this._initTiles();
          }
      },
  
      /** combine the layer's url with its params and these newParams. 
      *   
      *    Add the SRS parameter from getProjection() -- this is probably
      *     more eloquently done via a setProjection() method, but this 
      *     works for now and always.
      * 
      * @param {Object} newParams
      * 
      * @type String
      */
      getFullRequestString:function(newParams) {
          var projection = this.map.getProjection();
          this.params.SRS = (projection == "none") ? null : projection;
  
          return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(
                                                      this, arguments);
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.WMS"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/WorldWind.js
  
  Index: WorldWind.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/Grid.js
   */
  OpenLayers.Layer.WorldWind = Class.create();
  OpenLayers.Layer.WorldWind.prototype = 
    Object.extend( new OpenLayers.Layer.Grid(), {
      
      DEFAULT_PARAMS: {
      },
  
      /** WorldWind layer is always a base layer
       * 
       * @type Boolean
       */
      isBaseLayer: true,    
  
      // LevelZeroTileSizeDegrees
      lzd: null,
  
      zoomLevels: null,
          
      initialize: function(name, url, lzd, zoomLevels, params, options) {
          this.lzd = lzd;
          this.zoomLevels = zoomLevels;
          var newArguments = new Array();
          newArguments.push(name, url, params, options);
          OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
          this.params = (params ? params : {});
          if (arguments.length > 0 && params) {
              OpenLayers.Util.applyDefaults(
                             this.params, 
                             this.DEFAULT_PARAMS
                             );
          }
      },
      addTile:function(bounds,position) {
          if (this.map.getResolution() <= (this.lzd/512)
              && this.getZoom() <= this.zoomLevels) {
  
              return new OpenLayers.Tile.Image(this, position, bounds, 
                                               url, this.tileSize);
          } else {
              var tile = new Object();
              tile.draw = function() {};
              tile.destroy = function() {};
              tile.bounds = bounds;
              tile.bounds = position;
              return tile;
          }
      },
  
      getZoom: function () {
          var zoom = this.map.getZoom();
          var extent = this.map.getMaxExtent();
          zoom = zoom - Math.log(this.map.maxResolution / (this.lzd/512))/Math.log(2);
          return zoom;
      },
  
      /**
       * @param {OpenLayers.Bounds} bounds
       * 
       * @returns A string with the layer's url and parameters and also the 
       *           passed-in bounds and appropriate tile size specified as 
       *           parameters
       * @type String
       */
      getURL: function (bounds) {
          var deg = this.lzd/Math.pow(2,this.getZoom());
          var x = Math.floor((bounds.left - extent.left)/deg);
          var y = Math.floor((bounds.bottom - extent.bottom)/deg);
          return this.getFullRequestString(
                { L: zoom, 
                  X: x,
                  Y: y
                });
  
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.WorldWind"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/Yahoo.js
  
  Index: Yahoo.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  // load Yahoo map control script
  document.write("<script src='http://api.maps.yahoo.com/ajaxymap?v=3.0&appid=euzuro-openlayers'></script>");
  
  /**
   * @class
   * 
   * @requires OpenLayers/Layer.js
   */
  OpenLayers.Layer.Yahoo = Class.create();
  OpenLayers.Layer.Yahoo.prototype = Object.extend( new OpenLayers.Layer(), {
  
      /** Yahoo layer is always a base layer.
       * 
       * @type Boolean
       */
      isBaseLayer: true,
      
      /** @type Boolean */
      isFixed: true,
  
      /** @type GMap2 gmap stores the Google Map element */
      ymap:null,
     
      /** @type Boolean */
      dragging:false,
      
      /** 
       * @constructor
       * 
       * @param {String} name
       */
      initialize: function(name) {
          OpenLayers.Layer.prototype.initialize.apply(this, [name]);
      },
      
       /** 
       * @param {OpenLayers.Map} map
       */
      setMap:function(map) {
          OpenLayers.Layer.prototype.setMap.apply(this, arguments);
  
          // once our layer has been added to the map, we can create the vemap
          this.map.events.register("addlayer", this, this.loadYMap);
      },
  
      /** 
       * @param {OpenLayers.Bounds} bounds
       * @param {Boolean} zoomChanged
       * @param {Boolean} minor
       */
      moveTo:function(bounds, zoomChanged, minor) {
  
          if ((this.ymap != null) && (!this.dragging)) {
  
              var olCenter = this.map.getCenter();
              var yCenter = this.getYMapCenter();
              
              var olZoom = this.map.getZoom();
              var yZoom = this.ymap.getZoomLevel();
              
              if ((!olCenter.equals(yCenter)) || (( 16 - olZoom) != yZoom)) {
                  this.ymap.drawZoomAndCenter(new YGeoPoint(olCenter.lat, olCenter.lon), 
                                      16 - olZoom);
              }
          }
      },
  
      /**
       * 
       */
      loadYMap:function() {
          // create div and set to same size as map
          var yDiv = OpenLayers.Util.createDiv(this.name);
          var sz = this.map.getSize();
          yDiv.style.width = sz.w;
          yDiv.style.height = sz.h;
          this.div.appendChild(yDiv);
  
          // create GMap, hide nav controls
          this.ymap = new YMap(this.div);
  
          // catch pans and zooms from GMap
          YEvent.Capture(this.ymap, 
                         EventsList.endPan, 
                         this.catchPanZoom, 
                         this); 
  
          // catch pans and zooms from GMap
          YEvent.Capture(this.ymap, 
                         EventsList.endAutoPan, 
                         this.catchPanZoom, 
                         this); 
  
  
          // attach to the drag start and end and we´ll set a flag so that
          //  we dont get recursivity. this is because the events fall through
          //  the gmaps div and into the main layer div
          YEvent.Capture(this.ymap, 
                         EventsList.startPan, 
                         this.dragStart,
                         this); 
  
      },
  
      /** 
       * @private
       */
      dragStart: function() {
          this.dragging = true;
      },
      
      /**
       * @private 
       * 
       * @param {Event} e
       */
      catchPanZoom: function(e) { 
          this.dragging = false;
  
          var olCenter = this.getYMapCenter();
          var yZoom = this.ymap.getZoomLevel();
  
          this.map.setCenter(olCenter, 16 - yZoom);
          
      },
  
      /**
       * @private
       * 
       * @returns An OpenLayers.LonLat with the center of the ymap, or null if 
       *           the YMap has not been centered yet
       * @type OpenLayers.LonLat
       */
      getYMapCenter:function() {
          var olCenter = null;
          var yCenter = this.ymap.getCenterLatLon();
          if (yCenter != null) {
              olCenter = new OpenLayers.LonLat(yCenter.Lon, yCenter.Lat);
          }
          return olCenter;
      },
   
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.Yahoo"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Layer/WMS/Untiled.js
  
  Index: Untiled.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
   
  /**
   * @class
   * 
   * @requires OpenLayers/Layer/HTTPRequest.js
   * @requires OpenLayers/Layer/WMS.js
   */
  OpenLayers.Layer.WMS.Untiled = Class.create();
  OpenLayers.Layer.WMS.Untiled.prototype = 
    Object.extend( new OpenLayers.Layer.HTTPRequest(), {
  
      /** Hashtable of default parameter key/value pairs
       * @final @type Object */
      DEFAULT_PARAMS: { service: "WMS",
                        version: "1.1.1",
                        request: "GetMap",
                        styles: "",
                        exceptions: "application/vnd.ogc.se_inimage",
                        format: "image/jpeg"
                       },
  
      
      /** @type Boolean */
      isBaseLayer: null,
      
      /** @type DOMElement */
      imgDiv: null,
      
  
      /**
      * @constructor
      *
      * @param {String} name
      * @param {String} url
      * @param {Object} params
      */
      initialize: function(name, url, params) {
          var newArguments = new Array();
          if (arguments.length > 0) {
              //uppercase params
              params = OpenLayers.Util.upperCaseObject(params);
              newArguments.push(name, url, params);
          }
          OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this, 
                                                                  newArguments);
          
          if (arguments.length > 0) {
              OpenLayers.Util.applyDefaults(
                             this.params, 
                             OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
                             );
          }
  
          // if the layer is transparent, it will be an overlay        
          this.isBaseLayer = ((this.params.TRANSPARENT != "true") && 
                              (this.params.TRANSPARENT != true));
  
      },    
  
      /**
       * 
       */
      destroy: function() {
          this.imgDiv = null;    
          OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments);
      },
      
      /**
       * @param {Object} obj
       * 
       * @returns An exact clone of this OpenLayers.Layer.WMS.Untiled
       * @type OpenLayers.Layer.WMS.Untiled
       */
      clone: function (obj) {
          
          if (obj == null) {
              obj = new OpenLayers.Layer.WMS.Untiled(this.name,
                                                     this.url,
                                                     this.params,
                                                     this.options);
          }
  
          //get all additions from superclasses
          obj = OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this, [obj]);
  
          // copy/set any non-init, non-simple values here
  
          return obj;
      },    
      
      
      /** Once HTTPRequest has set the map, we can load the image div
       * 
       * @param {OpenLayers.Map} map
       */
      setMap: function(map) {
          OpenLayers.Layer.HTTPRequest.prototype.setMap.apply(this, arguments);
          this.loadImageDiv();
      },
  
      /** When it is not a minor move (ie when panning or when done dragging)
       *   reload and recenter the div.
       * 
       * @param {OpenLayers.Bounds} bounds
       * @param {Boolean} zoomChanged
       * @param {Boolean} minor
       */
      moveTo:function(bounds, zoomChanged, minor) {
  
          if (!minor) {
          
              if (bounds == null) {
                  bounds = this.map.getExtent();
              }
              
              var size = this.map.getSize().clone();
  
              // get the url
              var url = this.getFullRequestString( {BBOX: bounds.toBBOX(),
                                                    WIDTH: size.w,
                                                    HEIGHT: size.h} );
          
  
              // always position at upper left corner of current viewspace
              var tl = new OpenLayers.Pixel(0,0);
              var pos = this.map.getLayerPxFromViewPortPx(tl);
  
              // first hide before all modifications            
              Element.hide(this.imgDiv);
              
              // update div
              var img = this.imgDiv;
              if (this.params.TRANSPARENT == 'true') {
                  OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv, 
                                                      null, 
                                                      pos, 
                                                      size,
                                                      url);
                  img = this.imgDiv.childNodes[0];
              } else {
                  OpenLayers.Util.modifyDOMElement(this.imgDiv, 
                                                   null, 
                                                   pos, 
                                                   size);
                  this.imgDiv.src = url;
              }
      
              // wait until image is done loading to show again
              Event.observe(img, 
                            "load", 
                            this.showDiv.bindAsEventListener(this));
          }
      },
      
      /** Helper function that allows us to first hide the imgDiv, then make all 
       *   the changes (position, size, url). Then when the url is done loading,
       *   we call this function to show the imgDiv.
       * 
       * @private
       */
      showDiv: function() {
          Element.show(this.imgDiv);
      },
      
      /** Once HTTPRequest has updated the url, reload the image div
       * @param {String} newUrl
       */
      setUrl: function(newUrl) {
          OpenLayers.Layer.HTTPRequest.prototype.setUrl.apply(this, arguments);
          this.moveTo();
      },
  
      /** Once HTTPRequest has updated new params, reload the image div
       * @param {Object} newParams
       */
      mergeNewParams:function(newParams) {
          var upperParams = OpenLayers.Util.upperCaseObject(newParams);
          var newArguments = [upperParams];
          OpenLayers.Layer.HTTPRequest.prototype.mergeNewParams.apply(this, 
                                                                   newArguments);
          //redraw
          this.moveTo();
      },
      
      /** This function first removes the previous image div, then adds a new
       *   one according to the transparency property.
       * 
       * @private
       */
      loadImageDiv: function() {
          
          var size = this.map.getSize().clone();
          var bounds = this.map.getExtent();
  
          var url = "";            
          if (bounds != null) {
              url = this.getFullRequestString( {BBOX: bounds.toBBOX(),
                                                WIDTH: size.w,
                                                HEIGHT: size.h} );
          }
          
          //clear previous wms image (removes imgDiv)
          this.div.innerHTML = "";
          
          //always position at upper left corner of current viewspace
          var tl = new OpenLayers.Pixel(0,0);
          var pos = this.map.getLayerPxFromViewPortPx(tl);
          
          //create div
          if (this.params.TRANSPARENT == 'true') {
              this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null,
                                                                pos,
                                                                size,
                                                                url,
                                                                "absolute");
          } else {
              this.imgDiv = OpenLayers.Util.createImage(null,
                                                        pos,
                                                        size,
                                                        url,
                                                        "absolute");
          }
          
          this.div.appendChild(this.imgDiv);
      },
          
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Layer.WMS.Untiled"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Marker/Box.js
  
  Index: Box.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Marker.js
   */
  OpenLayers.Marker.Box = Class.create();
  OpenLayers.Marker.Box.prototype = Object.extend( new OpenLayers.Marker(), {
      /** @type OpenLayers.LonLat */
      bounds: null,
  
      div: null,
      
      /** 
      * @constructor
      *
      * @param {OpenLayers.Icon} icon
      * @param {OpenLayers.LonLat lonlat
      */
      initialize: function(bounds, borderColor, borderWidth) {
          if (arguments.length > 0) {
              this.bounds = bounds;
              this.div    = OpenLayers.Util.createDiv();
              this.events = new OpenLayers.Events(this, this.div, null);
              this.setBorder(borderColor, borderWidth);
          }
      },
  
      setBorder: function (color, width) {
          if (!color) color = "red";
          if (!width) width = 2;
          this.div.style.border = width + "px solid " + color;
      },
      
      /** 
      * @param {OpenLayers.Pixel} px
      * 
      * @return A new DOM Image with this marker´s icon set at the 
      *         location passed-in
      * @type DOMElement
      */
      draw: function(px, sz) {
          OpenLayers.Util.modifyDOMElement(this.div, null, px, sz);
          return this.div;
      }, 
  
      /**
       * @returns Whether or not the marker is currently visible on screen.
       * @type Boolean
       */
      onScreen:function() {
          var onScreen = false;
          if (this.map) {
              var screenBounds = this.map.getExtent();
              onScreen = screenBounds.containsBounds(this.bounds, true, true);
          }    
          return onScreen;
      },
      
      /** Hide or show the icon
       * 
       * @param {Boolean} display
       */
      display: function(display) {
          this.div.style.display = (display) ? "" : "none";
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Marker.Box"
  });
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Popup/Anchored.js
  
  Index: Anchored.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Popup.js
   */
  OpenLayers.Popup.Anchored = Class.create();
  OpenLayers.Popup.Anchored.prototype =
     Object.extend( new OpenLayers.Popup(), {
  
      /** "lr", "ll", "tr", "tl" - relative position of the popup.
       * @type String */
      relativePosition: null,
  
      /** Object which must have expose a 'size' (OpenLayers.Size) and 
       *                                 'offset' (OpenLayers.Pixel) 
       * @type Object */
      anchor: null,
  
      /** 
      * @constructor
      * 
      * @param {String} id
      * @param {OpenLayers.LonLat} lonlat
      * @param {OpenLayers.Size} size
      * @param {String} contentHTML
      * @param {Object} anchor  Object which must expose a 
      *                         - 'size' (OpenLayers.Size) and 
      *                         - 'offset' (OpenLayers.Pixel) 
      *                         (this is generally an OpenLayers.Icon)
      */
      initialize:function(id, lonlat, size, contentHTML, anchor) {
          var newArguments = new Array(id, lonlat, size, contentHTML);
          OpenLayers.Popup.prototype.initialize.apply(this, newArguments);
  
          this.anchor = (anchor != null) ? anchor 
                                         : { size: new OpenLayers.Size(0,0),
                                             offset: new OpenLayers.Pixel(0,0)};
      },
  
      /** 
      * @param {OpenLayers.Pixel} px
      * 
      * @returns Reference to a div that contains the drawn popup
      * @type DOMElement
      */
      draw: function(px) {
          if (px == null) {
              if ((this.lonlat != null) && (this.map != null)) {
                  px = this.map.getLayerPxFromLonLat(this.lonlat);
              }
          }
          
          //calculate relative position
          this.relativePosition = this.calculateRelativePosition(px);
          
          return OpenLayers.Popup.prototype.draw.apply(this, arguments);
      },
      
      /** 
       * @private
       * 
       * @param {OpenLayers.Pixel} px
       * 
       * @returns The relative position ("br" "tr" "tl "bl") at which the popup
       *           should be placed
       * @type String
       */
      calculateRelativePosition:function(px) {
          var lonlat = this.map.getLonLatFromLayerPx(px);        
          
          var extent = this.map.getExtent();
          var quadrant = extent.determineQuadrant(lonlat);
          
          return OpenLayers.Bounds.oppositeQuadrant(quadrant);
      }, 
  
      /**
      * @param {OpenLayers.Pixel} px
      */
      moveTo: function(px) {
          
          var newPx = this.calculateNewPx(px);
          
          var newArguments = new Array(newPx);        
          OpenLayers.Popup.prototype.moveTo.apply(this, newArguments);
      },
      
      /**
      * @param {OpenLayers.Size} size
      */
      setSize:function(size) { 
          OpenLayers.Popup.prototype.setSize.apply(this, arguments);
  
          if ((this.lonlat) && (this.map)) {
              var px = this.map.getLayerPxFromLonLat(this.lonlat);
              this.moveTo(px);
          }
      },  
      
      /** 
       * @private 
       * 
       * @param {OpenLayers.Pixel} px
       * 
       * @returns The the new px position of the popup on the screen
       *           relative to the passed-in px
       * @type OpenLayers.Pixel
       */
      calculateNewPx:function(px) {
          var newPx = px.offset(this.anchor.offset);
  
          var top = (this.relativePosition.charAt(0) == 't');
          newPx.y += (top) ? -this.size.h : this.anchor.size.h;
          
          var left = (this.relativePosition.charAt(1) == 'l');
          newPx.x += (left) ? -this.size.w : this.anchor.size.w;
  
          return newPx;   
      },
  
      CLASS_NAME: "OpenLayers.Popup.Anchored"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Popup/AnchoredBubble.js
  
  Index: AnchoredBubble.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Popup/Anchored.js
   */
  OpenLayers.Popup.AnchoredBubble = Class.create();
  
  //Border space for the rico corners
  OpenLayers.Popup.AnchoredBubble.CORNER_SIZE = 5;
  
  OpenLayers.Popup.AnchoredBubble.prototype =
     Object.extend( new OpenLayers.Popup.Anchored(), {
  
      /** @type DOMElement */
      contentDiv:null,
  
      
      /** 
      * @constructor
      * 
      * @param {String} id
      * @param {OpenLayers.LonLat} lonlat
      * @param {OpenLayers.Size} size
      * @param {String} contentHTML
      * @param {Object} anchor  Object which must expose a 
      *                         - 'size' (OpenLayers.Size) and 
      *                         - 'offset' (OpenLayers.Pixel) 
      *                         (this is generally an OpenLayers.Icon)
      */
      initialize:function(id, lonlat, size, contentHTML, anchor) {
          OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments);
      },
  
      /** 
      * @param {OpenLayers.Pixel} px
      * 
      * @returns Reference to a div that contains the drawn popup
      * @type DOMElement
      */
      draw: function(px) {
          
          OpenLayers.Popup.Anchored.prototype.draw.apply(this, arguments);
  
          // make the content Div
          var contentSize = this.size.clone();
          contentSize.h -= (2 * OpenLayers.Popup.AnchoredBubble.CORNER_SIZE);
  
          var id = this.div.id + "-contentDiv";
          this.contentDiv = OpenLayers.Util.createDiv(id, null, contentSize, 
                                                      null, "relative", null,
                                                      "hidden");
          this.div.appendChild(this.contentDiv);
          this.setContentHTML();
          
          this.setRicoCorners(true);
          
          //set the popup color and opacity           
          this.setBackgroundColor(); 
          this.setOpacity();
  
          return this.div;
      },
  
      /**
      * @param {OpenLayers.Size} size
      */
      setSize:function(size) { 
          OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments);
          
          if (this.contentDiv != null) {
  
              var contentSize = this.size.clone();
              contentSize.h -= (2 * OpenLayers.Popup.AnchoredBubble.CORNER_SIZE);
      
              this.contentDiv.style.height = contentSize.h + "px";
              
              //size has changed - must redo corners        
              this.setRicoCorners(false);
          }
      },  
  
      /**
       * @param {String} color
       */
      setBackgroundColor:function(color) { 
          if (color != undefined) {
              this.backgroundColor = color; 
          }
          
          if (this.div != null) {
              if (this.contentDiv != null) {
                  this.div.style.background = "transparent";
                  Rico.Corner.changeColor(this.contentDiv, this.backgroundColor);
              }
          }
      },  
      
      /**
       * @param {float} opacity
       */
      setOpacity:function(opacity) { 
          if (opacity != undefined) {
              this.opacity = opacity; 
          }
          
          if (this.div != null) {
              if (this.contentDiv != null) {
              Rico.Corner.changeOpacity(this.contentDiv, this.opacity);
              }
          }
      },  
   
      /** Bubble Popups can not have a border
       * 
       * @param {int} border
       */
      setBorder:function(border) { 
          this.border = 0;
      },      
   
      /**
       * @param {String} contentHTML
       */
      setContentHTML:function(contentHTML) {
          if (contentHTML != null) {
              this.contentHTML = contentHTML;
          }
          
          if (this.contentDiv != null) {
              this.contentDiv.innerHTML = this.contentHTML;
          }    
      },
      
      /** 
       * @private
       * 
       * @param {Boolean} firstTime Is this the first time the corners are being
       *                             rounded?
       * 
       * update the rico corners according to the popup's
       * current relative postion 
       */
      setRicoCorners:function(firstTime) {
      
          var corners = this.getCornersToRound(this.relativePosition);
          var options = {corners: corners,
                           color: this.backgroundColor,
                         bgColor: "transparent",
                           blend: false};
  
          if (firstTime) {
              Rico.Corner.round(this.div, options);
          } else {
              Rico.Corner.reRound(this.contentDiv, options);
              //set the popup color and opacity
              this.setBackgroundColor(); 
              this.setOpacity();
          }
      },
  
      /** 
       * @private
       * 
       * @returns The proper corners string ("tr tl bl br") for rico
       *           to round
       * @type String
       */
      getCornersToRound:function() {
  
          var corners = ['tl', 'tr', 'bl', 'br'];
  
          //we want to round all the corners _except_ the opposite one. 
          var corner = OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);
          corners.remove(corner);
  
          return corners.join(" ");
      },
  
      CLASS_NAME: "OpenLayers.Popup.AnchoredBubble"
  });
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Tile/Image.js
  
  Index: Image.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
  
  /**
   * @class
   * 
   * @requires OpenLayers/Tile.js
   */
  OpenLayers.Tile.Image = Class.create();
  OpenLayers.Tile.Image.prototype = 
    Object.extend( new OpenLayers.Tile(), {
      
      /** @type DOMElement img */
      imgDiv: null,
  
      /** 
      * @constructor
      *
      * @param {OpenLayers.Grid} layer
      * @param {OpenLayers.Pixel} position
      * @param {OpenLayers.Bounds} bounds
      * @param {String} url
      * @param {OpenLayers.Size} size
      */
      initialize: function(layer, position, bounds, url, size) {
          OpenLayers.Tile.prototype.initialize.apply(this, arguments);
      },
      
      /**
       * 
       */
      destroy: function() {
          if ((this.imgDiv != null) && (this.imgDiv.parentNode == this.layer.div)) {
              this.layer.div.removeChild(this.imgDiv);
          }
          this.imgDiv = null;
          OpenLayers.Tile.prototype.destroy.apply(this, arguments);
      },
  
      /**
       * 
       */
      draw:function() {
          OpenLayers.Tile.prototype.draw.apply(this, arguments);
  
          if (this.imgDiv == null) {
              this.initImgDiv();
          }
  
          this.imgDiv.style.display = "none";
          if (this.layer.alpha) {
              OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,
                      null, this.position, this.size, this.url);
          } else {
              this.imgDiv.src = this.url;
              OpenLayers.Util.modifyDOMElement(this.imgDiv,
                      null, this.position, this.size) ;
          }
      },
  
      /** Clear the tile of any bounds/position-related data so that it can 
       *   be reused in a new location.
       */
      clear: function() {
          OpenLayers.Tile.prototype.clear.apply(this, arguments);
          if(this.imgDiv) {
              this.imgDiv.style.display = "none";
          }
      },
  
      /** 
       * @param {OpenLayers.Bounds}
       * @param {OpenLayers.pixel} position
       * @param {Boolean} redraw
       */
      moveTo: function (bounds, position, redraw) {
          this.url = this.layer.getURL(bounds);
          OpenLayers.Tile.prototype.moveTo.apply(this, arguments);
      },
  
      /**
       * 
       */
      initImgDiv: function() {
          if (this.layer.alpha) {
              this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null,
                                                             this.position,
                                                             this.size,
                                                             null,
                                                             "absolute",
                                                             null,
                                                             null,
                                                             true);
          } else {
              this.imgDiv = OpenLayers.Util.createImage(null,
                                                        this.position,
                                                        this.size,
                                                        null,
                                                        "absolute",
                                                        null,
                                                        true);
          }
          this.layer.div.appendChild(this.imgDiv);
      },
  
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Tile.Image"
    }
  );
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/OpenLayers/Tile/WFS.js
  
  Index: WFS.js
  ===================================================================
  /* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
   * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
   * text of the license. */
   
  /**
   * @class
   * 
   * @requires OpenLayers/Tile.js
   */
  OpenLayers.Tile.WFS = Class.create();
  OpenLayers.Tile.WFS.prototype = 
    Object.extend( new OpenLayers.Tile(), {
  
      /** @type Array(OpenLayers.Feature)*/ 
      features: null,
  
      /** @type Array(String) */
      urls: null,
      
      /** 
      * @constructor
      *
      * @param {OpenLayers.Layer} layer
      * @param {OpenLayers.Pixel} position
      * @param {OpenLayers.Bounds} bounds
      * @param {Array} urls
      * @param {OpenLayers.Size} size
      */
      initialize: function(layer, position, bounds, urls, size) {
          var newArguments = arguments;
          if (arguments.length > 0) {
              newArguments = [layer, position, bounds, null, size];
          }
          OpenLayers.Tile.prototype.initialize.apply(this, newArguments);
  
          this.urls = urls;        
          this.features = new Array();
      },
  
      /**
       * 
       */
      destroy: function() {
          OpenLayers.Tile.prototype.destroy.apply(this, arguments);
          this.destroyAllFeatures();
          this.features = null;
          this.urls = null;
      },
  
      /** Clear the tile of any bounds/position-related data so that it can 
       *   be reused in a new location.
       */
      clear: function() {
          OpenLayers.Tile.prototype.clear.apply(this, arguments);
          this.destroyAllFeatures();
      },
      
      /**
       * 
       */
      draw:function() {
          if (this.drawn) {
              this.clear();
          }
          OpenLayers.Tile.prototype.draw.apply(this, arguments);
          this.loadFeaturesForRegion(this.requestSuccess);        
      },
  
      /** get the full request string from the ds and the tile params 
      *     and call the AJAX loadURL(). 
      *
      *     input are function pointers for what to do on success and failure.
      * 
      * @param {function} success
      * @param {function} failure
      */
      loadFeaturesForRegion:function(success, failure) {
  
          if (this.urls != null) {
          
              for(var i=0; i < this.urls.length; i++) {
                  var params = { BBOX:this.bounds.toBBOX() };
                  var url = this.urls[i] + "&" + 
                            OpenLayers.Util.getParameterString(params);
                  OpenLayers.loadURL(url, null, this, success, failure);
              }
          }
      },
      
      /** Return from AJAX request
      *
      * @param {} request
      */
      requestSuccess:function(request) {
          var doc = request.responseXML;
          
          if (!doc || request.fileType!="XML") {
              doc = OpenLayers.parseXMLString(request.responseText);
          }
          
          var resultFeatures = doc.getElementsByTagName("featureMember");
              
          this.addResults(resultFeatures);
      },
  
      /**
       * @param {Object} results
       */
      addResults: function(results) {
          for (var i=0; i < results.length; i++) {
              var feature = new this.layer.featureClass(this.layer, 
                                                        results[i]);
              this.features.push(feature);
          }
      },
  
      /** Iterate through and call destroy() on each feature, removing it from
       *   the local array
       * 
       * @private
       */
      destroyAllFeatures: function() {
          while(this.features.length > 0) {
              var feature = this.features.shift();
              feature.destroy();
          }
      },
      
      /** @final @type String */
      CLASS_NAME: "OpenLayers.Tile.WFS"
    }
  );
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/Rico/Color.js
  
  Index: Color.js
  ===================================================================
  Rico.Color = Class.create();
  
  Rico.Color.prototype = {
  
     initialize: function(red, green, blue) {
        this.rgb = { r: red, g : green, b : blue };
     },
  
     setRed: function(r) {
        this.rgb.r = r;
     },
  
     setGreen: function(g) {
        this.rgb.g = g;
     },
  
     setBlue: function(b) {
        this.rgb.b = b;
     },
  
     setHue: function(h) {
  
        // get an HSB model, and set the new hue...
        var hsb = this.asHSB();
        hsb.h = h;
  
        // convert back to RGB...
        this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b);
     },
  
     setSaturation: function(s) {
        // get an HSB model, and set the new hue...
        var hsb = this.asHSB();
        hsb.s = s;
  
        // convert back to RGB and set values...
        this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b);
     },
  
     setBrightness: function(b) {
        // get an HSB model, and set the new hue...
        var hsb = this.asHSB();
        hsb.b = b;
  
        // convert back to RGB and set values...
        this.rgb = Rico.Color.HSBtoRGB( hsb.h, hsb.s, hsb.b );
     },
  
     darken: function(percent) {
        var hsb  = this.asHSB();
        this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.max(hsb.b - percent,0));
     },
  
     brighten: function(percent) {
        var hsb  = this.asHSB();
        this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.min(hsb.b + percent,1));
     },
  
     blend: function(other) {
        this.rgb.r = Math.floor((this.rgb.r + other.rgb.r)/2);
        this.rgb.g = Math.floor((this.rgb.g + other.rgb.g)/2);
        this.rgb.b = Math.floor((this.rgb.b + other.rgb.b)/2);
     },
  
     isBright: function() {
        var hsb = this.asHSB();
        return this.asHSB().b > 0.5;
     },
  
     isDark: function() {
        return ! this.isBright();
     },
  
     asRGB: function() {
        return "rgb(" + this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")";
     },
  
     asHex: function() {
        return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart();
     },
  
     asHSB: function() {
        return Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b);
     },
  
     toString: function() {
        return this.asHex();
     }
  
  };
  
  Rico.Color.createFromHex = function(hexCode) {
    if(hexCode.length==4) {
      var shortHexCode = hexCode; 
      var hexCode = '#';
      for(var i=1;i<4;i++) hexCode += (shortHexCode.charAt(i) + 
  shortHexCode.charAt(i));
    }
     if ( hexCode.indexOf('#') == 0 )
        hexCode = hexCode.substring(1);
     var red   = hexCode.substring(0,2);
     var green = hexCode.substring(2,4);
     var blue  = hexCode.substring(4,6);
     return new Rico.Color( parseInt(red,16), parseInt(green,16), parseInt(blue,16) );
  }
  
  /**
   * Factory method for creating a color from the background of
   * an HTML element.
   */
  Rico.Color.createColorFromBackground = function(elem) {
  
     var actualColor = RicoUtil.getElementsComputedStyle($(elem), "backgroundColor", "background-color");
  
     if ( actualColor == "transparent" && elem.parentNode )
        return Rico.Color.createColorFromBackground(elem.parentNode);
  
     if ( actualColor == null )
        return new Rico.Color(255,255,255);
  
     if ( actualColor.indexOf("rgb(") == 0 ) {
        var colors = actualColor.substring(4, actualColor.length - 1 );
        var colorArray = colors.split(",");
        return new Rico.Color( parseInt( colorArray[0] ),
                              parseInt( colorArray[1] ),
                              parseInt( colorArray[2] )  );
  
     }
     else if ( actualColor.indexOf("#") == 0 ) {
        return Rico.Color.createFromHex(actualColor);
     }
     else
        return new Rico.Color(255,255,255);
  }
  
  Rico.Color.HSBtoRGB = function(hue, saturation, brightness) {
  
     var red   = 0;
      var green = 0;
      var blue  = 0;
  
     if (saturation == 0) {
        red = parseInt(brightness * 255.0 + 0.5);
         green = red;
         blue = red;
      }
      else {
        var h = (hue - Math.floor(hue)) * 6.0;
        var f = h - Math.floor(h);
        var p = brightness * (1.0 - saturation);
        var q = brightness * (1.0 - saturation * f);
        var t = brightness * (1.0 - (saturation * (1.0 - f)));
  
        switch (parseInt(h)) {
           case 0:
              red   = (brightness * 255.0 + 0.5);
              green = (t * 255.0 + 0.5);
              blue  = (p * 255.0 + 0.5);
              break;
           case 1:
              red   = (q * 255.0 + 0.5);
              green = (brightness * 255.0 + 0.5);
              blue  = (p * 255.0 + 0.5);
              break;
           case 2:
              red   = (p * 255.0 + 0.5);
              green = (brightness * 255.0 + 0.5);
              blue  = (t * 255.0 + 0.5);
              break;
           case 3:
              red   = (p * 255.0 + 0.5);
              green = (q * 255.0 + 0.5);
              blue  = (brightness * 255.0 + 0.5);
              break;
           case 4:
              red   = (t * 255.0 + 0.5);
              green = (p * 255.0 + 0.5);
              blue  = (brightness * 255.0 + 0.5);
              break;
            case 5:
              red   = (brightness * 255.0 + 0.5);
              green = (p * 255.0 + 0.5);
              blue  = (q * 255.0 + 0.5);
              break;
          }
      }
  
     return { r : parseInt(red), g : parseInt(green) , b : parseInt(blue) };
  }
  
  Rico.Color.RGBtoHSB = function(r, g, b) {
  
     var hue;
     var saturation;
     var brightness;
  
     var cmax = (r > g) ? r : g;
     if (b > cmax)
        cmax = b;
  
     var cmin = (r < g) ? r : g;
     if (b < cmin)
        cmin = b;
  
     brightness = cmax / 255.0;
     if (cmax != 0)
        saturation = (cmax - cmin)/cmax;
     else
        saturation = 0;
  
     if (saturation == 0)
        hue = 0;
     else {
        var redc   = (cmax - r)/(cmax - cmin);
          var greenc = (cmax - g)/(cmax - cmin);
          var bluec  = (cmax - b)/(cmax - cmin);
  
          if (r == cmax)
             hue = bluec - greenc;
          else if (g == cmax)
             hue = 2.0 + redc - bluec;
        else
             hue = 4.0 + greenc - redc;
  
          hue = hue / 6.0;
          if (hue < 0)
             hue = hue + 1.0;
     }
  
     return { h : hue, s : saturation, b : brightness };
  }
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/lib/Rico/Corner.js
  
  Index: Corner.js
  ===================================================================
  /**  
  *  
  *  Copyright 2005 Sabre Airline Solutions  
  *  
  *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this  
  *  file except in compliance with the License. You may obtain a copy of the License at  
  *  
  *         http://www.apache.org/licenses/LICENSE-2.0  
  *  
  *  Unless required by applicable law or agreed to in writing, software distributed under the  
  *  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,  
  *  either express or implied. See the License for the specific language governing permissions  
  *  and limitations under the License.  
  **/  
  
  
  var Rico = new Object();
  Rico.Corner = {
  
     round: function(e, options) {
        var e = $(e);
        this._setOptions(options);
  
        var color = this.options.color;
        if ( this.options.color == "fromElement" )
           color = this._background(e);
  
        var bgColor = this.options.bgColor;
        if ( this.options.bgColor == "fromParent" )
           bgColor = this._background(e.offsetParent);
  
        this._roundCornersImpl(e, color, bgColor);
     },
  
      /**   This is a helper function to change the background
      *     color of <div> that has had Rico rounded corners added.
      *
      *     It seems we cannot just set the background color for the
      *     outer <div> so each <span> element used to create the
      *     corners must have its background color set individually.
      *
      * @param {DOM} theDiv - A child of the outer <div> that was
      *                        supplied to the `round` method.
      *
      * @param {String} newColor - The new background color to use.
      */
      changeColor: function(theDiv, newColor) {
     
          theDiv.style.backgroundColor = newColor;
  
          var spanElements = theDiv.parentNode.getElementsByTagName("span");
          
          for (var currIdx = 0; currIdx < spanElements.length; currIdx++) {
              spanElements[currIdx].style.backgroundColor = newColor;
          }
      }, 
  
  
      /**   This is a helper function to change the background
      *     opacity of <div> that has had Rico rounded corners added.
      *
      *     See changeColor (above) for algorithm explanation
      *
      * @param {DOM} theDiv A child of the outer <div> that was
      *                        supplied to the `round` method.
      *
      * @param {int} newOpacity The new opacity to use (0-1).
      */
      changeOpacity: function(theDiv, newOpacity) {
     
          var mozillaOpacity = newOpacity;
          var ieOpacity = 'alpha(opacity=' + newOpacity * 100 + ')';
          
          theDiv.style.opacity = mozillaOpacity;
          theDiv.style.filter = ieOpacity;
  
          var spanElements = theDiv.parentNode.getElementsByTagName("span");
          
          for (var currIdx = 0; currIdx < spanElements.length; currIdx++) {
              spanElements[currIdx].style.opacity = mozillaOpacity;
              spanElements[currIdx].style.filter = ieOpacity;
          }
  
      },
  
      /** this function takes care of redoing the rico cornering
      *    
      *    you can't just call updateRicoCorners() again and pass it a 
      *    new options string. you have to first remove the divs that 
      *    rico puts on top and below the content div.
      *
      * @param {DOM} theDiv - A child of the outer <div> that was
      *                        supplied to the `round` method.
      *
      * @param {Array} options - list of options
      */
      reRound: function(theDiv, options) {
  
          var topRico = theDiv.parentNode.childNodes[0];
          //theDiv would be theDiv.parentNode.childNodes[1]
          var bottomRico = theDiv.parentNode.childNodes[2];
         
          theDiv.parentNode.removeChild(topRico);
          theDiv.parentNode.removeChild(bottomRico); 
  
          this.round(theDiv.parentNode, options);
      }, 
  
     _roundCornersImpl: function(e, color, bgColor) {
        if(this.options.border)
           this._renderBorder(e,bgColor);
        if(this._isTopRounded())
           this._roundTopCorners(e,color,bgColor);
        if(this._isBottomRounded())
           this._roundBottomCorners(e,color,bgColor);
     },
  
     _renderBorder: function(el,bgColor) {
        var borderValue = "1px solid " + this._borderColor(bgColor);
        var borderL = "border-left: "  + borderValue;
        var borderR = "border-right: " + borderValue;
        var style   = "style='" + borderL + ";" + borderR +  "'";
        el.innerHTML = "<div " + style + ">" + el.innerHTML + "</div>"
     },
  
     _roundTopCorners: function(el, color, bgColor) {
        var corner = this._createCorner(bgColor);
        for(var i=0 ; i < this.options.numSlices ; i++ )
           corner.appendChild(this._createCornerSlice(color,bgColor,i,"top"));
        el.style.paddingTop = 0;
        el.insertBefore(corner,el.firstChild);
     },
  
     _roundBottomCorners: function(el, color, bgColor) {
        var corner = this._createCorner(bgColor);
        for(var i=(this.options.numSlices-1) ; i >= 0 ; i-- )
           corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));
        el.style.paddingBottom = 0;
        el.appendChild(corner);
     },
  
     _createCorner: function(bgColor) {
        var corner = document.createElement("div");
        corner.style.backgroundColor = (this._isTransparent() ? "transparent" : bgColor);
        return corner;
     },
  
     _createCornerSlice: function(color,bgColor, n, position) {
        var slice = document.createElement("span");
  
        var inStyle = slice.style;
        inStyle.backgroundColor = color;
        inStyle.display  = "block";
        inStyle.height   = "1px";
        inStyle.overflow = "hidden";
        inStyle.fontSize = "1px";
  
        var borderColor = this._borderColor(color,bgColor);
        if ( this.options.border && n == 0 ) {
           inStyle.borderTopStyle    = "solid";
           inStyle.borderTopWidth    = "1px";
           inStyle.borderLeftWidth   = "0px";
           inStyle.borderRightWidth  = "0px";
           inStyle.borderBottomWidth = "0px";
           inStyle.height            = "0px"; // assumes css compliant box model
           inStyle.borderColor       = borderColor;
        }
        else if(borderColor) {
           inStyle.borderColor = borderColor;
           inStyle.borderStyle = "solid";
           inStyle.borderWidth = "0px 1px";
        }
  
        if ( !this.options.compact && (n == (this.options.numSlices-1)) )
           inStyle.height = "2px";
  
        this._setMargin(slice, n, position);
        this._setBorder(slice, n, position);
        return slice;
     },
  
     _setOptions: function(options) {
        this.options = {
           corners : "all",
           color   : "fromElement",
           bgColor : "fromParent",
           blend   : true,
           border  : false,
           compact : false
        }
        Object.extend(this.options, options || {});
  
        this.options.numSlices = this.options.compact ? 2 : 4;
        if ( this._isTransparent() )
           this.options.blend = false;
     },
  
     _whichSideTop: function() {
        if ( this._hasString(this.options.corners, "all", "top") )
           return "";
  
        if ( this.options.corners.indexOf("tl") >= 0 && this.options.corners.indexOf("tr") >= 0 )
           return "";
  
        if (this.options.corners.indexOf("tl") >= 0)
           return "left";
        else if (this.options.corners.indexOf("tr") >= 0)
            return "right";
        return "";
     },
  
     _whichSideBottom: function() {
        if ( this._hasString(this.options.corners, "all", "bottom") )
           return "";
  
        if ( this.options.corners.indexOf("bl")>=0 && this.options.corners.indexOf("br")>=0 )
           return "";
  
        if(this.options.corners.indexOf("bl") >=0)
           return "left";
        else if(this.options.corners.indexOf("br")>=0)
           return "right";
        return "";
     },
  
     _borderColor : function(color,bgColor) {
        if ( color == "transparent" )
           return bgColor;
        else if ( this.options.border )
           return this.options.border;
        else if ( this.options.blend )
           return this._blend( bgColor, color );
        else
           return "";
     },
  
  
     _setMargin: function(el, n, corners) {
        var marginSize = this._marginSize(n);
        var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom();
  
        if ( whichSide == "left" ) {
           el.style.marginLeft = marginSize + "px"; el.style.marginRight = "0px";
        }
        else if ( whichSide == "right" ) {
           el.style.marginRight = marginSize + "px"; el.style.marginLeft  = "0px";
        }
        else {
           el.style.marginLeft = marginSize + "px"; el.style.marginRight = marginSize + "px";
        }
     },
  
     _setBorder: function(el,n,corners) {
        var borderSize = this._borderSize(n);
        var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom();
        if ( whichSide == "left" ) {
           el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = "0px";
        }
        else if ( whichSide == "right" ) {
           el.style.borderRightWidth = borderSize + "px"; el.style.borderLeftWidth  = "0px";
        }
        else {
           el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px";
        }
        if (this.options.border != false)
          el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px";
     },
  
     _marginSize: function(n) {
        if ( this._isTransparent() )
           return 0;
  
        var marginSizes          = [ 5, 3, 2, 1 ];
        var blendedMarginSizes   = [ 3, 2, 1, 0 ];
        var compactMarginSizes   = [ 2, 1 ];
        var smBlendedMarginSizes = [ 1, 0 ];
  
        if ( this.options.compact && this.options.blend )
           return smBlendedMarginSizes[n];
        else if ( this.options.compact )
           return compactMarginSizes[n];
        else if ( this.options.blend )
           return blendedMarginSizes[n];
        else
           return marginSizes[n];
     },
  
     _borderSize: function(n) {
        var transparentBorderSizes = [ 5, 3, 2, 1 ];
        var blendedBorderSizes     = [ 2, 1, 1, 1 ];
        var compactBorderSizes     = [ 1, 0 ];
        var actualBorderSizes      = [ 0, 2, 0, 0 ];
  
        if ( this.options.compact && (this.options.blend || this._isTransparent()) )
           return 1;
        else if ( this.options.compact )
           return compactBorderSizes[n];
        else if ( this.options.blend )
           return blendedBorderSizes[n];
        else if ( this.options.border )
           return actualBorderSizes[n];
        else if ( this._isTransparent() )
           return transparentBorderSizes[n];
        return 0;
     },
  
     _hasString: function(str) { for(var i=1 ; i<arguments.length ; i++) if (str.indexOf(arguments[i]) >= 0) return true; return false; },
     _blend: function(c1, c2) { var cc1 = Rico.Color.createFromHex(c1); cc1.blend(Rico.Color.createFromHex(c2)); return cc1; },
     _background: function(el) { try { return Rico.Color.createColorFromBackground(el).asHex(); } catch(err) { return "#ffffff"; } },
     _isTransparent: function() { return this.options.color == "transparent"; },
     _isTopRounded: function() { return this._hasString(this.options.corners, "all", "top", "tl", "tr"); },
     _isBottomRounded: function() { return this._hasString(this.options.corners, "all", "bottom", "bl", "br"); },
     _hasSingleTextChild: function(el) { return el.childNodes.length == 1 && el.childNodes[0].nodeType == 3; }
  }
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/README.txt
  
  Index: README.txt
  ===================================================================
  This directory contains unit tests for the OpenLayers library.
  
  Tests use the Test.AnotherWay library from <http://openjsan.org>. The test
  runner is 'run-tests.html' and new test files need to be added to
  'list-tests.html'.
  
  The following file naming conventions are used:
  
    * A filename that starts with `test_` and has an `.html` extension
      contains tests. These should contain tests for a specific class.
  
    * A filename starting with `page_` and has an `.html` extension is a
      supporting HTML file used in one or more tests.
  
    * A filename starting with 'data_` is a supporting data file used in one
      or more tests.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/data_Layer_Text_textfile.txt
  
  Index: data_Layer_Text_textfile.txt
  ===================================================================
  point	image
  10,20	http://boston.openguides.org/markers/ORANGE.png
  15,25	http://boston.openguides.org/markers/ORANGE.png
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/georss.txt
  
  Index: georss.txt
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/css" href="/css/rss.css" ?>
  
  <rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://purl.org/rss/1.0/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:georss="http://www.georss.org/georss">
  <docs>This is an RSS file.  Copy the URL into your aggregator of choice.  If you don't know what this means and want to learn more, please see: <span>http://platial.typepad.com/news/2006/04/really_simple_t.html</span> for more info.</docs><channel rdf:about="http://platial.com">
  <link>http://platial.com</link>
  <title>Crschmidt's Places At Platial</title>
  <description></description>
  <items>
  <rdf:Seq>
  <rdf:li resource="http://platial.com/place/90306"/>
  <rdf:li resource="http://platial.com/place/67230"/>
  <rdf:li resource="http://platial.com/place/65645"/>
  <rdf:li resource="http://platial.com/place/62200"/>
  <rdf:li resource="http://platial.com/place/28232"/>
  <rdf:li resource="http://platial.com/place/43666"/>
  <rdf:li resource="http://platial.com/place/28394"/>
  <rdf:li resource="http://platial.com/place/28251"/>
  <rdf:li resource="http://platial.com/place/28392"/>
  <rdf:li resource="http://platial.com/place/28391"/>
  <rdf:li resource="http://platial.com/place/28231"/>
  <rdf:li resource="http://platial.com/place/28393"/>
  <rdf:li resource="http://platial.com/place/31685"/>
  <rdf:li resource="http://platial.com/place/28596"/>
  <rdf:li resource="http://platial.com/place/28595"/>
  <rdf:li resource="http://platial.com/place/28594"/>
  <rdf:li resource="http://platial.com/place/28593"/>
  <rdf:li resource="http://platial.com/place/28592"/>
  <rdf:li resource="http://platial.com/place/28591"/>
  <rdf:li resource="http://platial.com/place/28590"/>
  <rdf:li resource="http://platial.com/place/28589"/>
  <rdf:li resource="http://platial.com/place/28588"/>
  <rdf:li resource="http://platial.com/place/28587"/>
  <rdf:li resource="http://platial.com/place/28586"/>
  <rdf:li resource="http://platial.com/place/28585"/>
  <rdf:li resource="http://platial.com/place/28584"/>
  <rdf:li resource="http://platial.com/place/28583"/>
  <rdf:li resource="http://platial.com/place/28582"/>
  <rdf:li resource="http://platial.com/place/28581"/>
  <rdf:li resource="http://platial.com/place/28580"/>
  <rdf:li resource="http://platial.com/place/28579"/>
  <rdf:li resource="http://platial.com/place/28578"/>
  <rdf:li resource="http://platial.com/place/28577"/>
  <rdf:li resource="http://platial.com/place/28576"/>
  <rdf:li resource="http://platial.com/place/28575"/>
  <rdf:li resource="http://platial.com/place/28574"/>
  <rdf:li resource="http://platial.com/place/28573"/>
  <rdf:li resource="http://platial.com/place/28572"/>
  <rdf:li resource="http://platial.com/place/28571"/>
  <rdf:li resource="http://platial.com/place/28570"/>
  </rdf:Seq>
  </items>
  </channel>
  <item rdf:about="http://platial.com/place/90306">
  <link>http://platial.com/place/90306</link>
  <title>Knitting Room</title>
  <description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington, MA <br/>Tags: knitting, yarn, pins and needles, handspun, hand dyed, novelty yarn, fancy, simple, young, hip, friendly, needles, addy, cute hats<br /><br /><a href="http://platial.com/place/90306">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/90306">Grab this on Platial</a> ]]></description>
  <georss:point>42.405696 -71.142197</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-06-08T17:35:01.942452+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/67230">
  <link>http://platial.com/place/67230</link>
  <title>Knitting Room</title>
  <description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington, MA <br/>Tags: knitting, yarn, pins and needles, handspun, hand dyed, novelty yarn, fancy, simple, young, hip, friendly, needles, addy, cute hats<br /><br /><a href="http://platial.com/place/67230">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/67230">Grab this on Platial</a> ]]></description>
  <georss:point>42.405524 -71.142273</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-04-24T11:35:26.733857+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/65645">
  <link>http://platial.com/place/65645</link>
  <title>†¢¢™£ˆøœ</title>
  <description><![CDATA[ijeª£∆µˆ˚î<br/>Address: 151 Erie St., Cambridge, MA<br/>Tags: platial graffiti<br /><br /><a href="http://platial.com/place/65645">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/65645">Grab this on Platial</a> ]]></description>
  <georss:point>42.352455 -71.110210</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-04-20T08:56:12.696224+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/62200">
  <link>http://platial.com/place/62200</link>
  <title>Allen Hall</title>
  <description><![CDATA[My dorm at UIUC.<br/>Address: 1301 W Gregory Dr, Urbana, IL<br/>Tags: dorm, uiuc, college<br/><a href="http://platial.com/place/62200"><img src="http://platial.comhttp://static.flickr.com/4/8576450_0d59cc2531_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/62200">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/62200">Grab this on Platial</a> ]]></description>
  <georss:point>40.104172 -88.220623</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-04-14T08:01:01.872873+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28232">
  <link>http://platial.com/place/28232</link>
  <title>Bagby Hot Springs, OR</title>
  <description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C. However, the area around the springs are not exactly well looked upon by people who know the place.
  
  <br/>Tags: 20s, rosalie, romance, childhood, hike, camping, soak, relax, beautiful, hot springs, bathhouse, favorite, popular, crowded, organized, honeymoon tub, plumbing made from hollowed out trees, hot springs, mt hood, notorious car break in spot, rash, bacteria<br /><br /><a href="http://platial.com/place/28232">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28232">Grab this on Platial</a> ]]></description>
  <georss:point>44.936000 -122.173000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:10:18.553063+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/43666">
  <link>http://platial.com/place/43666</link>
  <title>Shooting Location for "The Field of Dreams" Film</title>
  <description><![CDATA[1989's Field of Dreams was a Best Picture Academy Award nominee, and the baseball field in the cornfield still stands today, and has become quite a tourist destination.  Games are occasionally played at the field, re-enacting professional baseball at the turn of the 20th Century.<br/>Address: Dyersville, Iowa<br/>Tags: iowa, baseball, movie locations, field of dreams, kevin costner, costner, dyersville, kinsella, james earl jones, chicago black sox, shoeless joe, joe jackson, famous farms, film, movie, cinema, shooting location<br /><br /><a href="http://platial.com/place/43666">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/43666">Grab this on Platial</a> ]]></description>
  <georss:point>42.481213 -91.111679</georss:point>
  <dc:creator>echinodermata</dc:creator>
  <dc:date>2006-03-23T11:40:17.654061+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28394">
  <link>http://platial.com/place/28394</link>
  <title>Moffetts (Bonneville) Hot Springs, WA</title>
  <description><![CDATA[Hot spring, temperature: 97  degress F, 36  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28394">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28394">Grab this on Platial</a> ]]></description>
  <georss:point>45.658000 -121.962000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:16:27.329816+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28251">
  <link>http://platial.com/place/28251</link>
  <title>Austin Hot Springs, OR</title>
  <description><![CDATA[Hot spring, temperature: 186  degress F, 86  degress C<br/>Tags: soak, hot springs, relax, nature, popular, crowded<br /><br /><a href="http://platial.com/place/28251">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28251">Grab this on Platial</a> ]]></description>
  <georss:point>45.021000 -122.009000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:11:04.489886+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28392">
  <link>http://platial.com/place/28392</link>
  <title>Rock Creek Hot Springs, WA</title>
  <description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28392">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28392">Grab this on Platial</a> ]]></description>
  <georss:point>45.723000 -121.927000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:16:22.636855+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28391">
  <link>http://platial.com/place/28391</link>
  <title>St. Martins (Wind River) Hot Springs, WA</title>
  <description><![CDATA[Hot spring, temperature: 120  degress F, 49  degress C<br/>Tags: hot springs, soak, relax, nature, wonderful<br /><br /><a href="http://platial.com/place/28391">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28391">Grab this on Platial</a> ]]></description>
  <georss:point>45.728000 -121.800000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:16:20.383244+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28231">
  <link>http://platial.com/place/28231</link>
  <title>Breitenbush Hot Springs, OR</title>
  <description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br/>Tags: hot springs, resort, relax, nature, beautiful, http:www.breitenbush.com, soaking<br /><br /><a href="http://platial.com/place/28231">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28231">Grab this on Platial</a> ]]></description>
  <georss:point>44.782000 -121.975000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:10:16.529195+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28393">
  <link>http://platial.com/place/28393</link>
  <title>Collins Hot Springs, WA</title>
  <description><![CDATA[Hot spring, temperature: 122  degress F, 50  degress C<br/>Tags: portland, nice, hot springs, soak<br /><br /><a href="http://platial.com/place/28393">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28393">Grab this on Platial</a> ]]></description>
  <georss:point>45.701000 -121.728000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:16:24.648745+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/31685">
  <link>http://platial.com/place/31685</link>
  <title>Darwin's Ltd.</title>
  <description><![CDATA[Nice little coffee shop/cafe, free Wifi, close enough to walk from Harvard Square.<br/>Address: 148 Mount Auburn St, Cambridge, MA<br/>Tags: coffee, beer, sandwiches, freewifi<br/><a href="http://platial.com/place/31685"><img src="http://platial.comhttp://static.flickr.com/38/84885937_74fd3d1025_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/31685">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/31685">Grab this on Platial</a> ]]></description>
  <georss:point>42.373974 -71.125053</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-10T09:24:08.152985+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28596">
  <link>http://platial.com/place/28596</link>
  <title>Huckleberry Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: Boiling  degress F, Boiling  degress C<br /><br /><a href="http://platial.com/place/28596">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28596">Grab this on Platial</a> ]]></description>
  <georss:point>44.115000 -110.684000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:32.283094+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28595">
  <link>http://platial.com/place/28595</link>
  <title>South Entrance Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 156  degress F, 69  degress C<br/><a href="http://platial.com/place/28595"><img src="http://platial.comhttp://static.flickr.com/52/130989872_f1457f68b5_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28595">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28595">Grab this on Platial</a> ]]></description>
  <georss:point>44.142000 -110.656000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:30.279497+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28594">
  <link>http://platial.com/place/28594</link>
  <title>Crawfish Creek Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br/><a href="http://platial.com/place/28594"><img src="http://platial.comhttp://static.flickr.com/52/128312256_d6a879924c_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28594">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28594">Grab this on Platial</a> ]]></description>
  <georss:point>44.157000 -110.699000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:28.280271+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28593">
  <link>http://platial.com/place/28593</link>
  <title>Crawfish Creek Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 138  degress F, 59  degress C<br /><br /><a href="http://platial.com/place/28593">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28593">Grab this on Platial</a> ]]></description>
  <georss:point>44.165000 -110.723000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:20.364077+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28592">
  <link>http://platial.com/place/28592</link>
  <title>Snake Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br /><br /><a href="http://platial.com/place/28592">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28592">Grab this on Platial</a> ]]></description>
  <georss:point>44.169000 -110.583000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:12.234974+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28591">
  <link>http://platial.com/place/28591</link>
  <title>Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 142  degress F, 61  degress C<br /><br /><a href="http://platial.com/place/28591">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28591">Grab this on Platial</a> ]]></description>
  <georss:point>44.187000 -110.726000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:10.027857+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28590">
  <link>http://platial.com/place/28590</link>
  <title>Hot Springs on Upper Snake River, WY</title>
  <description><![CDATA[Hot spring, temperature: 167  degress F, 75  degress C<br /><br /><a href="http://platial.com/place/28590">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28590">Grab this on Platial</a> ]]></description>
  <georss:point>44.204000 -110.486000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:07.79658+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28589">
  <link>http://platial.com/place/28589</link>
  <title>Hot Springs on lewis Lake, WY</title>
  <description><![CDATA[Hot spring, temperature: 154  degress F, 68  degress C<br /><br /><a href="http://platial.com/place/28589">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28589">Grab this on Platial</a> ]]></description>
  <georss:point>44.276000 -110.636000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:05.683418+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28588">
  <link>http://platial.com/place/28588</link>
  <title>Rustic Geyser, WY</title>
  <description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28588">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28588">Grab this on Platial</a> ]]></description>
  <georss:point>44.282000 -110.506000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:03.66329+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28587">
  <link>http://platial.com/place/28587</link>
  <title>Bechler River Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 194  degress F, 90  degress C<br /><br /><a href="http://platial.com/place/28587">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28587">Grab this on Platial</a> ]]></description>
  <georss:point>44.285000 -110.900000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:24:01.611442+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28586">
  <link>http://platial.com/place/28586</link>
  <title>Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28586">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28586">Grab this on Platial</a> ]]></description>
  <georss:point>44.290000 -110.504000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:59.658699+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28585">
  <link>http://platial.com/place/28585</link>
  <title>Heart Lake Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature:  Middle Group  degress F, 174  degress C<br /><br /><a href="http://platial.com/place/28585">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28585">Grab this on Platial</a> ]]></description>
  <georss:point>44.299000 -110.517000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:57.181801+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28584">
  <link>http://platial.com/place/28584</link>
  <title>Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28584">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28584">Grab this on Platial</a> ]]></description>
  <georss:point>44.307000 -110.526000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:55.240485+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28583">
  <link>http://platial.com/place/28583</link>
  <title>Hot Springs on lewis Lake, WY</title>
  <description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28583">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28583">Grab this on Platial</a> ]]></description>
  <georss:point>44.309000 -110.654000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:53.22295+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28582">
  <link>http://platial.com/place/28582</link>
  <title>Shoshone Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28582">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28582">Grab this on Platial</a> ]]></description>
  <georss:point>44.354000 -110.800000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:51.179049+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28581">
  <link>http://platial.com/place/28581</link>
  <title>Hot Springs on Continental Divide, WY</title>
  <description><![CDATA[Hot spring, temperature: 189  degress F, 87  degress C<br /><br /><a href="http://platial.com/place/28581">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28581">Grab this on Platial</a> ]]></description>
  <georss:point>44.401000 -110.936000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:49.077176+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28580">
  <link>http://platial.com/place/28580</link>
  <title>Hot Springs on Upper Firehole River, WY</title>
  <description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28580">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28580">Grab this on Platial</a> ]]></description>
  <georss:point>44.404000 -110.824000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:47.054664+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28579">
  <link>http://platial.com/place/28579</link>
  <title>Summit Lake Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 162  degress F, 72  degress C<br /><br /><a href="http://platial.com/place/28579">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28579">Grab this on Platial</a> ]]></description>
  <georss:point>44.410000 -110.953000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:45.039394+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28578">
  <link>http://platial.com/place/28578</link>
  <title>Lone Star Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature:  Footbridge  degress F, 183  degress C<br /><br /><a href="http://platial.com/place/28578">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28578">Grab this on Platial</a> ]]></description>
  <georss:point>44.414000 -110.817000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:42.938808+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28577">
  <link>http://platial.com/place/28577</link>
  <title>West. Thumb Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28577">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28577">Grab this on Platial</a> ]]></description>
  <georss:point>44.417000 -110.570000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:40.90238+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28576">
  <link>http://platial.com/place/28576</link>
  <title>Lone Star Geyser, WY</title>
  <description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28576">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28576">Grab this on Platial</a> ]]></description>
  <georss:point>44.418000 -110.805000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:38.844625+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28575">
  <link>http://platial.com/place/28575</link>
  <title>Smoke Jumper Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28575">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28575">Grab this on Platial</a> ]]></description>
  <georss:point>44.421000 -110.952000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:36.818513+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28574">
  <link>http://platial.com/place/28574</link>
  <title>West. Thumb Geyser Basin, WY</title>
  <description><![CDATA[Hot spring, temperature: 196  degress F, 91  degress C<br /><br /><a href="http://platial.com/place/28574">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28574">Grab this on Platial</a> ]]></description>
  <georss:point>44.422000 -110.574000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:34.767729+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28573">
  <link>http://platial.com/place/28573</link>
  <title>Potts Hot Spring Basin, WY</title>
  <description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28573">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28573">Grab this on Platial</a> ]]></description>
  <georss:point>44.433000 -110.581000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:32.749915+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28572">
  <link>http://platial.com/place/28572</link>
  <title>Hot Springs, WY</title>
  <description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28572">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28572">Grab this on Platial</a> ]]></description>
  <georss:point>44.433000 -110.813000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:30.829745+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28571">
  <link>http://platial.com/place/28571</link>
  <title>Hot Springs on Continental Divide, WY</title>
  <description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28571">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28571">Grab this on Platial</a> ]]></description>
  <georss:point>44.438000 -110.977000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:28.730401+00:00</dc:date>
  </item>
  <item rdf:about="http://platial.com/place/28570">
  <link>http://platial.com/place/28570</link>
  <title>SouthEastern Group, WY</title>
  <description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28570">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28570">Grab this on Platial</a> ]]></description>
  <georss:point>44.459000 -110.817000</georss:point>
  <dc:creator>crschmidt</dc:creator>
  <dc:date>2006-01-03T23:23:26.706763+00:00</dc:date>
  </item>
  </rdf:RDF>
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/list-tests.html
  
  Index: list-tests.html
  ===================================================================
  <ul id="testlist">
      <li>test_Pixel.html</li>
      <li>test_Size.html</li>
      <li>test_LonLat.html</li>
      <li>test_Icon.html</li>
      <li>test_Marker.html</li>
      <li>test_Popup.html</li>
      <li>test_Feature.html</li>
      <li>test_Bounds.html</li>
      <li>test_Events.html</li>
      <li>test_Util.html</li>
      <li>test_Layer.html</li>
      <li>test_Layer_EventPane.html</li>
      <li>test_Layer_HTTPRequest.html</li>
      <li>test_Layer_Grid.html</li>
      <li>test_Layer_Markers.html</li>
      <li>test_Layer_Text.html</li>
      <li>test_Layer_GeoRSS.html</li>
      <li>test_Layer_KaMap.html</li>
      <li>test_Layer_WMS.html</li>
      <li>test_Layer_Google.html</li>
      <li>test_Tile.html</li>
      <li>test_Tile_Image.html</li>
      <li>test_Control.html</li>
      <li>test_Control_MouseToolbar.html</li>
      <li>test_Control_LayerSwitcher.html</li>
      <li>test_Control_PanZoom.html</li>
      <li>test_Control_PanZoomBar.html</li>
      <li>test_Control_Permalink.html</li>
      <li>test_Map.html</li>
  </ul>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/run-tests.html
  
  Index: run-tests.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  <html><head><title> Run the testsuite</title>
  <noscript>Javascript is disabled in your browser. This page cannot be displayed correctly without Javascript. Sorry. <br/> If you want to view this page, please change your browser settings so that Javascript is enabled.</noscript>
  <!--
  Test.AnotherWay version 0.5
  
  Copyright (c) 2005 Artem Khodush, http://straytree.org
  
  Permission is hereby granted, free of charge, to any person obtaining
  a copy of this software and associated documentation files (the
  "Software"), to deal in the Software without restriction, including
  without limitation the rights to use, copy, modify, merge, publish,
  distribute, sublicense, and/or sell copies of the Software, and to
  permit persons to whom the Software is furnished to do so, subject to
  the following conditions:
  
  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software.
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  -->
  <style type="text/css">
  * { padding: 0; margin: 0; }
  html { height: 99%; }
  body { height: 98%; font: normal normal 10pt sans-serif }
  #col1 {  float: left; width: 27em; margin: 0 0 0 1em; overflow: visible; }
  #col2 {  position: relative; height: 98%; margin: 0 0.5em 0 27em; }
  #col1_header { margin-top: 0.5em; }
  #scroller { height: 550px; overflow: auto;}
  #testtable { margin: 0 0 2em 0; width: 97%; }
  #run_buttons { margin-bottom: 4em; }
  
  #right_header { padding-top: 0.8em; }
  #results_count { float: left; }
  .active_tab 			{ float: right; padding: 0 1em 0.2em 1em; background: #0af; border: 1px solid #048; border-bottom: none; cursor: pointer; cursor: hand;
  					 position: relative; top: -0.2em; }
  .inactive_tab 			{ float: right; padding: 0 1em 0 1em; background: #9bb; color: #444; border: 1px solid #9bb; border-bottom: none; cursor: pointer; cursor: hand; }
  .inactive_mouseover_tab 	{ float: right; padding: 0 1em 0 1em; background: #9bb; color: #062; border: 1px solid #062; border-bottom: none; cursor: pointer; cursor: hand; }
  
  #right_frame { overflow: auto; position: relative; top: -0.2em; clear: right; height: 95%; border: 1px solid #048; }
  
  #debug { display: none; }
  #debug p { margin: 2px 0 0 5em; text-indent: -4.8em; }
  
  #error { display: none; color: #c22; }
  
  #results p { margin: 0 0 2px 0; }
  /* cursor indicating that detailed results may be expanded/contracted */
  #results p.badtest { cursor: text; }
  #results p.ok, #results p.fail { cursor: pointer; cursor: hand; }
  
  /* colored squares in the results window at the left of test page names */
  #results p.ok .bullet { background: #6d6; }
  #results p.fail .bullet { background:  #d46; }
  #results p.badtest .bullet { background: #ea3; }
  #results p.loading .bullet { background: #48f; }
  #results p.running .bullet { background: #26e; }
  #results p.waiting .bullet { background: #04d; }
  /* highlight in the results line */
  #results p .warning { background: #ffc; }
  
  /* layout of the detailed results */
  .result_detail { padding-left: 3em; }
  .result_exception_detail { padding-left: 4em; }
  .result_exception_stack_detail { padding-left: 5em;  }
  .result_micro_detail { padding-left: 6em; }
  /* colouring in the detailed results */
  .result_detail .fail, .result_exception_detail .fail,  .result_micro_detail .fail { background: #ffd8d8; }
  
  /* "start recording" controls*/
  #record_div { margin-top: 3em; }
  #record_div p { margin-bottom: 0.5em; }
  #record_select { width: 88%; }
  #record_input { width: 53%; }
  </style>
  <script type="text/javascript">
  <!--
  if( typeof( Test )=="undefined" ) {
  	Test={};
  }
  Test.AnotherWay={};
  
  Test.AnotherWay._g_test_iframe=null; // frame where to load test pages
  Test.AnotherWay._g_test_frame_no_clear=false; // true - leave last page displayed after tests end
  Test.AnotherWay._g_test_page_urls=[]; // array of: { url: url, convention: "anotherway" or "jsan" }
  Test.AnotherWay._g_test_object_for_jsan=null; // test object for filling by tests that adhere to jsan Test.Simple calling convention
  Test.AnotherWay._g_pages_to_run=null; // list of pages to run automatically after loading
  Test.AnotherWay._g_run_on_main_load=false; // special handling for run_pages_to_run when it might be called before onload or before list of test pages is known.
  Test.AnotherWay._g_run_on_list_load=false;
  Test.AnotherWay._g_main_loaded=false;
  
  Test.AnotherWay._run_pages_to_run=function( called_from_outside )
  {
  	if( !Test.AnotherWay._g_main_loaded ) {
  		Test.AnotherWay._g_run_on_main_load=true;
  	}else {
  		var a_pages=Test.AnotherWay._g_pages_to_run;
  		if( a_pages=="all" ) {
  			for( var i=0; i<Test.AnotherWay._g_test_page_urls.length; ++i ) {
  				Test.AnotherWay._run_test_page( "test"+i );
  			}
  		}else if( a_pages!=null ) {
  			for( var run_i=0; run_i<a_pages.length; ++run_i ) {
  				var run_page=a_pages[run_i];
  				var found=false;
  				for( var all_i=0; all_i<Test.AnotherWay._g_test_page_urls.length; ++all_i ) {
  					if( run_page==Test.AnotherWay._g_test_page_urls[all_i].url ) {
  						Test.AnotherWay._run_test_page( "test"+all_i, called_from_outside );
  						found=true;
  						break;
  					}
  				}
  				if( !found ) {
  					Test.AnotherWay._show_error( "page specified to run is not found in the page list: "+run_page );
  					break;
  				}
  			}
  		}
  	}
  }
  
  Test.AnotherWay._add_test_page_url=function( test_url, convention )
  {
  	var table=document.getElementById( "testtable" );
  	var record_select=document.getElementById( "record_select" );
  	var index=Test.AnotherWay._g_test_page_urls.length;
  
  	// trim spaces.
  	if( test_url.match( "^(\\s*)(.*\\S)(\\s*)$" ) ) {
  		test_url=RegExp.$2;
  	}
  
  	Test.AnotherWay._g_test_page_urls[index]={ url: test_url, convention: convention };
  	var row=table.insertRow( -1 );
  
  	var cell;
  	var cell_child;
  	cell=row.insertCell( -1 );
  	cell_child=document.createElement( "input" );
  	cell_child.type="checkbox";
  	cell_child.id="checkbox"+index;
  	cell.appendChild( cell_child );
  
  	cell=row.insertCell( -1 );
  	cell.setAttribute( "width", "75%" );
  	cell.appendChild( document.createTextNode( test_url ) );
  
  	cell=row.insertCell( -1 );
  	cell_child=document.createElement( "input" );
  	cell_child.type="button";
  	cell_child.id="test"+index;
  	cell_child.value=" run ";
  	cell_child.onclick=Test.AnotherWay._run_one_onclick;
  	cell.appendChild( cell_child );
  
  	cell=row.insertCell( -1 );
  	cell.setAttribute( "width", "8em" );
  	cell_child=document.createElement( "span" );
  	cell.appendChild( cell_child );
  
  	var option=document.createElement( "option" );
  	option.appendChild( document.createTextNode( test_url ) );
  	record_select.appendChild( option );
  }
  Test.AnotherWay._show_error=function( msg )
  {
  	var error_div=document.getElementById( "error" );
  	error_div.innerHTML="";
  	error_div.appendChild( document.createTextNode( msg ) );
  	error_div.style.display="block";
  }
  
  // read urls from the list in the html file inside the list_iframe
  // fill on-screen list with urls and "run" buttons, and fill the g_test_page_urls object.
  Test.AnotherWay._list_iframe_onload=function()
  {
  	if( window.frames.list_iframe!=null && window.frames.list_iframe.location!="" && window.frames.list_iframe.location!="about:blank" ) {
  		var list_doc=window.frames.list_iframe.document;
  		var list=list_doc.getElementById( "testlist" );
  		if( list!=null ) {
  			for( var i=0; i<list.childNodes.length; ++i ) {
  				var item=list.childNodes[i];
  				if( item.nodeName=="LI" || item.nodeName=="li" ) {
  					var convention="anotherway";
  					if( Test.AnotherWay._get_css_class( item )=="jsan" ) {
  						convention="jsan";
  					}
  					Test.AnotherWay._add_test_page_url( item.innerHTML, convention );
  				}
  			}
  			if( Test.AnotherWay._g_run_on_list_load ) {
  				Test.AnotherWay._g_run_on_list_load=false;
  				Test.AnotherWay._run_pages_to_run();
  			}
  		}else {
  			Test.AnotherWay._show_error( "no list with id 'testlist' in a list file "+window.frames.list_iframe.location );
  		}
  	}
  }
  
  Test.AnotherWay._map_checkboxes=function( f )
  {
  	var table=document.getElementById( "testtable" );
  	var checks=table.getElementsByTagName( "INPUT" );
  	for( var i=0; i<checks.length; ++i ) {
  		if( checks[i].type=="checkbox" && checks[i].id.match( /^checkbox(\d+)$/ ) ) {
  			f( checks[i], RegExp.$1 );
  		}
  	}
  }
  Test.AnotherWay._run_all_onclick=function()
  {
  	Test.AnotherWay._map_checkboxes( function( c, id ) { Test.AnotherWay._run_test_page( "test"+id ); } );
  }
  Test.AnotherWay._run_selected_onclick=function()
  {
  	Test.AnotherWay._map_checkboxes( function( c, id ) { if( c.checked ) Test.AnotherWay._run_test_page( "test"+id ); } );
  }
  Test.AnotherWay._unselect_all_onclick=function()
  {
  	Test.AnotherWay._map_checkboxes( function( c, id ) { c.checked=false; } );
  }
  Test.AnotherWay._run_one_onclick=function()
  {
  	Test.AnotherWay._run_test_page( this.id );
  }
  
  // construct an object that will gather results of running one test function
  Test.AnotherWay._test_object_t=function( fun_name )
  {
  	this.name=fun_name; // name of the test function
  	this.n_plan=null; // planned number of assertions
  	this.n_ok=0; // # of ok assertions
  	this.n_fail=0; // # of failed assertions
  	this.exception=""; // if the function throwed an exception, it's its message
  	this.exception_stack=[]; // strings: function call stack from the exception
  	this.assertions=[]; // assertion results: array of { ok: 1 or 0, name: string }
  	this.wait_result_milliseconds=0; // how long to wait before collecting results from the test
  	this.second_wait_msg=null; // <p> status message (in addition to the page wait_msg)
  	this.delay_actions=[]; // array of actions to be perfomed after the test function returns
  				//	action : { acton_kind: "call" | "window" | "replay"
  				//				when "call": 		{ call_fn call_delay_milliseconds } call_fn takes nothing
  				//				when "window" : 	{ wnd_url wnd_wnd wnd_fn wnd_timeout_milliseconds wnd_dont_close } wnd_fn takes wnd
  				//				wnen "replay" : 	{ replay_wnd replay_events replay_event_i replay_checkpoints } checkpoint_fn takes this, wnd
  				//	}
  	this.delay_action_i=null; // index of delay action currently being performed
  	this.delay_prev_timer_time=0;	// for counting time while performing delay_actions
  	this.delay_current_milliseconds_left=0; // time left before the next action, runs down
  	this.delay_total_milliseconds_left=0; 	// for indication: total estimated time for all actions, runs up and down
  }
  
  Test.AnotherWay._test_object_t.prototype.ok=function( cond, name )
  {
  	if( cond ) {
  		++this.n_ok;
  		cond=1;
  	}else {
  		++this.n_fail;
  		cond=0;
  	}
  	this.assertions.push( { ok: cond, name: name } );
  }
  Test.AnotherWay._test_object_t.prototype.fail=function( name )
  {
  	this.ok( false, name );
  }
  Test.AnotherWay._test_object_t.prototype.plan=function( n )
  {
  	this.n_plan=n;
  }
  Test.AnotherWay._test_object_t.prototype.wait_result=function( seconds )
  {
  	this.wait_result_milliseconds=1000*seconds;
  }
  Test.AnotherWay._eq_fail_msg=function( path, what, expected, got )
  {
  	return "eq: "+path+" "+what+" differ: got "+got+", but expected "+expected;
  }
  Test.AnotherWay._array_eq=function( expected, got, path, msg )
  {
  	if( expected.length!=got.length ) {
  		msg.msg=Test.AnotherWay._eq_fail_msg( path, "array length", expected.length, got.length );
  		return false;
  	}
  	for( var i=0; i<expected.length; ++i ) {
  		if( !Test.AnotherWay._thing_eq( expected[i], got[i], path+"["+i+"]", msg ) ) {
  			return false;
  		}
  	}
  	return true;
  }
  Test.AnotherWay._object_eq=function( expected, got, path, msg )
  {
  	var v;
  	for( v in expected ) {
  		if( ! (v in got) ) {
  			msg.msg=Test.AnotherWay._eq_fail_msg( path+"."+v, "properties", expected[v], "undefined" );
  			return false;
  		}
  		if( !Test.AnotherWay._thing_eq( expected[v], got[v], path+"."+v, msg ) ) {
  			return false;
  		}
  	}
  	for( v in got ) {
  		if( ! (v in expected) ) {
  			msg.msg=Test.AnotherWay._eq_fail_msg( path+"."+v, "properties", "undefined", got[v] );
  			return false;
  		}
  	}
  	return true;
  }
  Test.AnotherWay._constructor_name=function( x )
  {
  	if( x==null ) {
  		return "";
  	}
  	var s="unknown";
  	try {
  		s=typeof( x.constructor );
  		if( s!="unknown" ) {
  			s=x.constructor.toString();
  		}
  	}catch( e ) {
  		s="unknown";
  	}
  	if( s=="unknown" ) {
  		// hackish attempt to guess a type
  		var is_array=true;
  		var index=0;
  		for( i in x ) {
  			if( i!=index ) {
  				is_array=false;
  			}
  			++index;
  		}
  		return is_array ? "Array" : "Object"; // for empty arrays/objects, this will be wrong half the time
  	}else if( s.match( /^\s*function\s+(\w+)\s*\(/ ) ) {
  		return RegExp.$1;
  	}else {
  		return "";
  	}
  }
  Test.AnotherWay._is_array=function( x )
  {
  	return Test.AnotherWay._constructor_name( x )=="Array";
  }
  Test.AnotherWay._is_value_type=function( x )
  {
  	cn=Test.AnotherWay._constructor_name( x );
  	return cn=="Number" || cn=="String" || cn=="Boolean" || cn=="Date";
  }
  Test.AnotherWay._thing_eq=function( expected, got, path, msg )
  {
  	if( expected==null && got==null ) {
  		return true;
  	}else if( (expected==null && got!=null) || (expected!=null && got==null) ) {
  		msg.msg=Test.AnotherWay._eq_fail_msg( path, "values", expected, got );
  		return false;
  	}else {
  		var expected_cn=Test.AnotherWay._constructor_name( expected );
  		var got_cn=Test.AnotherWay._constructor_name( got );
  		if( expected_cn!=got_cn ) {
  			msg.msg=Test.AnotherWay._eq_fail_msg( path, "types", expected_cn, got_cn );
  			return false;
  		}else {
  			if( Test.AnotherWay._is_array( expected ) ) {
  				return Test.AnotherWay._array_eq( expected, got, path, msg );
  			}else if( Test.AnotherWay._is_value_type( expected ) ) {
  				if( expected!=got ) {
  					msg.msg=Test.AnotherWay._eq_fail_msg( path, "values", expected, got );
  					return false;
  				}else {
  					return true;
  				}
  			}else { // just a plain object
  				return Test.AnotherWay._object_eq( expected, got, path, msg );
  			}
  		}
  	}
  }
  Test.AnotherWay._test_object_t.prototype.eq=function( got, expected, name )
  {
  	var msg={};
  	if( Test.AnotherWay._thing_eq( expected, got, "", msg ) ) {
  		this.ok( 1, name );
  	}else {
  		this.fail( name+". "+msg.msg );
  	}
  }
  Test.AnotherWay._test_object_t.prototype.like=function( got, expected, name )
  {
  	if( got.match( expected )!=null ) {
  		this.ok( 1, name );
  	}else {
  		this.fail( name+": got "+got+", but expected it to match: "+expected );
  	}
  }
  Test.AnotherWay._g_html_eq_span=null;
  Test.AnotherWay._html_eq_string_to_node=function( string_or_node, what, msg )
  {
  	if( string_or_node.nodeType!=null ) {
  		string_or_node=Test.AnotherWay._html_eq_node_to_string( string_or_node ); // double trip - to make properties assigned in scripts available as html node attributes
  	}
  	if( Test.AnotherWay._g_html_eq_span==null ) {
  		Test.AnotherWay._g_html_eq_span=document.createElement( "span" );
  	}
  	Test.AnotherWay._g_html_eq_span.innerHTML=string_or_node;
  	if( Test.AnotherWay._g_html_eq_span.childNodes.length!=1 ) {
  		msg.msg="bad "+what+" html string given (should contain exactly one outermost element): "+string_or_node;
  	}
  	return Test.AnotherWay._g_html_eq_span.childNodes[0].cloneNode( true );
  }
  Test.AnotherWay._html_eq_node_to_string=function( node ) {
  	if( Test.AnotherWay._g_html_eq_span==null ) {
  		Test.AnotherWay._g_html_eq_span=document.createElement( "span" );
  	}
  	Test.AnotherWay._g_html_eq_span.innerHTML="";
  	if( node.outerHTML!=null ) {
  		Test.AnotherWay._g_html_eq_span.innerHTML=node.outerHTML;
  	}else {
  		Test.AnotherWay._g_html_eq_span.appendChild( node.cloneNode( true ) );
  	}
  	return Test.AnotherWay._g_html_eq_span.innerHTML;
  }
  Test.AnotherWay._html_eq_path_msg=function( path )
  {
  	var msg="";
  	for( var i=0; i<path.length; ++i ) {
  		msg+=" [node "+path[i].node;
  		if( path[i].id!=null && path[i].id!="" ) {
  			msg+=" id "+path[i].id;
  		}else if( path[i].index!=null ) {
  			msg+=" at index "+path[i].index;
  		}
  		msg+="] "
  	}
  	return msg;
  }
  Test.AnotherWay._html_eq_fail_msg=function( path, what, expected, got )
  {
  	return Test.AnotherWay._html_eq_path_msg( path )+": "+what+" differ: got "+got+", but expected "+expected;
  }
  Test.AnotherWay._html_eq_remove_blank=function( text )
  {
  	if( text==null ) {
  		return "";
  	}else if( text.match( "^(\\s*)(.*\\S)(\\s*)$" ) ) {
  		return RegExp.$2;
  	}else if( text.match( "\s*" ) ) {
  		return "";
  	}
  	return text;
  }
  Test.AnotherWay._html_eq_remove_blank_nodes=function( node )
  {
  	var to_remove=[];
  	for( var child=node.firstChild; child!=null; child=child.nextSibling ) {
  		if( child.nodeType==3 ) {
  			var value=Test.AnotherWay._html_eq_remove_blank( child.nodeValue );
  			if( value=="" ) {
  				to_remove.push( child );
  			}else {
  				child.nodeValue=value;
  			}
  		}
  	}
  	for( var i=0; i<to_remove.length; ++i ) {
  		node.removeChild( to_remove[i] );
  	}
  }
  Test.AnotherWay._html_node_type_text=function( node_type )
  {
  	if( node_type==1 ) {
  		return "1 (html element)";
  	}else if( node_type==3 ) {
  		return "3 (text)";
  	}else {
  		return node_type;
  	}
  }
  Test.AnotherWay._html_eq_node=function( expected, got, path, msg, expected_loc_base, got_loc_base )
  {
  	if( expected.nodeType!=got.nodeType ) {
  		msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "node types", Test.AnotherWay._html_node_type_text( expected.nodeType ), Test.AnotherWay._html_node_type_text( got.nodeType ) );
  		return false;
  	}else if( expected.nodeType==3 ) {
  		if( expected.nodeValue!=got.nodeValue ) {
  			msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "text", expected.nodeValue, got.nodeValue );
  			return false;
  		}
  	}else if( expected.nodeType==1 ) {
  		if( expected.nodeName!=got.nodeName ) {
  			msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "node names", expected.nodeName, got.nodeName );
  			return false;
  		}
  		// compare attributes
  		var expected_attrs={};
  		var got_attrs={};
  		var i;
  		var a;
  		for( i=0; i<expected.attributes.length; ++i ) {
  			a=expected.attributes[i];
  			if( a.specified ) {
  				expected_attrs[a.name]=1;
  			}
  		}
  		for( i=0; i<got.attributes.length; ++i ) {
  			a=got.attributes[i];
  			if( a.specified ) {
  				got_attrs[a.name]=1;
  			}
  		}
  		for( a in expected_attrs ) {
  			if( ! (a in got_attrs) ) {
  				msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute sets differ: expected attribute "+a+" is missing";
  				return false;
  			}
  		}
  		for( a in got_attrs ) {
  			if( ! (a in expected_attrs) ) {
  				msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute sets differ: got extra attribute "+a;
  				return false;
  			}
  		}
  		for( a in expected_attrs ) {
  			var expected_value=expected.getAttribute( a );
  			var got_value=got.getAttribute( a );
  			if( typeof( expected_value )=="string" && typeof( got_value )=="string" ) {
  				expected_value=Test.AnotherWay._html_eq_remove_blank( expected_value );
  				got_value=Test.AnotherWay._html_eq_remove_blank( got_value );
  				var ok=expected_value==got_value;
  				if( !ok && (a=="href" || a=="HREF" )  ) { // try relative hrefs
  					var expected_relative_value=expected_value;
  					if( expected_loc_base!=null && expected_value.substring( 0, expected_loc_base.length )==expected_loc_base ) {
  						expected_relative_value=expected_value.substring( expected_loc_base.length );
  					}
  					var got_relative_value=got_value;
  					if( got_loc_base!=null && got_value.substring( 0, got_loc_base.length )==got_loc_base ) {
  						got_relative_value=got_value.substring( got_loc_base.length );
  					}
  					ok=expected_relative_value==got_relative_value;
  				}
  				if( !ok ) {
  					msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "attribute "+a+" values", expected_value, got_value );
  					return false;
  				}
  			}else if( typeof( expected_value )=="function" && typeof( got_value )=="function" ) {
  				expected_value=expected_value.toString();
  				got_value=got_value.toString();
  				if( expected_value!=got_value ) {
  					msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "attribute "+a+" values", expected_value, got_value );
  					return false;
  				}
  			}else {
  				var value_msg={};
  				if( !Test.AnotherWay._thing_eq( expected_value, got_value, "", value_msg ) ) {
  					msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute "+a+" values differ: "+value_msg.msg;
  					return false;
  				}
  			}
  		}
  		// compare child nodes
  		Test.AnotherWay._html_eq_remove_blank_nodes( expected );
  		Test.AnotherWay._html_eq_remove_blank_nodes( got );
  		var expected_length=expected.childNodes.length;
  		var got_length=got.childNodes.length;
  		if( expected_length<got_length ) {
  			msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": got "+(got_length-expected_length)+" extra child nodes";
  			return false;
  		}else if( expected_length>got_length ) {
  			msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": expected "+(expected_length-got_length)+" more child nodes";
  			return false;
  		}else {
  			for( i=0; i<expected_length; ++i ) {
  				var expected_node=expected.childNodes[i];
  				path.push( { node: expected_node.nodeName, id: expected_node.id, index: i } );
  				var eq=Test.AnotherWay._html_eq_node( expected_node, got.childNodes[i], path, msg, expected_loc_base, got_loc_base );
  				path.pop();
  				if( !eq ) {
  					return false;
  				}
  			}
  		}
  	}
  	return true;
  }
  Test.AnotherWay._html_eq_get_loc_base=function( node )
  {
  	var loc_base=document.location;
  	if( node.ownerDocument!=null ) {
  		loc_base=node.ownerDocument.location;
  	}
  	if( loc_base!=null ) {
  		loc_base=loc_base.href;
  		var slash_pos=loc_base.lastIndexOf( "/" );
  		if( slash_pos!=-1 ) {
  			loc_base=loc_base.substring( 0, slash_pos+1 );
  		}
  	}
  	return loc_base;
  }
  Test.AnotherWay._test_object_t.prototype.html_eq=function( got, expected, name )
  {
  	var msg={};
  	var expected_node=Test.AnotherWay._html_eq_string_to_node( expected, "expected", msg );
  	if( msg.msg!=null ) {
  		this.fail( name+" html_eq: "+msg.msg );
  	}else {
  		var got_node=Test.AnotherWay._html_eq_string_to_node( got, "got", msg );
  		if( msg.msg!=null ) {
  			this.fail( name+" html_eq: "+msg.msg );
  		}else {
  			var expected_loc_base=Test.AnotherWay._html_eq_get_loc_base( expected );
  			var got_loc_base=Test.AnotherWay._html_eq_get_loc_base( got );
  			if( Test.AnotherWay._html_eq_node( expected_node, got_node, [], msg, expected_loc_base, got_loc_base ) ) {
  				this.ok( 1, name );
  			}else {
  				var msg=name+" html_eq "+msg.msg;
  				var expected_str=Test.AnotherWay._html_eq_node_to_string( expected_node );
  				var got_str=Test.AnotherWay._html_eq_node_to_string( got_node );
  				msg+=".\n got html: "+got_str;
  				msg+=".\n expected html: "+expected_str;
  				this.fail( msg );
  			}
  		}
  	}
  }
  Test.AnotherWay._debug_pane_print=function( msg )
  {
  	var d=new Date();
  	var p=document.createElement( "p" );
  	p.appendChild( document.createTextNode( d.toLocaleTimeString()+" "+msg ) );
  	var debug_pane=document.getElementById( "debug" );
  	debug_pane.appendChild( p );
  	var debug_tab=document.getElementById( "debug_tab" );
  	var results_tab=document.getElementById( "results_tab" );
  	debug_tab.style.visibility="visible";
  	results_tab.style.visibility="visible";
  }
  Test.AnotherWay._test_object_t.prototype.debug_print=function( msg )
  {
  	Test.AnotherWay._debug_pane_print( this.name+": "+msg );
  }
  Test.AnotherWay._test_object_t.prototype.delay_call=function()
  {
  	var timeout_ms=200;
  	for( var i=0; i<arguments.length; ++i ) {
  		if( typeof( arguments[i] )!="function" ) {
  			timeout_ms=1000*arguments[i];
  		}else {
  			var action={ action_kind: "call", call_delay_milliseconds: timeout_ms, call_fn: arguments[i] };
  			this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
  			this.delay_actions.push( action );
  		}
  	}
  }
  Test.AnotherWay._test_object_t.prototype.open_window=function( url, fn, timeout_seconds )
  {
  	if( timeout_seconds==null ) {
  		timeout_seconds=2;
  	}
  	var no_close=document.getElementById( "dont_close_test_windows" );
  	var action={ action_kind: "window", wnd_url: url.toString(), wnd_wnd: null, wnd_fn: fn, wnd_timeout_milliseconds: timeout_seconds*1000, wnd_no_close: no_close.checked };
  	this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
  	this.delay_actions.push( action );
  }
  Test.AnotherWay._test_object_t.prototype.replay_events=function( wnd, events )
  {
  	if( Test.AnotherWay._g_no_record_msg!=null ) {
  		this.fail( "replay_events: "+Test.AnotherWay._g_no_record_msg );
  	}else {
  		var action={ action_kind: "replay", replay_wnd: wnd, replay_events: events.events, replay_event_i: null, replay_checkpoints: events.checkpoints };
  		this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
  		this.delay_actions.push( action );
  	}
  }
  Test.AnotherWay._action_estimate_milliseconds=function( action )
  {
  	var ms=0;
  	if( action.action_kind=="call" ) {
  		ms=action.call_delay_milliseconds;
  	}else if( action.action_kind=="window" ) {
  		ms=0;
  	}else if( action.action_kind=="replay" ) {
  		ms=0;
  		for( var i=0; i<action.replay_events.length; ++i ) {
  			ms+=action.replay_events[i]["time"]-0;
  		}
  	}
  	return ms;
  }
  
  Test.AnotherWay._g_timeout_granularity=200;
  Test.AnotherWay._g_tests_queue=[]; // vector of { url: string, test_objects : array of test_object_t, test_object_i: int, wait_msg: <p> object, loading_timeout_milliseconds: int, timeout_id: id }
  
  // load one html page, schedule further processing
  Test.AnotherWay._run_test_page=function( id, called_from_outside )
  {
  	if( id.match( /^test(\d+)/ ) ) {
  		id=RegExp.$1;
  		Test.AnotherWay._g_tests_queue.push( {
  			url: Test.AnotherWay._g_test_page_urls[id].url,
  			convention: Test.AnotherWay._g_test_page_urls[id].convention,
  			test_objects: []
  			} );
  		if( Test.AnotherWay._g_tests_queue.length==1 ) {
  			if( !called_from_outside ) {
  				// Crap. Be careful stepping around.
  				// For Mozilla and Opera, when this file is included into the frameset page that is in another directory (and _g_outside_path_correction!=null)
  				// but the test pages are started from within it (by "run" buttons), then:
  				// depending on whether the page is the first one loaded into the test frame or not,
  				// the base url for relative test pages differs.
  				// Crap, like I said.
  				Test.AnotherWay._g_tests_queue[0].suppress_outside_path_correction=true;
  			}
  			Test.AnotherWay._start_loading_page();
  		}
  	}
  }
  Test.AnotherWay._load_next_page=function()
  {
  	Test.AnotherWay._g_tests_queue.splice( 0, 1 );
  	if( Test.AnotherWay._g_tests_queue.length>0 ) {
  		Test.AnotherWay._start_loading_page();
  	}else {
  		if( !Test.AnotherWay._g_test_frame_no_clear ) {
  			Test.AnotherWay._g_test_iframe.location.replace( "about:blank" );
  		}
  	}
  }
  Test.AnotherWay._g_opera_path_correction=null; // ugly wart to support opera
  Test.AnotherWay._g_outside_path_correction=null; // ugly wart to accomodate Opera and Mozilla, where relative url relates to the directory where the page that calls this function is located
  Test.AnotherWay._set_iframe_location=function( iframe, loc, outside_path_correction )
  {
  	// allow to load only locations with the same origin
  	var proto_end=loc.indexOf( "://" );
  	if( proto_end!=-1 ) { // otherwise, it's safe to assume (for Opera, Mozilla and IE ) that loc will be treated as relative
  		var main_loc=window.location.href;
  		var host_end=loc.substring( proto_end+3 ).indexOf( "/" );
  		var ok=false;
  		if( host_end!=-1 ) {
  			var loc_origin=loc.substring( 0, proto_end+3+host_end+1 );
  			if( main_loc.length>=loc_origin.length && main_loc.substring( 0, loc_origin.length )==loc_origin ) {
  				ok=true;
  			}
  		}
  		if( !ok ) {
  			return { msg: "test pages may have only urls with the same origin as "+main_loc };
  		}
  	}
  	// opera cannot handle urls relative to file:// without assistance
  	if( window.opera!=null && window.location.protocol=="file:" && loc.indexOf( ":" )==-1 ) {
  		var base=window.location.href;
  		var q_pos=base.indexOf( "?" );
  		if( q_pos!=-1 ) {
  			base=base.substring( 0, q_pos );
  		}
  		var slash_pos=base.lastIndexOf( "/" );
  		if( slash_pos!=-1 ) {
  			base=base.substring( 0, slash_pos+1 );
  			Test.AnotherWay._g_opera_path_correction=base;
  			loc=base+loc;
  		}
  	}
  	// if this function is called from another page, and if that page is in another directory, correction is needed
  	if( outside_path_correction!=null ) {
  		var pos=loc.indexOf( outside_path_correction );
  		if( pos==0 ) {
  			loc=loc.substring( outside_path_correction.length+1 );
  		}
  	}
  	if( iframe.location!=null ) {
  		iframe.location.replace( loc );
  	}else {
  		iframe.src=loc;
  	}
  	return {};
  }
  Test.AnotherWay._start_loading_page=function()
  {
  	var test_page=Test.AnotherWay._g_tests_queue[0];
  	test_page.loading_timeout_milliseconds=2000;
  	test_page.timeout_id=setTimeout( Test.AnotherWay._loading_timeout, Test.AnotherWay._g_timeout_granularity );
  	test_page.wait_msg=Test.AnotherWay._print_counter_result( test_page.url, "loading...", test_page.loading_timeout_milliseconds, "loading" );
  	if( test_page.convention=="jsan" ) {
  		// the tests in that page will run when it's loading, so the test object must be ready
  		Test.AnotherWay._g_test_object_for_jsan=new Test.AnotherWay._test_object_t( test_page.url );
  	}
  	var outside_path_correction=null;
  	if( Test.AnotherWay._g_outside_path_correction!=null && !test_page.suppress_outside_path_correction ) {
  		outside_path_correction=Test.AnotherWay._g_outside_path_correction;
  	}
  	var result=Test.AnotherWay._set_iframe_location( Test.AnotherWay._g_test_iframe, test_page.url, outside_path_correction );
  	if( result.msg!=null ) {
  		Test.AnotherWay._unprint_result( test_page.wait_msg );
  		Test.AnotherWay._print_result( test_page.url, result.msg, "badtest", null );
  		Test.AnotherWay._load_next_page();
  	}
  }
  
  Test.AnotherWay._loading_timeout=function()
  {
  	var test_page=Test.AnotherWay._g_tests_queue[0];
  	test_page.loading_timeout_milliseconds-=Test.AnotherWay._g_timeout_granularity;
  	if( test_page.loading_timeout_milliseconds>0 ) {
  		Test.AnotherWay._update_msg_counter( test_page.wait_msg, (test_page.loading_timeout_milliseconds/1000).toFixed() );
  		test_page.timeout_id=setTimeout( Test.AnotherWay._loading_timeout, Test.AnotherWay._g_timeout_granularity );
  	}else {
  		Test.AnotherWay._unprint_result( test_page.wait_msg );
  		Test.AnotherWay._print_result( test_page.url, "Unable to load test page. Timeout expired", "badtest", null );
  		Test.AnotherWay._load_next_page();
  	}
  }
  
  Test.AnotherWay._strip_query_and_hash=function( s )
  {
  	var i=s.lastIndexOf( "#" );
  	if( i!=-1 ) {
  		s=s.substring( 0, i );
  	}
  	i=s.lastIndexOf( "?" );
  	if( i!=-1 ) {
  		s=s.substring( 0, i );
  	}
  	return s;
  }
  Test.AnotherWay._is_url_loaded=function( url, wnd )
  {
  	var loaded=false;
  	if( wnd!=null && wnd.location!=null ) {
  		// after some popup blocker interference, location may behave strange..
  		var location_s="";
  		location_s+=wnd.location;
  		if( location_s!="" ) {
  			var pathname=wnd.location.pathname;
  			var expected_url=url;
  			var i=expected_url.lastIndexOf( "#" );
  			if( i!=-1 ) {
  				expected_url=expected_url.substring( 0, i );
  			}
  			i=expected_url.lastIndexOf( "?" );
  			if( i!=-1 ) {
  				expected_url=expected_url.substring( 0, i );
  			}
  			i=expected_url.lastIndexOf( "/" );
  			if( i!=-1 && i!=expected_url.length-1 ) {
  				expected_url=expected_url.substring( i+1 );
  			}
  			i=pathname.indexOf( expected_url )
  			if( wnd.location.href==url || (i!=-1 && i==pathname.length-expected_url.length) ) {
  				if( /*window.opera==null*/wnd.document.readyState==null || wnd.document.readyState=="complete" ) { // for opera (and IE?), getElementById does not work until..
  					loaded=true;
  				}
  			}
  		}
  	}
  	return loaded;
  }
  // find and run all test functions in the g_cur_page html page.
  Test.AnotherWay._test_page_onload=function()
  {
  	if( Test.AnotherWay._g_tests_queue.length==0 ) {
  		return;
  	}
  	var test_page=Test.AnotherWay._g_tests_queue[0];
  	if( !Test.AnotherWay._is_url_loaded( test_page.url, Test.AnotherWay._g_test_iframe ) ) {
  		return;
  	}
  	clearTimeout( test_page.timeout_id );
  	Test.AnotherWay._unprint_result( test_page.wait_msg );
  
  	if( test_page.convention=="anotherway" ) {
  		// get test function names (those beginning with "test")
  		if( typeof( Test.AnotherWay._g_test_iframe.document.scripts )!='undefined' ) { // IE
  			for( var i=0; i<Test.AnotherWay._g_test_iframe.document.scripts.length; ++i ) {
  				var script_text=Test.AnotherWay._g_test_iframe.document.scripts[i].text;
  				var fun_sig="function test";
  				var fun_start=script_text.indexOf( fun_sig );
  
  				while( fun_start!=-1 ) {
  					script_text=script_text.substring( fun_start, script_text.length );
  					var fun_end=script_text.indexOf( '(' );
  					var fun_name=script_text.substring( "function ".length,  fun_end );
                                          var whitespace = fun_name.indexOf( ' ' );
                                          if (whitespace >= 0)
                                              fun_name = fun_name.substring( 0, whitespace );
  					test_page.test_objects.push( new Test.AnotherWay._test_object_t( fun_name ) );
  					script_text=script_text.substring( fun_end, script_text.length );
  					fun_start=script_text.indexOf( fun_sig  );
  				}
  			}
  		}else { // otherwise (not IE) it ought to work like this
  			for( var i in Test.AnotherWay._g_test_iframe) {
  				if( typeof( Test.AnotherWay._g_test_iframe[i] )=='function' ) {
  					if( i.substring( 0, 4 )=="test" ) {
  						test_page.test_objects.push( new Test.AnotherWay._test_object_t( i ) );
  					}
  				}
  			}
  		}
  	}else if( test_page.convention=="jsan" ) {
  		// the test object is already filled with results
  		test_page.test_objects.push( Test.AnotherWay._g_test_object_for_jsan );
  	}
  
  	if( test_page.test_objects.length==0 ) {
  		Test.AnotherWay._print_result( test_page.url,  "No test functions defined in the page", "badtest", null );
  		Test.AnotherWay._load_next_page();
  		return;
  	}
  
  	test_page.wait_msg=Test.AnotherWay._print_result( test_page.url, "running tests..<span class=\"counter\">"+test_page.test_objects.length+"</span>", "running", null );
  
  	test_page.test_object_i=0;
  	Test.AnotherWay._run_more_tests();
  }
  
  Test.AnotherWay._handle_exception=function( o, e, title )
  {
  	var s=title+": "+typeof( e )+": ";
  	if( e.message!=null ) {
  		s+=e.message;
  	}else if( e.description!=null ) {
  		s+=e.description;
  	}else {
  		s+=e.toString();
  	}
  //	if( e.location!=null ) {  // XXX figure out how to display exception location if it's present (like in mozilla)
  //		s+=" location: "+e.location.toString();
  //	}
  	o.exception=s;
  	s=[];
  	if( e.stack ) {
  		var lines=e.stack.split( "\n" );
  		for( var i=0; i<lines.length; ++i ) {
  			// format of the line: func_name(args)@file_name:line_no
  			if( lines[i].match( /(\w*)\(([^\)]*)\)@(.*):([^:]*)$/ ) ) {
  				var func_name=RegExp.$1;
  				if( func_name.length==0 ) {
  					func_name="<anonymous>";
  				}
  				s.push( "in "+func_name+"( "+RegExp.$2+") at "+RegExp.$3+" line "+RegExp.$4+"\n" );
  			}
  		}
  	}
  	o.exception_stack=s;
  }
  
  Test.AnotherWay._run_more_tests=function()
  {
  	var test_page=Test.AnotherWay._g_tests_queue[0];
  	while( test_page.test_object_i<test_page.test_objects.length ) {
  		Test.AnotherWay._update_msg_counter( test_page.wait_msg, (1+test_page.test_object_i)+"/"+test_page.test_objects.length );
  		var o=test_page.test_objects[test_page.test_object_i];
  		if( test_page.convention=="anotherway" ) {
  			try {
  				Test.AnotherWay._g_test_iframe[o.name]( o );
  			}catch( e ) {
  				Test.AnotherWay._handle_exception( o, e, "" );
  			}
  		} // for "jsan" convention, test has run already
  		if( o.delay_actions.length>0 || o.wait_result_milliseconds>0 ) {
  			o.delay_total_milliseconds_left+=o.wait_result_milliseconds;
  			Test.AnotherWay._delay_actions_timeout();
  			return;
  		}
  		++test_page.test_object_i;
  	}
  	Test.AnotherWay._unprint_result( test_page.wait_msg );
  	Test.AnotherWay._print_result( test_page.url, null, null, test_page.test_objects );
  	Test.AnotherWay._load_next_page();
  }
  
  Test.AnotherWay._delay_actions_timeout=function()
  {
  	var test_page=Test.AnotherWay._g_tests_queue[0];
  	var test_object=test_page.test_objects[test_page.test_object_i];
  	var finished=true;
  	if( test_object.delay_action_i==null ) {
  		// set up to start first action
  		test_object.delay_action_i=-1;
  	}else {
  		// perform current action
  		var milliseconds_passed=(new Date()).getTime()-test_object.delay_prev_timer_time;
  		test_object.delay_current_milliseconds_left-=milliseconds_passed;
  		test_object.delay_total_milliseconds_left-=milliseconds_passed;
  		finished=Test.AnotherWay._delay_continue_action( test_object, milliseconds_passed );
  	}
  	while( finished && test_object.delay_action_i<test_object.delay_actions.length ) {
  		++test_object.delay_action_i; // start next action
  		finished=Test.AnotherWay._delay_start_action( test_object );
  	}
  	if( test_object.delay_action_i<=test_object.delay_actions.length ) { // any more actions left ?
  		test_object.delay_prev_timer_time=(new Date()).getTime();
  		var next_timeout=Test.AnotherWay._g_timeout_granularity;
  		if( test_object.delay_current_milliseconds_left<next_timeout ) {
  			next_timeout=test_object.delay_current_milliseconds_left;
  		}
  		if( test_object.second_wait_msg!=null ) {
  			Test.AnotherWay._update_msg_counter( test_object.second_wait_msg, (test_object.delay_total_milliseconds_left/1000).toFixed() );
  		}
  		setTimeout( Test.AnotherWay._delay_actions_timeout, next_timeout );
  	}else { // no more actions left. run the next test.
  		if( test_object.second_wait_msg!=null ) {
  			Test.AnotherWay._unprint_result( test_object.second_wait_msg );
  			test_object.second_wait_msg=null;
  		}
  		++test_page.test_object_i;
  		Test.AnotherWay._run_more_tests();
  	}
  }
  Test.AnotherWay._delay_start_action=function( test_object )
  {
  	var finished=false;
  	var wait_msg="";
  	if( test_object.delay_action_i==test_object.delay_actions.length ) {
  		if( test_object.wait_result_milliseconds>0 ) {
  			test_object.delay_current_milliseconds_left=test_object.wait_result_milliseconds; // wait for result
  			wait_msg="waiting for results..";
  		}else {
  			++test_object.delay_action_i; // dont wait for result
  		}
  	}else {
  		var action=test_object.delay_actions[test_object.delay_action_i];
  		if( action.action_kind=="call" ) {
  			test_object.delay_current_milliseconds_left=action.call_delay_milliseconds;
  			wait_msg="performing delayed calls..";
  		}else if( action.action_kind=="window" ) {
  			if( Test.AnotherWay._g_opera_path_correction!=null && action.wnd_url.indexOf( ":" )==-1 ) {
  				action.wnd_url=Test.AnotherWay._g_opera_path_correction+action.wnd_url;
  			}
  			action.wnd_wnd=window.open( action.wnd_url, "_blank" );
  			if( action.wnd_wnd==null ) {
  				finished=true;
  				test_object.fail( "unable to open window for "+action.wnd_url );
  			}else {
  				test_object.delay_current_milliseconds_left=action.wnd_timeout_milliseconds;
  				wait_msg="opening window..";
  			}
  		}else if( action.action_kind=="replay" ) {
  			if( action.replay_events.length==0 ) {
  				finished=true;
  			}else {
  				action.replay_event_i=0;
  				test_object.delay_current_milliseconds_left=action.replay_events[0]["time"];
  				wait_msg="replaying events..";
  			}
  		}
  	}
  	if( test_object.second_wait_msg!=null ) {
  		Test.AnotherWay._unprint_result( test_object.second_wait_msg );
  	}
  	if( wait_msg!="" ) {
  		var test_page=Test.AnotherWay._g_tests_queue[0];
  		test_object.second_wait_msg=Test.AnotherWay._print_counter_result( test_page.url, wait_msg, test_object.delay_total_milliseconds_left, "waiting" );
  	}else {
  		test_object.second_wait_msg=null;
  	}
  	return finished;
  }
  Test.AnotherWay._delay_continue_action=function( test_object, milliseconds_passed )
  {
  	var finished=test_object.delay_current_milliseconds_left<=0;
  	if( test_object.delay_action_i==test_object.delay_actions.length ) { // action is "waiting for results"
  		if( test_object.n_plan!=null && test_object.n_plan==test_object.n_ok+test_object.n_fail ) {
  			finished=true; // if all assertions results are recorded, don't wait any more
  		}
  		if( finished ) {
  			++test_object.delay_action_i; // move on to the next test
  		}
  	}else {
  		var action=test_object.delay_actions[test_object.delay_action_i];
  		if( action.action_kind=="call" ) {
  			if( finished ) {
  				try {
  					action.call_fn();
  				}catch( e ) {
  					Test.AnotherWay._handle_exception( test_object, e, "in delay_call" );
  				}
  			}
  		}else if( action.action_kind=="window" ) {
  			test_object.delay_total_milliseconds_left+=milliseconds_passed; // for "window", the countdown is suspended since it's unknown how long it will take
  			if( Test.AnotherWay._is_url_loaded( action.wnd_url, action.wnd_wnd ) ) {
  				try {
  					action.wnd_fn( action.wnd_wnd );
  				}catch( e ) {
  					Test.AnotherWay._handle_exception( test_object, e, "in open_window function call" );
  				}
  				finished=true;
  			}else if( finished ) {
  				test_object.fail(  "unable to open window for url '"+action.wnd_url+"'. timeout expired" );
  			}
  		}else if( action.action_kind=="replay" ) {
  			if( finished ) {
  //				try {
  					Test.AnotherWay._delay_replay_event( test_object, action.replay_wnd, action.replay_events[action.replay_event_i], action.replay_checkpoints );
  //				}catch( e ) { // disabled, until I know how to gel location info from an exception
  //					Test.AnotherWay._handle_exception( test_object, e, "while replaying event" );
  //				}
  				++action.replay_event_i;
  				finished=action.replay_event_i==action.replay_events.length;
  				if( !finished ) {
  					test_object.delay_current_milliseconds_left=action.replay_events[action.replay_event_i]["time"];
  				}
  			}
  		}
  	}
  	return finished;
  }
  Test.AnotherWay._delay_replay_event=function( test_object, wnd, event, checkpoints )
  {
  	if( event.type=="_checkpoint" ) {
  		var checkpoint_n=event.which;
  		var prev_n_fail=test_object.n_fail;
  		checkpoints[checkpoint_n]( test_object, wnd );
  		var flash_color= prev_n_fail==test_object.n_fail ? "#2f2" : "#f22" ;
  		Test.AnotherWay._record_flash_border( flash_color );
  	}else if( event.type=="click" || event.type=="mouseover" || event.type=="mouseout" || event.type=="mousemove" || event.type=="mousedown" || event.type=="mouseup" ) {
  		var target=Test.AnotherWay._record_node_path_to_node( event["target"], wnd.document );
  		if( target!=null ) {
  			Test.AnotherWay._record_control_update_highlight( target, "ball", event );
  			var e=wnd.document.createEvent( "MouseEvents" );
  			var related_target=Test.AnotherWay._record_node_path_to_node( event["relatedTarget"], wnd.document );
  			e.initMouseEvent(
  				event["type"],
  				event["cancelable"],
  				event["bubbles"],
  				wnd.document.defaultView,
  				event["detail"],
  				event["screenX"],
  				event["screenY"],
  				event["clientX"],
  				event["clientY"],
  				event["ctrlKey"],
  				event["altKey"],
  				event["shiftKey"],
  				event["metaKey"],
  				event["button"],
  				Test.AnotherWay._record_node_path_to_node( event["relatedTarget"], wnd.document )
  			);
  			// Firefox 1.0.6 somehow loses relatedTarget somewhere on the way. Pass through our own, for those who choose to care.
  			e.passThroughRelatedTarget=related_target;
  			target.dispatchEvent( e );
  		}
  	}else if( event.type=="keyup" || event.type=="keydown" || event.type=="keypress" ) {
  		var e=wnd.document.createEvent( "KeyboardEvents" ); // forget it. Apparently it's not supported neither by mozilla nor by opera.
  		e.initKeyboardEvent(
  				event["type"],
  				event["cancelable"],
  				event["bubbles"],
  				wnd.document.defaultView,
  				event["which"],
  				event["which"],
  				event["ctrlKey"],
  				event["altKey"],
  				event["shiftKey"],
  				event["metaKey"],
  				false
  		);
  		wnd.document.dispatchEvent( e );
  	}
  }
  
  Test.AnotherWay._print_counter_result=function( url, msg, milliseconds, style )
  {
  	return Test.AnotherWay._print_result( url, msg+"<span class=\"counter\">"+(milliseconds/1000).toFixed()+"</span>", style, null );
  }
  
  Test.AnotherWay._g_result_count=0; // for assigning unique ids to result paragraphs
  
  // number of pages tested
  Test.AnotherWay._g_ok_pages=0;
  Test.AnotherWay._g_fail_pages=0;
  
  Test.AnotherWay._print_result=function( url, msg, style, test_objects )
  {
  	var results=document.getElementById( "results" );
  	var r=results.appendChild( document.createElement( "p" ) );
  	r.id="result"+Test.AnotherWay._g_result_count;
  	++Test.AnotherWay._g_result_count;
  	r.onclick=Test.AnotherWay._toggle_detail;
  	var text="<span class=\"bullet\">&nbsp;&nbsp;&nbsp;</span>&nbsp;";
  	if( url!="" ) {
  		text+=url+":  ";
  	}
  	if( msg!=null ) {
  		text+=msg;
  	}
  	if( test_objects!=null ) {
  		// compose summary and detail texts
  		var total_ok=0;
  		var total_detail_ok=0;
  		var total_fail=0;
  		var total_detail_fail=0;
  		var no_plan=0;
  
  		var detail=results.appendChild( document.createElement( "div" ) );
  
  		if( r.id.match( /^result(\d+)$/ ) ) {
  			detail.id="result_detail"+RegExp.$1;
  		}
  
  		for( var i=0; i<test_objects.length; ++i ) {
  			var o=test_objects[i];
  			var p;
  			var p_text;
  			p=document.createElement( "P" );
  			Test.AnotherWay._set_css_class( p, "result_detail" );
  			p_text=o.name;
  			if( o.n_fail>0 || o.exception || (o.n_plan!=null && o.n_plan!=o.n_ok+o.n_fail) || (o.n_plan==null && o.n_ok==0 && o.n_fail==0)) {
  				++total_fail;
  				p_text+=" <span class=\"fail\">";
  				if( o.n_plan!=null && o.n_plan!=o.n_ok+o.n_fail) {
  					p_text+="planned "+o.n_plan+" assertions but got "+(o.n_ok+o.n_fail)+"; ";
  				}
  				if(o.n_plan==null && o.n_ok==0 && o.n_fail==0) {
  					p_text+="test did not output anything";
  				}else {
  					p_text+=" fail "+o.n_fail;
  				}
  				p_text+="</span>";
  			}else {
  				++total_ok;
  			}
  			p_text+=" ok "+o.n_ok;
  			if( o.n_plan==null ) {
  				no_plan=1;
  				p_text+=" <span class=\"warning\">no plan</span>";
  			}
  			p.innerHTML=p_text;
  			detail.appendChild( p );
  			if( o.exception ) {
  				p=document.createElement( "P" );
  				Test.AnotherWay._set_css_class( p, "result_exception_detail" );
  				p.innerHTML="<span class=\"fail\">exception:</span> "+o.exception;
  				detail.appendChild( p );
  				p=document.createElement( "P" );
  				Test.AnotherWay._set_css_class( p, "result_exception_stack_detail" );
  				p.innerHTML=o.exception_stack.join( "<br/>" );
  				detail.appendChild( p );
  			}
  			for( var ii=0; ii<o.assertions.length; ++ii ) {
  				var oo=o.assertions[ii];
  				var status=oo.ok ? "ok" : "<span class=\"fail\">fail</span>";
  				p=document.createElement( "P" );
  				Test.AnotherWay._set_css_class( p, "result_micro_detail" );
  				p.innerHTML=status;
  				p.appendChild( document.createTextNode( " "+oo.name ) );
  				detail.appendChild( p );
  			}
  			total_detail_ok+=o.n_ok;
  			total_detail_fail+=o.n_fail;
  		}
  		if( total_fail || total_detail_fail ) {
  			text+=" fail "+total_fail;
  		}
  		text+=" ok "+total_ok+" (detailed:";
  		if( total_fail || total_detail_fail ) {
  			text+=" fail "+total_detail_fail;
  		}
  		text+=" ok "+total_detail_ok+")";
  		if( no_plan ) {
  			text+=" <span class=\"warning\">no plan</span>";
  		}
  		style= total_fail==0 ? "ok" : "fail";
  		detail.style.display= style=="fail" ? "block" : "none";
  		detail.style.cursor="text";
  	}
  	if( style!=null ) {
  		Test.AnotherWay._set_css_class( r, style );
  		if( style=="ok" ) {
  			++Test.AnotherWay._g_ok_pages;
  		}else if( style=="fail" || style=="badtest" ) {
  			++Test.AnotherWay._g_fail_pages;
  		}
  		var pages_total="";
  		if( Test.AnotherWay._g_fail_pages>0 ) {
  			pages_total+=" fail "+Test.AnotherWay._g_fail_pages;
  		}
  		pages_total+=" ok "+Test.AnotherWay._g_ok_pages;
  		Test.AnotherWay._update_results_total( pages_total );
  	}
  	r.innerHTML=text;
  	if( results.scrollHeight!=null && results.scrollTop!=null && results.offsetHeight!=null ) {
  		results.scrollTop=results.scrollHeight-results.offsetHeight;
  	}
  	// when test_objects is not null, the results are final - good time to clean up
  	if( test_objects!=null ) {
  		for( var i=0; i<test_objects.length; ++i ) {
  			var actions=test_objects[i].delay_actions;
  			for( var action_i=0; action_i<actions.length; ++action_i ) {
  				var action=actions[action_i];
  				if( action.action_kind=="window" && action.wnd_wnd!=null && !action.wnd_no_close ) {
  					action.wnd_wnd.close();
  					action.wnd_wnd=null;
  				}
  			}
  		}
  	}
  	return r;
  }
  Test.AnotherWay._unprint_result=function( child )
  {
  	var results=document.getElementById( "results" );
  	results.removeChild( child );
  }
  Test.AnotherWay._toggle_detail=function()
  {
  	if( this.id.match( /^result(\d+)$/ ) ) {
  		var detail=document.getElementById( "result_detail"+RegExp.$1 );
  		if( detail!=null ) {
  			if( detail.style.display=="none" ) {
  				detail.style.display="block";
  			}else if( detail.style.display=="block" ) {
  				detail.style.display="none";
  			}
  		}
  	}
  }
  Test.AnotherWay._update_msg_counter=function( msg, text )
  {
  	for( var i=0; i<msg.childNodes.length; ++i ) {
  		var item=msg.childNodes[i];
  		if( item.nodeName=="SPAN" && Test.AnotherWay._get_css_class( item )=="counter" ) {
  			item.innerHTML=text;
  		}
  	}
  }
  Test.AnotherWay._update_results_total=function( msg )
  {
  	var total=document.getElementById( "total" );
  	if( total ) {
  		total.innerHTML=msg;
  	}
  }
  Test.AnotherWay._results_clear_onclick=function()
  {
  	var results=document.getElementById( "results" );
  	results.innerHTML="";
  	Test.AnotherWay._update_results_total( "" );
  	Test.AnotherWay._g_ok_pages=0;
  	Test.AnotherWay._g_fail_pages=0;
  	var debug=document.getElementById( "debug" );
  	debug.innerHTML="";
  }
  
  Test.AnotherWay._get_css_class=function( o )
  {
  	var c=o.getAttribute( "className" );
  	if( c==null || c=="" ) {
  		c=o.getAttribute( "class" );
  	}
  	return c;
  }
  Test.AnotherWay._set_css_class=function( o, css_class )
  {
  	o.setAttribute( "className", css_class );
  	o.setAttribute( "class", css_class );
  }
  
  Test.AnotherWay._tab_onclick=function()
  {
  	var tab=this;
  	var tabs=[ document.getElementById( "debug_tab" ), document.getElementById( "results_tab" ) ];
  	var panes=[ document.getElementById( "debug" ), document.getElementById( "results" ) ];
  	for( var i=0; i<tabs.length; ++i ) {
  		if( tab==tabs[i] ) {
  			Test.AnotherWay._set_css_class( tabs[i], "active_tab" );
  			panes[i].style.display="block";
  		}else {
  			Test.AnotherWay._set_css_class( tabs[i], "inactive_tab" );
  			panes[i].style.display="none";
  		}
  	}
  }
  Test.AnotherWay._tab_mouseover=function()
  {
  	if( Test.AnotherWay._get_css_class( this )=="inactive_tab" ) {
  		Test.AnotherWay._set_css_class( this, "inactive_mouseover_tab" );
  	}
  }
  Test.AnotherWay._tab_mouseout=function()
  {
  	if( Test.AnotherWay._get_css_class( this )=="inactive_mouseover_tab" ) {
  		Test.AnotherWay._set_css_class( this, "inactive_tab" );
  	}
  }
  
  // recording mouse input
  Test.AnotherWay._record_check_onfocus=function()
  {
  	var o=this;
  	var check_select=o.type!="text";
  	var div=document.getElementById( "record_div" );
  	var inputs=div.getElementsByTagName( "input" );
  	for( var i=0; i<inputs.length; ++i ) {
  		var input=inputs[i];
  		if( input.type=="radio" ) {
  			if( input.value=="select" ) {
  				input.checked=check_select;
  			}else if( input.value=="input" ) {
  				input.checked=!check_select;
  			}
  		}
  	}
  }
  
  Test.AnotherWay._g_no_record_msg=null; // not null - recording is unavailable
  Test.AnotherWay._g_record_timeout_cnt=0; // opening window for a page for recording
  Test.AnotherWay._g_record_url=null;
  Test.AnotherWay._g_record_wnd=null;
  Test.AnotherWay._g_record_random_id=null; // added to element ids of record_control div so that they do not clash with ids already in the page for which input is recorded
  Test.AnotherWay._g_record_keydown=null; // recording control - which key is down
  Test.AnotherWay._g_record_ctrl_keydown=false;
  Test.AnotherWay._g_record_shift_keydown=false;
  Test.AnotherWay._g_record_control_visible=true; // recording control ui state
  Test.AnotherWay._g_record_started;
  Test.AnotherWay._g_record_paused;
  Test.AnotherWay._g_record_include_mousemove=false;
  Test.AnotherWay._g_record_start_time; // for time references
  Test.AnotherWay._g_record_pause_start_time;
  Test.AnotherWay._g_record_update_time_interval; // showing time in the control ui
  Test.AnotherWay._g_record_waiting_for_results=false; // waiting for results window to open
  Test.AnotherWay._g_record_events; // recorded events
  Test.AnotherWay._g_record_under_cursor; // track element under cursor
  Test.AnotherWay._g_record_checkpoint_count; // for checkpoint numbering
  Test.AnotherWay._g_record_mouse_over_record_control; // for avoiding record control highlight on mouseover
  Test.AnotherWay._g_record_highlighted_element={ element: null, x: null, y: null };
  
  Test.AnotherWay._record_control_get_element=function( id )
  {
  	if( Test.AnotherWay._g_record_wnd!=null && Test.AnotherWay._g_record_wnd.document!=null ) {
  		return Test.AnotherWay._g_record_wnd.document.getElementById( id+Test.AnotherWay._g_record_random_id );
  	}else {
  		return null;
  	}
  }
  Test.AnotherWay._record_start_onclick=function() // "record" button on the run_tests.html: open a window for a page for which input is recorded
  {
  	if( Test.AnotherWay._g_no_record_msg!=null ) {
  		alert( Test.AnotherWay._g_no_record_msg );
  		return;
  	}
  	if( Test.AnotherWay._g_record_timeout_cnt>0
  	    || (Test.AnotherWay._g_record_wnd!=null && (Test.AnotherWay._g_record_wnd.closed!=null && !Test.AnotherWay._g_record_wnd.closed)) ) { // in opera, closed is null.
  		alert( "there is already window opened for recording input for a page "+Test.AnotherWay._g_record_url );
  		return;
  	}
  	var div=document.getElementById( "record_div" );
  	var inputs=div.getElementsByTagName( "input" );
  	var url=null;
  	for( var i=0; i<inputs.length; ++i ) {
  		var input=inputs[i];
  		if( input.type=="radio" ) {
  			if( input.value=="select" && input.checked ) {
  				var index=document.getElementById( "record_select" ).selectedIndex;
  				if( index>0 ) {
  					url=Test.AnotherWay._g_test_page_urls[index-1].url;
  				}
  			}else if( input.value=="input" && input.checked ) {
  				url=document.getElementById( "record_input" ).value;
  			}
  		}
  	}
  	if( url!=null ) {
  		Test.AnotherWay._g_record_url=url;
  		Test.AnotherWay._g_record_wnd=window.open( url, "_blank" );
  		if( Test.AnotherWay._g_record_wnd==null ) {
  			alert( "unable to open new window for a page: "+url );
  		}else {
  			Test.AnotherWay._g_record_timeout_cnt=50;
  			setTimeout( Test.AnotherWay._record_window_timeout, 100 );
  		}
  	}
  }
  Test.AnotherWay._record_window_timeout=function()
  {
  	if( Test.AnotherWay._is_url_loaded( Test.AnotherWay._g_record_url, Test.AnotherWay._g_record_wnd ) ) {
  		Test.AnotherWay._record_window_setup( Test.AnotherWay._g_record_wnd );
  	}else {
  		if( --Test.AnotherWay._g_record_timeout_cnt>0 ) {
  			setTimeout( Test.AnotherWay._record_window_timeout, 100 );
  		}else {
  			alert( "timeout expired while opening new window for a page: "+Test.AnotherWay._g_record_url );
  			Test.AnotherWay._g_record_wnd=null;
  			Test.AnotherWay._g_record_url=null;
  			Test.AnotherWay._g_record_timeout_cnt=0;
  		}
  	}
  }
  Test.AnotherWay._record_control_randomize_id=function( e, r )
  {
  	if( e.id!="" ) {
  		e.id=e.id+r;
  	}
  	for( var c=e.firstChild; c!=null; c=c.nextSibling ) {
  		Test.AnotherWay._record_control_randomize_id( c, r );
  	}
  }
  Test.AnotherWay._record_window_setup=function( wnd ) // insert recording control into the page for which input is recorded
  {
  	Test.AnotherWay._g_record_timeout_cnt=0;
  	var this_div=document.getElementById( "record_control" );
  	var record_control=wnd.document.importNode( this_div, true );
  	Test.AnotherWay._g_record_random_id=(1000*Math.random()).toFixed();
  	Test.AnotherWay._record_control_randomize_id( record_control, Test.AnotherWay._g_record_random_id );
  	Test.AnotherWay._g_record_control_visible=true;
  	Test.AnotherWay._g_record_started=false;
  	Test.AnotherWay._g_record_paused=false;
  	Test.AnotherWay._g_record_checkpoint_count=0;
  	Test.AnotherWay._g_record_mouse_over_record_control=false;
  	var doc=wnd.document;
  	doc.body.appendChild( record_control );
  	// opera sans-serif font is different
  	if( window.opera ) {
  		cursor_over_indicator=Test.AnotherWay._record_control_get_element( "record_cursor_over" );
  		cursor_over_indicator.style.width="18em";
  		cursor_over_indicator.style.height="2em";
  		cursor_over_indicator.style.fontSize="7pt";
  	}
  	doc.addEventListener( "keydown", Test.AnotherWay._record_control_keydown, true );
  	doc.addEventListener( "keyup", Test.AnotherWay._record_control_keyup, true );
  //	doc.addEventListener( "keypress", Test.AnotherWay._record_event, true ); // replaying is not supported by any known browser
  
  	doc.body.addEventListener( "mousemove", Test.AnotherWay._record_on_mousemove, true );
  	doc.body.addEventListener( "click", Test.AnotherWay._record_event, true );
  	doc.body.addEventListener( "mouseover", Test.AnotherWay._record_event, true );
  	doc.body.addEventListener( "mouseout", Test.AnotherWay._record_event, true );
  	doc.body.addEventListener( "mousedown", Test.AnotherWay._record_event, true );
  	doc.body.addEventListener( "mouseup", Test.AnotherWay._record_event, true );
  }
  Test.AnotherWay._record_control_key_disabled=function( k )
  {
  	if( k=="c" ) {
  		return !Test.AnotherWay._g_record_started;
  	}else if( k=="p" ) {
  		return !Test.AnotherWay._g_record_started;
  	}else if( k=="s" ) {
  		return Test.AnotherWay._g_record_waiting_for_results;
  	}else {
  		return false;
  	}
  }
  
  Test.AnotherWay._record_control_update_ui=function()
  {
  	var keydown_color="#fff";
  	var disabled_color="#aaa";
  	var button_color="#adf";
  	var active_color="#fdf";
  
  	var display={};
  	display[false]="none";
  	display[true]="inline";
  
  	var s_button=Test.AnotherWay._record_control_get_element( "record_s" );
  	var record_on=Test.AnotherWay._record_control_get_element( "record_on" );
  	var record_off=Test.AnotherWay._record_control_get_element( "record_off" );
  
  	s_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "s" ) ? disabled_color
  		: Test.AnotherWay._g_record_keydown=="s" ? keydown_color : Test.AnotherWay._g_record_started ? active_color : button_color;
  	record_on.style.display=display[!Test.AnotherWay._g_record_started];
  	record_off.style.display=display[Test.AnotherWay._g_record_started];
  
  	var h_button=Test.AnotherWay._record_control_get_element( "record_h" );
  	h_button.style.backgroundColor= Test.AnotherWay._g_record_keydown=="h" ? keydown_color : button_color;
  
  	var p_button=Test.AnotherWay._record_control_get_element( "record_p" );
  	var record_pause_on=Test.AnotherWay._record_control_get_element( "record_pause_on" );
  	var record_pause_off=Test.AnotherWay._record_control_get_element( "record_pause_off" );
  	p_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "p" ) ? disabled_color
  		: Test.AnotherWay._g_record_keydown=="p" ? keydown_color : Test.AnotherWay._g_record_paused ? active_color : button_color;
  	record_pause_on.style.display=display[!Test.AnotherWay._g_record_paused];
  	record_pause_off.style.display=display[Test.AnotherWay._g_record_paused];
  
  	var m_button=Test.AnotherWay._record_control_get_element( "record_m" );
  	var record_include_mousemove=Test.AnotherWay._record_control_get_element( "record_include_mousemove" );
  	var record_omit_mousemove=Test.AnotherWay._record_control_get_element( "record_omit_mousemove" );
  	m_button.style.backgroundColor= Test.AnotherWay._g_record_keydown=="m" ? keydown_color : Test.AnotherWay._g_record_include_mousemove ? active_color : button_color;
  	record_include_mousemove.style.display=display[!Test.AnotherWay._g_record_include_mousemove];
  	record_omit_mousemove.style.display=display[Test.AnotherWay._g_record_include_mousemove];
  
  	var c_button=Test.AnotherWay._record_control_get_element( "record_c" );
  	c_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "c" ) ? disabled_color
  		: Test.AnotherWay._g_record_keydown=="c" ? keydown_color : button_color;
  
  	var record_indicator=Test.AnotherWay._record_control_get_element( "record_indicator" );
  	record_indicator.style.display=display[Test.AnotherWay._g_record_started];
  
  	var pause_indicator=Test.AnotherWay._record_control_get_element( "record_pause_indicator" );
  	pause_indicator.style.display=display[Test.AnotherWay._g_record_paused];
  
  	var record_control=Test.AnotherWay._record_control_get_element( "record_control" );
  	record_control.style.display= Test.AnotherWay._g_record_control_visible ? "block" : "none";
  
  	var shift_button=Test.AnotherWay._record_control_get_element( "record_shift_key" );
  	shift_button.style.backgroundColor= Test.AnotherWay._g_record_shift_keydown ? keydown_color : button_color;
  
  	var ctrl_button=Test.AnotherWay._record_control_get_element( "record_ctrl_key" );
  	ctrl_button.style.backgroundColor= Test.AnotherWay._g_record_ctrl_keydown ? keydown_color : button_color;
  }
  Test.AnotherWay._record_format_time=function( t )
  {
  	t=new Date( t );
  	var m=t.getMinutes();
  	var s=t.getSeconds();
  	var str= m==0 ? "" : m+"m ";
  	str+=s+"s.";
  	return str;
  }
  Test.AnotherWay._record_control_update_time=function()
  {
  	var time_display=Test.AnotherWay._record_control_get_element( "record_time" );
  	if( time_display!=null ) {
  		time_display.innerHTML=Test.AnotherWay._record_format_time( (new Date()).getTime()-Test.AnotherWay._g_record_start_time );
  	}
  }
  Test.AnotherWay._record_control_update_highlight=function( elem, style, event )
  {
  	if( elem==null ) {
  		Test.AnotherWay._record_highlight_border( null );
  	}else {
  		var pos=Test.AnotherWay._get_page_coords( elem );
  		if( style=="ball" || elem!=Test.AnotherWay._g_record_highlighted_element.element || pos.x!=Test.AnotherWay._g_record_highlighted_element.x || pos.y!=Test.AnotherWay._g_record_highlighted_element.y ) {
  			Test.AnotherWay._g_record_highlighted_element={ element: elem, x: pos.x, y: pos.y };
  			Test.AnotherWay._record_highlight_border( elem, style, event );
  		}
  	}
  }
  Test.AnotherWay._record_decode_key=function( event )
  {
  	var k=null;
  	if( event==null ) {
  		k=Test.AnotherWay._g_record_wnd.event.keyCode;
  	}else {
  		k=event.which;
  	}
  	if( k==83 ) {
  		return "s";
  	}else if( k==72 ) {
  		return "h";
  	}else if( k==73 ) {
  		return "i";
  	}else if( k==80 ) {
  		return "p";
  	}else if( k==67 ) {
  		return "c";
  	}else if( k==77 ) {
  		return "m";
  	}else if( k==16 ) {
  		return "shift";
  	}else if( k==17 ) {
  		return "ctrl";
  	}else if( k==18 ) {
  		return "alt";
  	}else if( k==19 ) {
  		return "pause";
  	}else if( k==123 ) {
  		return "f12";
  	}
  	return "";
  }
  Test.AnotherWay._record_control_keydown=function( event )
  {
  	var handled=false;
  	var k=Test.AnotherWay._record_decode_key( event );
  	if( k=="shift" ) {
  		Test.AnotherWay._g_record_shift_keydown=true;
  	}else if( k=="ctrl" ) {
  		Test.AnotherWay._g_record_ctrl_keydown=true;
  	}else if( k!="" && (Test.AnotherWay._g_record_keydown==null || Test.AnotherWay._g_record_keydown==k) ) {
  		if( Test.AnotherWay._g_record_ctrl_keydown && Test.AnotherWay._g_record_shift_keydown && !Test.AnotherWay._record_control_key_disabled( k ) ) {
  			Test.AnotherWay._g_record_keydown=k;
  			handled=true;
  		}
  	}else {
  		Test.AnotherWay._g_record_keydown="";
  	}
  	Test.AnotherWay._record_control_update_ui();
  	if( !handled ) {
  //		Test.AnotherWay._record_event( event ); // replaying is not supported in any known browser
  	}
  	return;
  }
  Test.AnotherWay._record_control_keyup=function( event )
  {
  	var handled=false;
  	var k=Test.AnotherWay._record_decode_key( event );
  	if( k=="shift" ) {
  		Test.AnotherWay._g_record_shift_keydown=false;
  	}else if( k=="ctrl" ) {
  		Test.AnotherWay._g_record_ctrl_keydown=false;
  	}else if( k!="" && k==Test.AnotherWay._g_record_keydown && Test.AnotherWay._g_record_ctrl_keydown && Test.AnotherWay._g_record_shift_keydown  ) {
  		if( k=="s" ) {
  			Test.AnotherWay._g_record_started=!Test.AnotherWay._g_record_started;
  			if( Test.AnotherWay._g_record_started ) {
  				Test.AnotherWay._g_record_events=[];
  				Test.AnotherWay._g_record_start_time=(new Date()).getTime();
  				Test.AnotherWay._record_control_update_time();
  				Test.AnotherWay._g_record_update_time_interval=window.setInterval( Test.AnotherWay._record_control_update_time, 200 );
  			}else {
  				Test.AnotherWay._record_control_update_highlight( null );
  				if( !Test.AnotherWay._g_record_paused ) {
  					window.clearInterval( Test.AnotherWay._g_record_update_time_interval );
  				}
  				Test.AnotherWay._g_record_waiting_for_results=true;
  				// open a new window for self, pass a parameter to dump recorded events as javascript code there
  				// (the easiest way to obtain a document from the same origin, so it's writable, is to open this same page again)
  				Test.AnotherWay._g_record_paused=false;
  				var loc=window.location;
  				loc=loc.protocol+"//"+loc.host+loc.pathname+"?recording_results="+Test.AnotherWay._g_record_random_id;
  				if( window.open( loc, "_blank" )==null ) {
  					alert( "unable to open new window for results" );
  				}
  			}
  			handled=true;
  		}else if( k=="h" ) {
  			Test.AnotherWay._g_record_control_visible=!Test.AnotherWay._g_record_control_visible;
  			handled=true;
  		}else if( k=="p" ) {
  			Test.AnotherWay._g_record_paused=!Test.AnotherWay._g_record_paused;
  			if( Test.AnotherWay._g_record_paused ) {
  				Test.AnotherWay._g_record_pause_start_time=(new Date()).getTime();
  				if( Test.AnotherWay._g_record_started ) {
  					window.clearInterval( Test.AnotherWay._g_record_update_time_interval );
  				}
  				Test.AnotherWay._record_control_update_highlight( null );
  			}else {
  				var pause_duration=(new Date()).getTime()-Test.AnotherWay._g_record_pause_start_time;
  				Test.AnotherWay._g_record_start_time+=pause_duration;
  				Test.AnotherWay._g_record_update_time_interval=window.setInterval( Test.AnotherWay._record_control_update_time, 200 );
  			}
  			handled=true;
  		}else if( k=="m" ) {
  			Test.AnotherWay._g_record_include_mousemove=!Test.AnotherWay._g_record_include_mousemove;
  			handled=true;
  		}else if( k=="c" ) {
  			var o=Test.AnotherWay._record_checkpoint();
  			Test.AnotherWay._record_display_checkpoint( o );
  			Test.AnotherWay._record_flash_border( "#24d" );
  			handled=true;
  		}
  	}
  	Test.AnotherWay._g_record_keydown=null;
  	Test.AnotherWay._record_control_update_ui();
  	if( !handled ) {
  //		Test.AnotherWay._record_event( event ); // replaying is not supported in any known browser
  	}
  	return;
  }
  Test.AnotherWay._record_html_node_path=function( node )
  {
  	if( node==null ) {
  		return null;
  	}
  	var path=[];
  	while( true ) {
  		if( node.id!=null && node.id!="" ) {
  			path.unshift( "#"+node.id+" "+node.nodeName );
  			break;
  		}else {
  			var parent_node=node.parentNode;
  			if( parent_node==null ) {
  				return []; // no BODY up the path - this node is screwed (browsers differ in what's above the body), discard
  			}else {
  				var i=0;
  				var found=false;
  				for( var child=parent_node.firstChild; child!=null; child=child.nextSibling ) {
  					if( child==node ) {
  						found=true;
  						break;
  					}
  					if( child.nodeType==1 ) { // count only HTML element nodes
  						++i;
  					}
  				}
  				if( !found ) {
  					i=-1;
  				}
  				path.unshift( i+" "+node.nodeName );
  				if( parent_node.nodeName=="BODY" || parent_node.nodeName=="body" ) {
  					break;
  				}
  				node=parent_node;
  			}
  		}
  	}
  	return path;
  }
  Test.AnotherWay._record_node_path_to_string=function( path )
  {
  	var s="";
  	if( path!=null ) {
  		for( var i=0; i<path.length; ++i ) {
  			s+= i==0 ? "" : ", ";
  			var elem=path[i].split( " " );
  			if( elem[0].charAt( 0 )=="#" ) {
  				s+=elem[1]+" "+elem[0];
  			}else {
  				s+=elem[1]+" ["+elem[0]+"]";
  			}
  		}
  	}
  	return s;
  }
  Test.AnotherWay._record_node_path_to_node=function( path_str, doc )
  {
  	if( path_str==null ) {
  		return null;
  	}
  	var path=path_str.split( "," );
  	var node=doc.body;
  	for( var i=0; i<path.length; ++i ) {
  		var node_i=path[i].split( " " )[0];
  		if( node_i.charAt( 0 )=="#" ) {
  			node=doc.getElementById( node_i.substring( 1 ) );
  		}else {
  			if( node_i<0 || node_i>=node.childNodes.length ) {
  				node=null;
  			}else {
  				node=node.firstChild;
  				while( node!=null ) {
  					if( node.nodeType==1 ) {  // count only HTML element nodes
  						if( node_i==0 ) {
  							break;
  						}
  						--node_i;
  					}
  					node=node.nextSibling;
  				}
  			}
  		}
  		if( node==null ) {
  			return null;
  		}
  	}
  	return node;
  }
  Test.AnotherWay._record_control_contains_id=function( s )
  {
  	return s.match( /^#record_[\w_]+/ ) && s.match( Test.AnotherWay._g_record_random_id );
  }
  Test.AnotherWay._record_checkpoint=function()
  {
  	var o={ type: "_checkpoint", time: (new Date()).getTime()-Test.AnotherWay._g_record_start_time, which: Test.AnotherWay._g_record_checkpoint_count++,
  			target: Test.AnotherWay._record_html_node_path( Test.AnotherWay._g_record_under_cursor ) };
  	Test.AnotherWay._g_record_events.push( o );
  	return o;
  }
  Test.AnotherWay._record_event=function( event )
  {
  	var unneeded=["rangeOffset","eventPhase","timeStamp","isTrusted","popupWindowFeatures","rangeOffset"];
  	if( Test.AnotherWay._g_record_started && !Test.AnotherWay._g_record_paused ) {
  		var o={};
  		for( var n in event ) {
  			var needed=!n.match( /^[A-Z0-9_]+$/ );
  			if( needed ) {
  				for( var ui=0; ui<unneeded.length; ++ui ) {
  					if( unneeded[ui]==n ) {
  						needed=false;
  						break;
  					}
  				}
  				if( needed ) {
  					var value=event[n];
  					if( typeof( value )!="object" && typeof( value )!="function" ) {
  						o[n]=value;
  					}else if( n=="target" || n=="relatedTarget" ) {
  						o[n]=Test.AnotherWay._record_html_node_path( value );
  					}
  				}
  			}
  		}
  		o["time"]=(new Date()).getTime()-Test.AnotherWay._g_record_start_time;
  		var over_record_control= o["target"]!=null && o["target"][0]!=null && Test.AnotherWay._record_control_contains_id( o["target"][0] );
  		if( !over_record_control ) {
  			Test.AnotherWay._g_record_events.push( o );
  		}
  	}
  	return true;
  }
  Test.AnotherWay._record_on_mousemove=function( event )
  {
  	var path=Test.AnotherWay._record_html_node_path( event.target );
  	var new_mouse_over_record_control= path!=null && path[0]!=null && Test.AnotherWay._record_control_contains_id( path[0] );
  	if( new_mouse_over_record_control!=Test.AnotherWay._g_record_mouse_over_record_control ) {
  		Test.AnotherWay._g_record_mouse_over_record_control=new_mouse_over_record_control;
  		Test.AnotherWay._record_control_update_ui();
  	}
  	if( event.target!=null && event.target!=Test.AnotherWay._g_record_under_cursor ) {
  		Test.AnotherWay._g_record_under_cursor=event.target;
  		var s="";
  		if( path==null || path[0]==null || !Test.AnotherWay._record_control_contains_id( path[0] ) ) {
  			s=Test.AnotherWay._record_node_path_to_string( path );
  		}
  		if( s=="" ) {
  			s="&nbsp;";
  		}
  		var cursor_over_indicator=Test.AnotherWay._record_control_get_element( "record_cursor_over" );
  		cursor_over_indicator.innerHTML=s;
  	}
  
  	var highlight_element=null;
  	if( !Test.AnotherWay._g_record_mouse_over_record_control && Test.AnotherWay._g_record_started && !Test.AnotherWay._g_record_paused ) {
  		highlight_element=event.target;
  	}
  	// highlight border disabled on recording - it causes page to scroll, issuing spurious mouseover/mouseout event
  	//Test.AnotherWay._record_control_update_highlight( highlight_element, "border" );
  
  	if( Test.AnotherWay._g_record_include_mousemove ) {
  		Test.AnotherWay._record_event( event );
  	}
  	return true;
  }
  Test.AnotherWay._record_display_checkpoint=function( o )
  {
  	var checkpoints_div=Test.AnotherWay._record_control_get_element( "record_checkpoints" );
  	var p=checkpoints_div.appendChild( checkpoints_div.ownerDocument.createElement( "div" ) );
  	p.style.marginTop="3px";
  	p.style.font="normal normal 8pt sans-serif";
  	p.style.color="#000";
  	p.style.textAligh="left";
  	p.style.position="relative";
  	p.style.width="100%";
  	var checkpoint_text="";
  	checkpoint_text+="#"+(o.which+1);
  	checkpoint_text+="  "+Test.AnotherWay._record_format_time( o.time );
  	if( o.target!=null ) {
  		checkpoint_text+=Test.AnotherWay._record_node_path_to_string( o.target );
  	}
  	p.appendChild( p.ownerDocument.createTextNode( checkpoint_text ) );
  }
  Test.AnotherWay._record_save_results=function( doc )
  {
  	// strange, but DOM-style append does not work here in opera 8.
  	var append=function( s ) { doc.write( "<div>"+s+"</div>" ); };
  	append( "/* paste this data into your javascript and pass it as an argument to replay_events method */" );
  	append( "{ checkpoints: [" );
  	var first_checkpoint=true;
  	for( var i=0; i<Test.AnotherWay._g_record_events.length; ++i ) {
  		var o=Test.AnotherWay._g_record_events[i];
  		if( o.type=="_checkpoint" ) {
  			var str= first_checkpoint ? "" : "}, ";
  			str+="function( tst, wnd ) { // #"+o.which+" time "+Test.AnotherWay._record_format_time( o.time )+" cursor was over "+Test.AnotherWay._record_node_path_to_string( o.target );
  			append( str );
  			first_checkpoint=false;
  		}
  	}
  	if( !first_checkpoint ) {
  		append( "}" );
  	}
  	append( "], events: [ " );
  	var prev_time=0;
  	for( var i=0; i<Test.AnotherWay._g_record_events.length; ++i ) {
  		var o=Test.AnotherWay._g_record_events[i];
  		var s="";
  		s+= "{";
  		var n_first=true;
  		for( var n in o ) {
  			if( n=="time" ) { // convert to relative time
  				var cur_time=o[n]-0;
  				o[n]=cur_time-prev_time;
  				prev_time=cur_time;
  			}
  			s+=n_first ? n : ", "+n;
  			s+=":";
  			if( o[n]==null ) {
  				s+="null";
  			}else {
  				s+="\""+o[n]+"\"";
  			}
  			n_first=false;
  		}
  		s+= i==Test.AnotherWay._g_record_events.length-1 ? "}" : "},";
  		append( s );
  	}
  	append( "] }" );
  	append( ";" );
  }
  
  Test.AnotherWay._g_record_border; // border highlighting element under cursor
  Test.AnotherWay._g_record_border_flashes=[]; // array of { color: color, timeout: milliseconds }
  Test.AnotherWay._g_record_border_flashing=false;
  Test.AnotherWay._g_record_border_normal_color="#d4b";
  Test.AnotherWay._record_flash_border_timeout=function()
  {
  	var color=Test.AnotherWay._g_record_border_normal_color;
  	var timeout=null;
  	if( Test.AnotherWay._g_record_border_flashes.length!=0 ) {
  		color=Test.AnotherWay._g_record_border_flashes[0].color;
  		timeout=Test.AnotherWay._g_record_border_flashes[0].timeout;
  		Test.AnotherWay._g_record_border_flashes.splice( 0, 1 );
  	}
  	if( Test.AnotherWay._g_record_border!=null ) {
  		for( var i=0; i<Test.AnotherWay._g_record_border.length; ++i ) {
  			Test.AnotherWay._g_record_border[i].style.backgroundColor=color;
  		}
  	}
  	if( timeout!=null ) {
  		setTimeout( Test.AnotherWay._record_flash_border_timeout, timeout );
  	}else {
  		Test.AnotherWay._g_record_border_flashing=false;
  	}
  }
  Test.AnotherWay._get_page_coords=function( elm )
  {
  	var point = { x: 0, y: 0 };
  	while( elm )  {
  		point.x+=elm.offsetLeft;
  		point.y+=elm.offsetTop;
  		elm=elm.offsetParent;
  	 }
  	return point;
  }
  Test.AnotherWay._set_page_coords=function( elm, x, y )
  {
  	var parent_coords={ x: 0, y: 0 };
  	if( elm.offsetParent )  {
  		parent_coords=Test.AnotherWay._get_page_coords( elm.offsetParent );
  	}
  	var new_x=x-parent_coords.x;
  	if( new_x<0 ) {
  		new_x=0;
  	}
  	elm.style.left=new_x+'px';
  	var new_y=y-parent_coords.y;
  	if( new_y<0 ) {
  		new_y=0;
  	}
  	elm.style.top=new_y+'px';
  }
  Test.AnotherWay._record_setup_highlight_positions=function( element, style, coords, positions )
  {
  	if( style=="border" ) {
  		var width=element.clientWidth;
  		var height=element.clientHeight;
  		var step=0;
  		var thickness=2;
  		var fudge_expand=4;
  		positions.push( { x: coords.x-step-thickness, y: coords.y-step-thickness, width: width+2*step+2*thickness+fudge_expand, height: thickness } );
  		positions.push( { x: coords.x+width+step+fudge_expand, y: coords.y-step-thickness, width: thickness, height: height+2*step+2*thickness+fudge_expand } );
  		positions.push( { x:positions[0].x, y:positions[0].y, width:positions[0].width, height:positions[0].height } );
  		positions.push( { x:positions[1].x, y:positions[1].y, width:positions[1].width, height:positions[1].height } );
  		positions[2].y+=height+thickness+2*step+fudge_expand;
  		positions[3].x-=width+thickness+2*step+fudge_expand;
  	}else if( style=="ball" ) {
  		positions.push( { x: coords.x+2, y: coords.y, width: 2, height: 6 } );
  		positions.push( { x: coords.x, y: coords.y+2, width: 6, height: 2 } );
  		positions.push( { x: coords.x+1, y: coords.y+1, width: 4, height: 4 } );
  	}
  }
  Test.AnotherWay._record_highlight_border=function( element, style, event ) // null - hide border
  {
  	if( element!=null ) {
  		if( Test.AnotherWay._g_record_border==null || Test.AnotherWay._g_record_border[0].ownerDocument!=element.ownerDocument ) {
  			Test.AnotherWay._g_record_border=[];
  			var n= style=="border" ? 4 : style=="ball" ? 3 : 0;
  			for( var i=0; i<4; ++i ) {
  				var b=element.ownerDocument.createElement( "div" );
  				b.style.position="absolute";
  				b.style.zIndex="1";
  				b.style.backgroundColor=Test.AnotherWay._g_record_border_normal_color;
  				element.ownerDocument.body.appendChild( b );
  				Test.AnotherWay._g_record_border.push( b );
  			}
  		}
  		var coords=null;
  		if( style=="border" ) {
  			coords=Test.AnotherWay._get_page_coords( element );
  		}else if( style=="ball" ) {
  			if( event!=null ) {
  				if( event.pageX!=null && event.pageY!=null ) {
  					coords={ x: event.pageX-0, y: event.pageY-0 };
  				}else if( event.clientX!=null && event.clientY!=null ) {
  					var doc=element.ownerDocument;
  					if( doc!=null ) {
  						coords={ x: (event.clientX-0)+doc.body.scrollLeft, y: (event.clientY-0)+doc.body.scrollTop };
  					}
  				}
  			}
  		}
  		if( coords!=null && element.clientWidth!=null && element.clientHeight!=null ) {
  			var positions=[];
  			Test.AnotherWay._record_setup_highlight_positions( element, style, coords, positions );
  			for( var i=0; i<positions.length; ++i ) {
  				var b=Test.AnotherWay._g_record_border[i];
  				var p=positions[i];
  				Test.AnotherWay._set_page_coords( b, p.x, p.y );
  				b.style.width=p.width+"px";
  				b.style.height=p.height+"px";
  				b.style.display="block";
  			}
  		}
  	}else {
  		if( Test.AnotherWay._g_record_border!=null ) {
  			for( var i=0; i<Test.AnotherWay._g_record_border.length; ++i ) {
  				Test.AnotherWay._g_record_border[i].style.display="none";
  			}
  		}
  	}
  }
  Test.AnotherWay._record_flash_border=function( color )
  {
  	if( Test.AnotherWay._g_record_border_flashing ) { //already
  		Test.AnotherWay._g_record_border_flashes.push( { color: Test.AnotherWay._g_record_border_normal_color, timeout:300 } );
  		Test.AnotherWay._g_record_border_flashes.push( { color: color, timeout:600 } );
  	}else {
  		Test.AnotherWay._g_record_border_flashing=true;
  		Test.AnotherWay._g_record_border_flashes.push( { color: color, timeout:600 } );
  		Test.AnotherWay._record_flash_border_timeout();
  	}
  }
  Test.AnotherWay._record_prepare_doc_for_results=function()
  {
  	document.open();
  	document.write( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" );
  	document.write( "<html><head><title> Input recording results</title>" );
  	document.write( "<style type=\"text/css\">" );
  	document.write( "body { font: normal normal smaller sans-serif; }" );
  	document.write( "div { margin-top: 3px; }" );
  	document.write( "</style></head><body>" );
  	// opera and mozilla disagree over who the opener is.
  	if( typeof( window.opener.Test )!="undefined" && typeof( window.opener.Test.AnotherWay )!="undefined" ) {
  		window.opener.Test.AnotherWay._record_save_results( document );
  		window.opener.Test.AnotherWay._g_record_waiting_for_results=false;
  		window.opener.Test.AnotherWay._record_control_update_ui();
  	}else if( typeof( window.opener.opener.Test  )!="undefined" && typeof( window.opener.opener.Test.AnotherWay )!="undefined" ) {
  		window.opener.opener.Test.AnotherWay._record_save_results( document );
  		window.opener.opener.Test.AnotherWay._g_record_waiting_for_results=false;
  		window.opener.opener.Test.AnotherWay._record_control_update_ui();
  	}
  	document.write( "</body>" );
  	document.close();
  }
  
  // global initialization
  onload=function()
  {
  	if( window.opera ) {
  		var good_opera=typeof( window.opera.version )=="function";
  		good_opera=good_opera && window.opera.version().match( /^\s*(\d+)/ );
  		good_opera=good_opera && RegExp.$1>=8;
  	}
  	var span=document.createElement( "SPAN" );
  	span.innerHTML="<!--[if IE]><br /><![endif]-"+"->";
  	var is_ie=span.getElementsByTagName( "BR" ).length>0;
  
  	Test.AnotherWay._g_test_iframe=window.frames.test_iframe;
  
  	var query_str=window.location.search;
  	if( query_str.charAt( 0 )=="?" ) {
  		query_str=query_str.substring( 1 );
  	}
  	var testlist_page="list-tests.html";
  	var auto_run=false;
  	if( query_str!="" ) {
  		var params=[query_str];
  		if( query_str.indexOf( ";" )!=-1 ) {
  			params=query_str.split( ";" );
  		}else if( query_str.indexOf( "&" )!=-1 ) {
  			params=query_str.split( "&" );
  		}
  		for( var param_i=0; param_i<params.length; ++param_i ) {
  			var param=params[param_i].split( "=" );
  			if( param[0]=="recording_results" ) {
  				if( window.opener!=null ) {
  					// we were told to show recording results - replace everything in the document with the results
  					Test.AnotherWay._record_prepare_doc_for_results();
  					return;
  				}
  			}else if( param[0]=="testpage" ) {
  				Test.AnotherWay._add_test_page_url( decodeURIComponent( param[1] ), "anotherway" );
  			}else if( param[0]=="jsantestpage" ) {
  				Test.AnotherWay._add_test_page_url( decodeURIComponent( param[1] ), "jsan" );
  			}else if( param[0]=="testlist" ) {
  				testlist_page=decodeURIComponent( param[1] );
  			}else if( param[0]=="testframe" ) {
  				if( window.opera && !good_opera ) {
  					Test.AnotherWay._show_error( "testframe parameter does not work in versions of Opera prior to 8.0. Sorry (pathches are welcome)." );
  					// Opera 7 barfs on attempt to access frame.frameElement.
  					// if someone knows a way to assign onload handler to that iframe in Opera 7
  					// without disrupting code that works in other browsers, patches are welcome.
  				}else {
  					var frame_path=param[1].split( "." );
  					var frame=top;
  					for( var frame_path_i=0; frame_path_i<frame_path.length; ++frame_path_i ) {
  						frame=frame[frame_path[frame_path_i]];
  					}
  					if( frame==null ) {
  						Test.AnotherWay._show_error( "unable to find frame specified for loading test pages: "+param[1] );
  					}else {
  						if( frame.frameElement!=null ) { // for the following assignement to onload to work, frameElement is required
  							frame=frame.frameElement;
  						}
  						Test.AnotherWay._g_test_iframe=frame;
  					}
  				}
  			}else if( param[0]=="testframe_no_clear" ) {
  				Test.AnotherWay._g_test_frame_no_clear=true;
  			}else if( param[0]=="run" ) {
  				auto_run=true;
  				if( param[1]=="all" ) {
  					Test.AnotherWay._g_pages_to_run="all";
  				}else {
  					if( Test.AnotherWay._g_pages_to_run==null || Test.AnotherWay._g_pages_to_run=="all" ) {
  						Test.AnotherWay._g_pages_to_run=[];
  					}
  					var pages=param[1].split( "," );
  					for( var i=0; i<pages.length; ++i ) {
  						Test.AnotherWay._g_pages_to_run.push( pages[i] );
  					}
  				}
  			}
  		}
  	}
  	if( Test.AnotherWay._g_test_page_urls.length==0 ) {  // if no individual pages were given on the command line, load the list
  		var result=Test.AnotherWay._set_iframe_location( window.frames["list_iframe"], testlist_page );
  		if( result.msg!=null ) {
  			Test.AnotherWay._show_error( result.msg );
  		}
  		Test.AnotherWay._g_run_on_list_load=auto_run;
  	}else {
  		Test.AnotherWay._g_run_on_main_load=auto_run;
  	}
  
  	var f=Test.AnotherWay._g_test_iframe;
  	try {
  		if( f.attachEvent!=null ) {
  			f.attachEvent( "onload", Test.AnotherWay._test_page_onload );
  		}else {
  			f.onload=Test.AnotherWay._test_page_onload;
  		}
  		if( Test.AnotherWay._g_test_iframe.nodeType!=null && Test.AnotherWay._g_test_iframe.contentWindow!=null ) { // it's iframe element, not the iframe. we need iframe.
  			Test.AnotherWay._g_test_iframe=Test.AnotherWay._g_test_iframe.contentWindow;
  		}
  	}catch(e) {
  		// ignore stupid opera error if the frame has onload handler assigned in the inline html
  	}
  	var handlers={
  		"run_all": { "onclick": Test.AnotherWay._run_all_onclick },
  		"run_selected": { "onclick": Test.AnotherWay._run_selected_onclick },
  		"unselect_all": { "onclick": Test.AnotherWay._unselect_all_onclick },
  		"record_select": { "onfocus": Test.AnotherWay._record_check_onfocus },
  		"record_input": { "onfocus": Test.AnotherWay._record_check_onfocus },
  		"record_start": { "onclick": Test.AnotherWay._record_start_onclick },
  		"clear_btn": { "onclick": Test.AnotherWay._results_clear_onclick },
  		"results_tab": { "onclick": Test.AnotherWay._tab_onclick, "onmouseover": Test.AnotherWay._tab_mouseover, "onmouseout": Test.AnotherWay._tab_mouseout },
  		"debug_tab": { "onclick": Test.AnotherWay._tab_onclick, "onmouseover": Test.AnotherWay._tab_mouseover, "onmouseout": Test.AnotherWay._tab_mouseout }
  	};
  	for( var hs in handlers ) {
  		var o=document.getElementById( hs );
  		if( o!=null ) {
  			for( var h in handlers[hs] ) {
  				o[h]=handlers[hs][h];
  			}
  		}else {
  			Test.AnotherWay._show_error( "unable to set "+h+" handler: id "+hs+" not found" );
  		}
  	}
  
  	if( window.opera && !good_opera ) {
  		Test.AnotherWay._g_no_record_msg="Input events recording and replaying is not available in opera versions prior to 8.0.";
  	}
  	if( is_ie ) {
  		Test.AnotherWay._g_no_record_msg="Input events recording and replaying is not available in internet explorer.";
  	}
   	if( Test.AnotherWay._g_no_record_msg!=null ) {
  		var no_record_p=document.getElementById( "record_not_supported" );
  		no_record_p.style.display="block";
  		no_record_p.appendChild( document.createTextNode( Test.AnotherWay._g_no_record_msg ) );
  	}
  
  	Test.AnotherWay._g_main_loaded=true;
  	if( Test.AnotherWay._g_run_on_main_load ) {
  		Test.AnotherWay._g_run_on_main_load=false;
  		Test.AnotherWay._run_pages_to_run();
  	}
  }
  // -->
  </script></head><body>
  
  <div id="col1">
  <div id="col1_header">Test pages:</div>
  <div id="scroller">
  <table id="testtable">
  </table>
  </div>
  <div id="run_buttons">
  <input type="button" value=" clear " id="clear_btn" />
  <input type="button" value=" run all " id="run_all" />
  <input type="button" value=" run selected " id="run_selected" />
  <input type="button" value=" unselect all " id="unselect_all" />
  </div>
  <input type="checkbox" id="dont_close_test_windows" /> do not close windows opened by tests
  <div id="error"></div>
  <div id="record_div">
  <p id="record_not_supported" style="display:none"></p>
  <p>Record mouse input for the page:</p>
  <p><input type="radio" name="record_choose" value="select" checked="checked" /> <select id="record_select"><option selected="selected">-- select a page: --</option></select></p>
  <p><input type="radio" name="record_choose" value="input" /> or enter page url: <input type="text" id="record_input" /></p>
  <p><input type="button" value=" record " id="record_start" /></p>
  </div>
  </div>
  
  <div id="col2">
  <div id="right_header">
  <span id="results_count">Results: <span id="total"></span></span>
  <span id="results_tab" class="active_tab" style="visibility:hidden">Results</span>
  <span id="debug_tab" class="inactive_tab" style="visibility:hidden">Debug</span>
  </div>
  <div id="right_frame">
  <div id="results"></div>
  <div id="debug"></div>
  </div>
  </div>
  
  <span style="display:none">
  <iframe name="list_iframe" onload="Test.AnotherWay._list_iframe_onload();"></iframe>
  <iframe name="test_iframe" onload="Test.AnotherWay._test_page_onload();"></iframe>
  
  <!-- record_control div is to be imported into other documents, so all its styles are inline -->
  -<div id="record_control" style="position:absolute;bottom:0;left:0;margin:0;padding:0.5em;width:22em;height:22em;border:1px solid;background:#ffd;font: normal normal 8pt sans-serif; color:#000; text-align: left">
  
  <p style="margin:0 0 0 0; padding:0">
  &nbsp;
  <span style="display:none;font-weight:bold;color:#408" id="record_indicator">
  recording. <span style="font-weight:normal">time: <span id="record_time"></span></span><span id="record_pause_indicator"> paused</span>
  </span>
  </p>
  
  <div id="record_cursor_over" style="margin:0;padding:2px;width:14em;height:1.1em;overflow:hidden;float:right;border:1px solid #777;background:#fff;font: normal normal 8pt sans-serif;position:relative;top:3px;color:#000;text-align:left;">&nbsp;</div>
  <p style="margin:2px 0 0 0; padding:0">
  cursor is over
  </p>
  
  <p style="margin:8px 0 0 0; padding:0;">
   keyboard control: press
   <span id="record_ctrl_key" style="border:1px solid #226;background:#adf;padding:0 0.5em">ctrl</span> -
   <span id="record_shift_key" style="border:1px solid #226;background:#adf;padding:0 0.5em">shift</span> -
  </p>
  
  <p style="margin:4px 0 0 0; padding:0">
  <span id="record_s" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">s</span>
  <span id="record_on">to <b>start</b> recording</span>
  <span id="record_off" style="display:none">to <b>stop</b> recording</span>
  </p>
  
  <p style="margin:4px 0 0 0; padding:0">
  <span id="record_h" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">h</span>
  <span>to <b>hide/show</b> this window</span>
  </p>
  
  <p style="margin:4px 0 0 0; padding:0">
  <span id="record_m" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">m</span>
  <span id="record_include_mousemove">to <b> record</b> mousemove</span>
  <span id="record_omit_mousemove" style="display:none">to <b>omit</b> mousemove</span>
  </p>
  
  <p style="margin:4px 0 0 0; padding:0">
  <span id="record_p" style="border:1px solid #226;background:#aaa;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">p</span>
  <span id="record_pause_on">to <b> pause</b> recording</span>
  <span id="record_pause_off" style="display:none">to <b>continue</b> recording</span>
  </p>
  
  <p style="margin:4px 0 0 0; padding:0">
  <span id="record_c" style="border:1px solid #226;background:#aaa;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">c</span>
  <span>to add checkpoint</span>
  </p>
  
  <p style="margin:6px 0 0 0; padding:0">
  checkpoints:
  </p>
  <div id="record_checkpoints" style="position:relative;width:100%;height:6em;overflow:auto;font: normal normal 8pt sans-serif; color:#000; text-align: left">
  </div>
  </div>
  
  </span>
  </body></html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Bounds.html
  
  Index: test_Bounds.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var bounds; 
      function test_01_Bounds_constructor (t) {
          t.plan( 11 );
          bounds = new OpenLayers.Bounds(0,2,10,4);
          t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
          t.eq( bounds.CLASS_NAME, "OpenLayers.Bounds", "bounds.CLASS_NAME is set correctly" );
          t.eq( bounds.left, 0, "bounds.left is set correctly" );
          t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
          t.eq( bounds.right, 10, "bounds.right is set correctly" );
          t.eq( bounds.top, 4, "bounds.top is set correctly" );
          t.eq( bounds.getWidth(), 10, "bounds.getWidth() returns correct value" );
          t.eq( bounds.getHeight(), 2, "bounds.getHeight() returns correct value" );
          
          var sz = bounds.getSize();
          var size = new OpenLayers.Size(10,2);
          t.ok(sz.equals(size),"bounds.getSize() has correct value" );
      
          var center = new OpenLayers.Pixel(5,3);
          var boundsCenter = bounds.getCenterPixel();
          t.ok( boundsCenter.equals(center), "bounds.getCenterLonLat() has correct value" );
  
          var center = new OpenLayers.LonLat(5,3);
          var boundsCenter = bounds.getCenterLonLat();
          t.ok( boundsCenter.equals(center), "bounds.getCenterLonLat() has correct value" );
       }
  
       function test_02_Bounds_toBBOX(t) {
           t.plan( 1 );
           bounds = new OpenLayers.Bounds(1,2,3,4);
           t.eq( bounds.toBBOX(), "1,2,3,4", "toBBOX() returns correct value." );
       }
  
       function test_03_Bounds_toString(t) {
           t.plan( 1 );
           bounds = new OpenLayers.Bounds(1,2,3,4);
           t.eq( bounds.toString(), "left-bottom=(1,2) right-top=(3,4)", "toString() returns correct value." ); 
       }
  
       function test_04_Bounds_contains(t) {
           t.plan( 4 );
           bounds = new OpenLayers.Bounds(10,10,40,40);
           t.eq( bounds.contains(20,20), true, "bounds(10,10,40,40) correctly contains LonLat(20,20)" );
           t.eq( bounds.contains(0,0), false, "bounds(10,10,40,40) correctly does not contain LonLat(0,0)" );
           t.eq( bounds.contains(40,40), true, "bounds(10,10,40,40) correctly contains LonLat(40,40) with inclusive set to true" );
           t.eq( bounds.contains(40,40, false), false, "bounds(10,10,40,40) correctly does not contain LonLat(40,40) with inclusive set to false" );
       }
  
       function test_05_Bounds_fromString(t) {
          t.plan( 10 );
          bounds = OpenLayers.Bounds.fromString("1,2,3,4");
          t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
          t.eq( bounds.left, 1, "bounds.left is set correctly" );
          t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
          t.eq( bounds.right, 3, "bounds.right is set correctly" );
          t.eq( bounds.top, 4, "bounds.top is set correctly" );
  
          bounds = OpenLayers.Bounds.fromString("1.1,2.2,3.3,4.4");
          t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
          t.eq( bounds.left, 1.1, "bounds.left is set correctly" );
          t.eq( bounds.bottom, 2.2, "bounds.bottom is set correctly" );
          t.eq( bounds.right, 3.3, "bounds.right is set correctly" );
          t.eq( bounds.top, 4.4, "bounds.top is set correctly" );
  
       }
  
       function test_06_Bounds_getSize(t) {
           t.plan( 1 );
           var bounds = new OpenLayers.Bounds(0,10,100,120);
  
           t.ok( bounds.getSize().equals(new OpenLayers.Size(100, 110)), "getCenterPixel() works correctly");
       }
       
       function test_07_Bounds_clone(t) {
          t.plan( 6 );
          var oldBounds = new OpenLayers.Bounds(1,2,3,4);
          var bounds = oldBounds.clone();
          t.ok( bounds instanceof OpenLayers.Bounds, "clone returns new OpenLayers.Bounds object" );
          t.eq( bounds.left, 1, "bounds.left is set correctly" );
          t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
          t.eq( bounds.right, 3, "bounds.right is set correctly" );
          t.eq( bounds.top, 4, "bounds.top is set correctly" );
          
          oldBounds.left = 100;
          t.eq( bounds.left, 1, "changing olBounds.left does not change bounds.left" );
       }
  
       function test_08_Bounds_containsBounds(t) {
           t.plan( 35 );
           containerBounds = new OpenLayers.Bounds(10,10,40,40);
  
           //totally outside
           bounds = new OpenLayers.Bounds(0,0,5,5);
           t.eq( containerBounds.containsBounds(bounds)              , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ")");
           t.eq( containerBounds.containsBounds(bounds, false)       , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false" );
           t.eq( containerBounds.containsBounds(bounds, false, true) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, false, false), false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
           t.eq( containerBounds.containsBounds(bounds, true)        , false , "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is true" );
           t.eq( containerBounds.containsBounds(bounds, true, true)  , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, true, false) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
  
           //totally outside on border
           bounds = new OpenLayers.Bounds(15,0,30,10);
           t.eq( containerBounds.containsBounds(bounds)              , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ")");
           t.eq( containerBounds.containsBounds(bounds, false)       , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false" );
           t.eq( containerBounds.containsBounds(bounds, false, true) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, false, false), false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
           t.eq( containerBounds.containsBounds(bounds, true)        , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true" );
           t.eq( containerBounds.containsBounds(bounds, true, true)  , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, true, false) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
  
           //partially inside
           bounds = new OpenLayers.Bounds(20,20,50,30);
           t.eq( containerBounds.containsBounds(bounds)              , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ")");
           t.eq( containerBounds.containsBounds(bounds, false)       , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false" );
           t.eq( containerBounds.containsBounds(bounds, false, true) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, false, false), false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
           t.eq( containerBounds.containsBounds(bounds, true)        , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true" );
           t.eq( containerBounds.containsBounds(bounds, true, true)  , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, true, false) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
  
           //totally inside on border
           bounds = new OpenLayers.Bounds(10,20,30,30);
           t.eq( containerBounds.containsBounds(bounds)              , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ")");
           t.eq( containerBounds.containsBounds(bounds, false)       , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false" );
           t.eq( containerBounds.containsBounds(bounds, false, true) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, false, false), false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
           t.eq( containerBounds.containsBounds(bounds, true)        , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true" );
           t.eq( containerBounds.containsBounds(bounds, true, true)  , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, true, false) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
  
           //totally inside
           bounds = new OpenLayers.Bounds(20,20,30,30);
           t.eq( containerBounds.containsBounds(bounds)              , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ")");
           t.eq( containerBounds.containsBounds(bounds, false)       , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false" );
           t.eq( containerBounds.containsBounds(bounds, false, true) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, false, false), true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
           t.eq( containerBounds.containsBounds(bounds, true)        , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true" );
           t.eq( containerBounds.containsBounds(bounds, true, true)  , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
           t.eq( containerBounds.containsBounds(bounds, true, false) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
       }
       
       function test_09_Bounds_determineQuadrant(t) {
  
          t.plan( 4 );
          var bounds = new OpenLayers.Bounds(0,0,100,100);
  
          var tl = new OpenLayers.LonLat(25, 75);
          var tr = new OpenLayers.LonLat(75, 75);
          var bl = new OpenLayers.LonLat(25, 25);
          var br = new OpenLayers.LonLat(75, 25);
  
          t.eq( bounds.determineQuadrant(tl), "tl", "bounds.determineQuadrant correctly identifies a coordinate in the top left quadrant");
          t.eq( bounds.determineQuadrant(tr), "tr", "bounds.determineQuadrant correctly identifies a coordinate in the top right quadrant");
          t.eq( bounds.determineQuadrant(bl), "bl", "bounds.determineQuadrant correctly identifies a coordinate in the bottom left quadrant");
          t.eq( bounds.determineQuadrant(br), "br", "bounds.determineQuadrant correctly identifies a coordinate in the bottom right quadrant");
       }
  
       function test_10_Bounds_oppositeQuadrant(t) {
  
          t.plan( 4 );
  
          t.eq( OpenLayers.Bounds.oppositeQuadrant("tl"), "br", "OpenLayers.Bounds.oppositeQuadrant returns 'br' for 'tl'");
          t.eq( OpenLayers.Bounds.oppositeQuadrant("tr"), "bl", "OpenLayers.Bounds.oppositeQuadrant returns 'bl' for 'tr'");
          t.eq( OpenLayers.Bounds.oppositeQuadrant("bl"), "tr", "OpenLayers.Bounds.oppositeQuadrant returns 'tr' for 'bl'");
          t.eq( OpenLayers.Bounds.oppositeQuadrant("br"), "tl", "OpenLayers.Bounds.oppositeQuadrant returns 'tl' for 'br'");
       }
  
       function test_11_Bounds_equals(t) {
           t.plan( 3 );
           var boundsA = new OpenLayers.Bounds(1,2,3,4);
           var boundsB = new OpenLayers.Bounds(1,2,3,4);
           var boundsC = new OpenLayers.Bounds(1,5,3,4);
           
           t.ok( boundsA.equals(boundsB), "equals() returns true on two equal bounds." );
           t.ok( !boundsA.equals(boundsC), "equals() returns false on two different bounds." );
           t.ok( !boundsA.equals(null), "equals() returns false on comparison to null");
       }
  
       function test_12_Bounds_getHeight_getWidth(t) {
           t.plan( 2 );
           var bounds = new OpenLayers.Bounds(10,20,100,120);
  
           t.eq( bounds.getWidth(), 90, "getWidth() works" );
           t.eq( bounds.getHeight(), 100, "getHeight() works" );
  
       }
  
       function test_13_Bounds_getCenters(t) {
           t.plan( 2 );
           var bounds = new OpenLayers.Bounds(0,20,100,120);
  
                   t.ok( bounds.getCenterPixel().equals(new OpenLayers.Pixel(50, 70)), "getCenterPixel() works correctly");
           t.ok( bounds.getCenterLonLat().equals(new OpenLayers.LonLat(50, 70)), "getCenterLonLat() works correctly");
       }
  
       function test_14_Bounds_fromArray(t) {
          t.plan( 5 );
          
          var bbox = [1,2,3,4];
          bounds = OpenLayers.Bounds.fromArray(bbox);
          t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
          t.eq( bounds.left, 1, "bounds.left is set correctly" );
          t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
          t.eq( bounds.right, 3, "bounds.right is set correctly" );
          t.eq( bounds.top, 4, "bounds.top is set correctly" );
       }
  
       function test_14_Bounds_fromSize(t) {
          t.plan( 5 );
          
          var height = 15;
          var width = 16;
          var size = new OpenLayers.Size(width, height);
          bounds = OpenLayers.Bounds.fromSize(size);
          t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
          t.eq( bounds.left, 0, "bounds.left is set correctly" );
          t.eq( bounds.bottom, height, "bounds.bottom is set correctly" );
          t.eq( bounds.right, width, "bounds.right is set correctly" );
          t.eq( bounds.top, 0, "bounds.top is set correctly" );
       }
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Control.html
  
  Index: test_Control.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var map; 
      function test_01_Control_constructor (t) {
          t.plan( 1 );
      
          control = new OpenLayers.Control();
          t.ok( control instanceof OpenLayers.Control, "new OpenLayers.Control returns object" );
      }
    // -->
    </script>
  </head>
  <body>
      <div id="map" style="width: 1024px; height: 512px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Control_LayerSwitcher.html
  
  Index: test_Control_LayerSwitcher.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var map; 
  
      function test_01_Control_LayerSwitcher_constructor (t) {
          t.plan( 1 );
      
          control = new OpenLayers.Control.LayerSwitcher();
          t.ok( control instanceof OpenLayers.Control.LayerSwitcher, "new OpenLayers.Control.LayerSwitcher returns object" );
      }
  
      function test_02_Control_LayerSwitcher_draw (t) {
          t.plan( 2 );
  
          map = new OpenLayers.Map('map');
          control = new OpenLayers.Control.LayerSwitcher();
          map.addControl(control);
  
          var div = control.draw();
          t.ok( control.div != null, "draw makes a div" );
          t.ok( div != null, "draw returns its div" );
      }
   
      function test_03_Control_LayerSwitcher_loadContents(t) {
  
          t.plan( 5 );
  
          map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.WMS("WMS", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(layer);
  
          markers = new OpenLayers.Layer.Markers("markers");
          map.addLayer(markers);
  
          control = new OpenLayers.Control.LayerSwitcher();
          map.addControl(control);
  
          t.ok(control.layersDiv != null, "correctly makes layers div");
          t.ok(control.baseLayersDiv != null, "correctly makes layers div");
          t.ok(control.dataLayersDiv != null, "correctly makes layers div");
  
          t.ok(control.maximizeDiv != null, "correctly makes resize div");
          t.ok(control.minimizeDiv != null, "correctly makes resize div");
  
          
  
      }
  
  
      function test_04_Control_LayerSwitcher_redraw (t) {
  
          t.plan( 8 );
  
          map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.WMS("WMS", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(layer);
  
          markers = new OpenLayers.Layer.Markers("markers");
          map.addLayer(markers);
  
          control = new OpenLayers.Control.LayerSwitcher();
          map.addControl(control);
  
          
          var wmsInput = $("input_" + layer.name);
          t.ok(wmsInput != null, "correctly makes an input for wms layer");
          t.eq(wmsInput.type, "radio", "wms correctly made a radio button");
          t.eq(wmsInput.name, "baseLayers", "wms correctly named");
          t.eq(wmsInput.value, layer.name, "wms correctly valued");
          
          var markersInput = $("input_" + markers.name);
          t.ok(markersInput != null, "correctly makes an input for markers layer");
          t.eq(markersInput.type, "checkbox", "wms correctly made a radio button");
          t.eq(markersInput.name, markers.name, "wms correctly named");
          t.eq(markersInput.value, markers.name, "wms correctly valued");
  
      }
  
  
    // -->
    </script>
  </head>
  <body>
      <div id="map" style="width: 1024px; height: 512px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Control_MouseToolbar.html
  
  Index: test_Control_MouseToolbar.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var map; 
      function test_01_Control_MouseToolbar_constructor (t) {
          t.plan( 1 );
      
          control = new OpenLayers.Control.MouseToolbar();
          t.ok( control instanceof OpenLayers.Control.MouseToolbar, "new OpenLayers.Control.MouseToolbar returns object" );
      }
      function test_02_Control_MouseToolbar_addControl (t) {
          t.plan( 7 );
          map = new OpenLayers.Map('map');
          control = new OpenLayers.Control.MouseToolbar();
          t.ok( control instanceof OpenLayers.Control.MouseToolbar, "new OpenLayers.Control.MouseToolbar returns object" );
          t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map creates map" );
          map.addControl(control);
          t.ok( control.map === map, "Control.map is set to the map object" );
          t.ok( map.controls[2] === control, "map.controls contains control" );
          t.eq( parseInt(control.div.style.zIndex), map.Z_INDEX_BASE['Control'] + 3, "Control div zIndexed properly" );
          t.eq( parseInt(map.viewPortDiv.lastChild.style.zIndex), map.Z_INDEX_BASE['Control'] + 3, "Viewport div contains control div" );
          t.eq( control.div.style.top, "6px", "Control div top located correctly by default");
  
      }
      function test_03_Control_MouseToolbar_control_events (t) {
          t.plan( 1 );
          var evt = {which: 1}; // control expects left-click
          map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(layer);
  
          control = new OpenLayers.Control.MouseToolbar();
          map.addControl(control);
  
          var centerLL = new OpenLayers.LonLat(0,0); 
          map.setCenter(centerLL, 5);
  
          evt.shiftKey = true;
          evt.xy = new OpenLayers.Size(5,5);
          control.defaultMouseDown(evt);
          evt.xy = new OpenLayers.Size(15,15);
          control.defaultMouseUp(evt);
          t.eq(map.getZoom(), 5, "Map zoom set correctly after zoombox");
  
      }
    // -->
    </script>
  </head>
  <body>
      <div id="map" style="width: 1024px; height: 512px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Control_PanZoom.html
  
  Index: test_Control_PanZoom.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var map; 
      function test_01_Control_PanZoom_constructor (t) {
          t.plan( 1 );
      
          control = new OpenLayers.Control.PanZoom();
          t.ok( control instanceof OpenLayers.Control.PanZoom, "new OpenLayers.Control.PanZoom returns object" );
      }
      function test_02_Control_PanZoom_addControl (t) {
          t.plan( 8 );
          map = new OpenLayers.Map('map');
          control = new OpenLayers.Control.PanZoom();
          t.ok( control instanceof OpenLayers.Control.PanZoom, "new OpenLayers.Control.PanZoom returns object" );
          t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map creates map" );
          map.addControl(control);
          t.ok( control.map === map, "Control.map is set to the map object" );
          t.ok( map.controls[2] === control, "map.controls contains control" );
          t.eq( parseInt(control.div.style.zIndex), map.Z_INDEX_BASE['Control'] + 3, "Control div zIndexed properly" );
          t.eq( parseInt(map.viewPortDiv.lastChild.style.zIndex), map.Z_INDEX_BASE['Control'] + 3, "Viewport div contains control div" );
          t.eq( control.div.style.top, "4px", "Control div top located correctly by default");
  
          var control2 = new OpenLayers.Control.PanZoom();
          map.addControl(control2, new OpenLayers.Pixel(100,100));
          t.eq( control2.div.style.top, "100px", "2nd control div is located correctly");
      }
      function test_03_Control_PanZoom_control_events (t) {
          t.plan( 7 );
          var evt = {which: 1}; // control expects left-click
          map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(layer);
  
          control = new OpenLayers.Control.PanZoom();
          map.addControl(control, new OpenLayers.Pixel(20,20));
  
          var centerLL = new OpenLayers.LonLat(0,0); 
          map.setCenter(centerLL, 5);
  
          control.buttons[0].onmousedown(evt);
          t.ok( map.getCenter().lat > centerLL.lat, "Pan up works correctly" );
  
          control.buttons[1].onmousedown(evt);
          t.ok( map.getCenter().lon < centerLL.lon, "Pan left works correctly" );
  
          control.buttons[2].onmousedown(evt);
          t.ok( map.getCenter().lon == centerLL.lon, "Pan right works correctly" );
  
          control.buttons[3].onmousedown(evt);
          t.ok( map.getCenter().lat == centerLL.lat, "Pan down works correctly" );
  
          control.buttons[4].onmousedown(evt);
          t.eq( map.getZoom(), 6, "zoomin works correctly" );
  
          control.buttons[6].onmousedown(evt);
          t.eq( map.getZoom(), 5, "zoomout works correctly" );
  
          control.buttons[5].onmousedown(evt);
          t.eq( map.getZoom(), 2, "zoomworld works correctly" );
  
      }
    // -->
    </script>
  </head>
  <body>
      <div id="map" style="width: 1024px; height: 512px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Control_PanZoomBar.html
  
  Index: test_Control_PanZoomBar.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var map; 
      function test_01_Control_PanZoomBar_constructor (t) {
          t.plan( 1 );
      
          control = new OpenLayers.Control.PanZoomBar();
          t.ok( control instanceof OpenLayers.Control.PanZoomBar, "new OpenLayers.Control.PanZoomBar returns object" );
      }
      function test_02_Control_PanZoomBar_addControl (t) {
          t.plan( 8 );
          map = new OpenLayers.Map('map', {controls:[]});
          var layer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(layer);
          control = new OpenLayers.Control.PanZoomBar();
          t.ok( control instanceof OpenLayers.Control.PanZoomBar, "new OpenLayers.Control.PanZoomBar returns object" );
          t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map creates map" );
          map.addControl(control);
          t.ok( control.map === map, "Control.map is set to the map object" );
          t.ok( map.controls[0] === control, "map.controls contains control" );
          t.eq( parseInt(control.div.style.zIndex), 1001, "Control div zIndexed properly" );
          t.eq( parseInt(map.viewPortDiv.lastChild.style.zIndex), 1001, "Viewport div contains control div" );
          t.eq( control.div.style.top, "4px", "Control div top located correctly by default");
  
          var control2 = new OpenLayers.Control.PanZoomBar();
          map.addControl(control2, new OpenLayers.Pixel(100,100));
          t.eq( control2.div.style.top, "100px", "2nd control div is located correctly");
      }
    // -->
    </script>
  </head>
  <body>
      <div id="map" style="width: 1024px; height: 512px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Control_Permalink.html
  
  Index: test_Control_Permalink.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var map; 
      function test_01_Control_Permalink_constructor (t) {
          t.plan( 1 );
      
          control = new OpenLayers.Control.Permalink();
          t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
      }
      function test_02_Control_Permalink_updateLinks (t) {
          t.plan( 2 );
      
          control = new OpenLayers.Control.Permalink($('permalink'));
          t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
          map = new OpenLayers.Map($('map'));
          layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
          map.addLayer(layer);
          if (!map.getCenter())  map.zoomToMaxExtent();
          map.addControl(control);
          map.pan(5, 0);
          if (/MSIE/.test(navigator.userAgent)) {
              t.eq($('permalink').href, "?lat=0&lon=1.75781&zoom=2", "Panning sets permalink");
          } else {
              t.eq($('permalink').href, location+"?lat=0&lon=1.75781&zoom=2", "Panning sets permalink");
          }
      }
      function test_03_Control_Permalink_updateLinksBase (t) {
          t.plan( 2 );
      
          control = new OpenLayers.Control.Permalink($('permalink'), "./edit.html" );
          t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
          map = new OpenLayers.Map($('map'));
          layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
          map.addLayer(layer);
          if (!map.getCenter())  map.zoomToMaxExtent();
          map.addControl(control);
          map.pan(5, 0);
          $('edit_permalink').href = './edit.html?lat=0&lon=1.75781&zoom=2';
          t.eq($('permalink').href, $('edit_permalink').href, "Panning sets permalink with base");
    }
    function test_03_Control_Permalink_noElement (t) {
          t.plan( 2 );
          control = new OpenLayers.Control.Permalink( );
          t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
          map = new OpenLayers.Map($('map'));
          map.addControl(control);
          t.eq(map.controls[2].div.firstChild.nodeName, "A", "Permalink control creates div with 'a' inside." );
    }
    // -->
    </script>
  </head>
  <body>
      <a id="permalink" href="">Permalink</a> <br />
      <a id="edit_permalink" href="">Edit</a> <br />
      <div id="map" style="width: 1024px; height: 512px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Events.html
  
  Index: test_Events.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var map; 
      var a;
      
      function test_01_Events_constructor (t) {
          var mapDiv = $('map');
          var obj = {result: 0};
          var eventTypes = ["doThingA", "doThingB", "doThingC"];
          var browserTypes = OpenLayers.Events.prototype.BROWSER_EVENTS;
  
          var totalTests = 5 + eventTypes.length + browserTypes.length;
  
          t.plan( totalTests );
  
          events = new OpenLayers.Events(obj, mapDiv, eventTypes);
  
          t.ok( events instanceof OpenLayers.Events, "new OpenLayers.Control returns object" );
  
          t.ok(events.object ==obj, " 'object' property correctly set");
          t.ok(events.element == mapDiv, " 'element' property correctly set");
          t.ok(events.eventTypes == eventTypes, " 'eventTypes' property correctly set");
  
  
          for (var i = 0; i < browserTypes.length; i++) {
              t.ok( events.listeners[browserTypes[i]] instanceof Array, 
                    "browser event: " + browserTypes[i] + " correctly registered" );
          }
          for (var i = 0; i < eventTypes.length; i++) {
              t.ok( events.listeners[eventTypes[i]] instanceof Array, 
                    "custom event: " + eventTypes[i] + " correctly registered");
          }
  
          // default/nulls
          events = new OpenLayers.Events(null, null, null);
          t.ok( events.listeners != null,
                "init of Events with null object/element/eventTypes still creates listeners array" );
      }
  
      function test_02_Events_register_unregister(t) {
   
          t.plan( 18 );
   
          var mapDiv = $('map');
          var obj = {result: 0};
          var eventTypes = ["doThingA", "doThingB", "doThingC"];
          
          events = new OpenLayers.Events(obj, mapDiv, eventTypes);
          
          var func = function () { this.result++ }
          events.register( "doThingA", obj, func );
  
          var listenerList = events.listeners["doThingA"];
          t.eq( listenerList.length, 1, "register correctly adds to event.listeners" );
          t.ok( listenerList[0].obj == obj, "obj property correctly registered");
          t.ok( listenerList[0].func == func, "func property correctly registered");
  
          var func2 = function () { this.result-- }
          events.register( "doThingA", obj, func2 );
  
          var listenerList = events.listeners["doThingA"];
          t.eq( listenerList.length, 2, "register correctly appends new callback to event.listeners[doThingA]" );
          t.ok( listenerList[1].obj == obj, "obj property correctly registered");
          t.ok( listenerList[1].func == func2, "func property correctly registered");
  
          var func3 = function () { this.result = this.result + 3; }
          events.register( "doThingA", null, func3 );
  
          var listenerList = events.listeners["doThingA"];
          t.eq( listenerList.length, 3, "register correctly appends new callback to event.listeners[doThingA] even when obj passed in is null" );
          t.ok( listenerList[2].obj == obj, "obj is correctly set to Events.object default when null is passed in.");
          t.ok( listenerList[2].func == func3, "func property correctly registered");
  
          events.register( "doThingA", obj, null);
  
          var listenerList = events.listeners["doThingA"];
          t.eq( listenerList.length, 3, "register correctly does not append null callback to event.listeners[doThingA] even when obj passed in is null" );
  
          events.register( "chicken", obj, func);
          t.ok( events.listeners["chicken"] == null, "register() does nothing on attempt to register un-enabled event");
  
          events.unregister("doThingA", obj, null);
          var listenerList = events.listeners["doThingA"];
          t.eq( listenerList.length, 3, "trying to unregister a null callback does nothing -- but doesnt crash :-)" );
      
          events.unregister("doThingA", obj, func);
          var found = false;
          for (var i = 0; i < listenerList.length; i++) {
              var listener = listenerList[i];
              if (listener.obj == obj && listener.func == func) {
                  found = true;
              }
          }                
          t.ok( (listenerList.length == 2) && !found, "unregister correctly removes callback" );
  
          events.unregister("doThingA", null, func3);
          var found = false;
          for (var i = 0; i < listenerList.length; i++) {
              var listener = listenerList[i];
              if (listener.obj == obj && listener.func == func) {
                  found = true;
              }
          }                
          t.ok( (listenerList.length == 1) && !found, "unregister correctly removes callback when no obj specified" );
          
          var func4 = function () { this.result = "chicken"; }
          events.unregister("doThingA", obj, func4);
          t.ok( (listenerList.length == 1), "unregister does not bomb if you try to remove an unregistered callback" );
  
          var obj2 = { chicken: 151 };
          events.unregister("doThingA", obj2, func2);
          t.ok( (listenerList.length == 1), "unregister does not bomb or accidntally remove if you try to remove a valid callback on a valid event type, but with the wrong context object" );
  
          events.unregister("doThingA", obj, null);
          t.ok( (listenerList.length == 1), "unregister does not bomb if you try to remove a null callback" );
  
          events.unregister("chicken", null, func3);
          t.ok( events.listeners["chicken"] == null, "unregistering an event that is not enabled does not wierdly enable it -- or cause a script error")
  
  
      }
  
      function test_03_Events_remove(t) {
  
          t.plan( 2 );
   
          var mapDiv = $('map');
          var obj = {result: 0};
          var eventTypes = ["doThingA", "doThingB", "doThingC"];
          
          events = new OpenLayers.Events(obj, mapDiv, eventTypes);
          
          var func = function () { this.result++ }
          var func2 = function () { this.result-- }
          var func3 = function () { this.result = this.result + 3; }
  
          events.register( "doThingA", obj, func );
          events.register( "doThingA", obj, func2 );
          events.register( "doThingA", null, func3 );
  
          events.remove("doThingA");
  
          t.eq( events.listeners["doThingA"].length, 0, "remove() correctly clears the event listeners" );
  
          events.remove("chicken");
          t.ok( events.listeners["chicken"] == null, "remove on non-enabled event does not break or accidentally enable the event");
  
      }
  
      function test_04_Events_triggerEvent(t) {
      
          t.plan( 6 );
   
          var mapDiv = $('map');
          var obj = {result: 0};
          var eventTypes = ["doThingA", "doThingB", "doThingC"];
          
          events = new OpenLayers.Events(obj, mapDiv, eventTypes);
          
          
          var func = function () { this.result++ }
          events.register( "doThingA", obj, func );
  
          events.triggerEvent("doThingA", {});
          t.eq( obj.result, 1, "result is 1 after we call triggerEvent" );
          events.triggerEvent("doThingA");
          t.eq( obj.result, 2, "result is 2 after we call triggerEvent with no event" );
  
          var funcB = function() { this.FUNK = "B"; return false; }
          events.register( "doThingA", obj, funcB);
  
          events.triggerEvent("doThingA");
          t.ok ((obj.result == 3) && (obj.FUNK == "B"), "executing multiple callbacks works")
  
          var funcZ = function() { this.FUNK = "Z"; }
          events.register( "doThingA", obj, funcZ);
  
          events.triggerEvent("doThingA");
          t.ok ((obj.result == 4) && (obj.FUNK == "B"), "executing multiple callbacks works, and when one returns false, it stops chain correctly")
  
  
          var func2 = function() { this.result = this.result + 10; }
          events.register( "doThingB", null, func2);
          
          events.triggerEvent("doThingB");
          t.eq( obj.result, 14, "passing a null object default gets set correctly");
          
          //no specific t.ok for this one, but if it breaks, you will know it.
          events.triggerEvent("chicken");
  
          events = new OpenLayers.Events(null, mapDiv, eventTypes);
          
          // a is global variable (context-irrelevant)
          a = 0;
          var func = function () { a = 5; }
          events.register( "doThingC", null, func );
          events.triggerEvent("doThingC");
  
          t.eq(a, 5, "if Events has no object set and an event is registered also with no object, triggerEvent() calls it without trying to set the context to null");        
      }
     
    // -->
    </script>
  </head>
  <body>
      <div id="map" style="width: 1024px; height: 512px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Feature.html
  
  Index: test_Feature.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var map; 
      var feature, layer; 
      
      function test_01_Feature_constructor (t) {
          t.plan( 6 );
  
          var layer = new Object();
          var lonlat = new OpenLayers.LonLat(2,1);
          var iconURL = 'http://boston.openguides.org/features/ORANGE.png';
          var iconSize = new OpenLayers.Size(12, 17);
          var data =  { iconURL: iconURL,
                        iconSize: iconSize 
                      };
          
          feature = new OpenLayers.Feature(layer, lonlat, data);
  
          t.ok( feature instanceof OpenLayers.Feature, "new OpenLayers.Feature returns Feature object" );
          t.eq( feature.layer, layer, "feature.layer set correctly" );
          t.ok( feature.id.startsWith("Feature_"), "feature.id set correctly" );
          t.ok( feature.lonlat.equals(lonlat), "feature.lonlat set correctly" );
          t.eq( feature.data.iconURL, iconURL, "feature.data.iconURL set correctly" );
          t.ok( feature.data.iconSize.equals(iconSize), "feature.data.iconSize set correctly" );
      }
      
      function test_02_Feature_createMarker (t) {
          t.plan(1);
          t.ok(true);
  /*
  
          t.plan( 11 );
          feature = new OpenLayers.Feature("myfeature", new OpenLayers.LonLat(2,1), 
                 {
                  iconURL:'http://boston.openguides.org/features/ORANGE.png',
                  iconW: 12,
                  iconH: 17
                 });
          layer = new OpenLayers.Layer.Markers('Marker Layer');
          t.ok( feature instanceof OpenLayers.Feature, "new OpenLayers.Feature returns Feature object" );
          t.ok( layer instanceof OpenLayers.Layer.Markers, "Layer is a marker layer" );
          feature.createMarker(layer);
          
          t.ok( feature.marker instanceof OpenLayers.Marker, 
                "createMarker sets a marker property to a marker" );
          t.ok( layer.markers[0] === feature.marker, 
                "First marker in layer is the feature marker" );
          
          t.ok( feature.marker.lonlat instanceof OpenLayers.LonLat, 
                "createMarker sets a marker lontlat property to a lonlat" );
          t.ok( layer.markers[0].lonlat === feature.lonlat, 
                "First marker in the layer matches feature lonlat" );
          
          t.ok( feature.marker.icon instanceof OpenLayers.Icon, 
                "createMarker sets a marker icon property to an icon" );
          
          t.eq( feature.marker.icon.url, 
                "http://boston.openguides.org/features/ORANGE.png", 
                "createMarker sets marker url correctly" );
         
          var map = new OpenLayers.Map('map');
          map.addLayer(layer);
          map.setCenter(new OpenLayers.LonLat(0,0),0);
          t.ok( map.layers[0] == layer,
                "Marker layer added to map okay." );
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( map.layers[0].div.firstChild instanceof HTMLImageElement,
                    "layer div firstChild is an image" );
          t.eq( map.layers[0].div.firstChild.src,
                "http://boston.openguides.org/features/ORANGE.png", 
                "Layer div img contains correct url" );
  */
      }
  
    // -->
    </script>
  </head>
  <body>
    <div id="map" style="width: 500px; height: 300px;"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Icon.html
  
  Index: test_Icon.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var icon; 
      
      function test_01_Icon_constructor (t) {
          t.plan( 4 );
          var size = new OpenLayers.Size(5,6);
          icon = new OpenLayers.Icon("", size);
          t.ok( icon instanceof OpenLayers.Icon, "new OpenLayers.Icon returns Icon object" );
          t.ok( icon.size instanceof OpenLayers.Size, "icon.size returns Size object" );
          t.ok( icon.size.equals(size), "icon.size returns correct value" );
          t.eq( icon.url, "", "icon.url returns str object" );
      }
      function test_02_Icon_clone (t) {
          t.plan( 4 );
          icon = new OpenLayers.Icon("a",new OpenLayers.Size(5,6));
          t.ok( icon instanceof OpenLayers.Icon, "new OpenLayers.Icon returns Icon object" );
          var cloned = icon.clone();
          t.ok( cloned instanceof OpenLayers.Icon, "clone is an OpenLayers.Icon" );
          cloned.url = "b"
          t.eq( icon.url, "a", "icon.url doesn't change with clone's url" );
          t.eq( cloned.url, "b", "cloned.url does change when edited" );
      }
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer.html
  
  Index: test_Layer.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var layer; 
  
      function test_01_Layer_constructor (t) {
          t.plan( 14 );
          
          var options = { chicken: 151, foo: "bar", projection: "none" };
          var layer = new OpenLayers.Layer('Test Layer', options);
          
          t.ok( layer instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
          t.eq( layer.CLASS_NAME, "OpenLayers.Layer", "CLASS_NAME variable set correctly");
  
          t.eq( layer.name, "Test Layer", "layer.name is correct" );
          t.ok( layer.id != null, "Layer is given an id");
          t.ok( layer.id.startsWith("Layer_"), "layer id starts correctly");
          t.ok( layer.projection, "none", "default layer projection correctly set");
          t.ok( ((layer.chicken == 151) && (layer.foo == "bar")), "layer.options correctly set to Layer Object" );
          t.ok( ((layer.options["chicken"] == 151) && (layer.options["foo"] == "bar")), "layer.options correctly backed up" );
  
          options.chicken = 552;
          
          t.eq( layer.options["chicken"], 151 , "layer.options correctly made fresh copy" );
          
          t.eq( layer.isBaseLayer, false, "Default layer is not base layer" );
  
          layer = new OpenLayers.Layer('Test Layer');
          t.ok( layer instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
          t.eq( layer.name, "Test Layer", "layer.name is correct" );
          t.ok( layer.projection == null, "default layer projection correctly set");
          t.ok( layer.options instanceof Object, "layer.options correctly initialized as a non-null Object" );
      }
  
      function test_02_Layer_clone (t) {
          t.plan( 6 );
          
          var map = new OpenLayers.Map('map'); 
          var options = { chicken: 151, foo: "bar" };
          var layer = new OpenLayers.Layer('Test Layer', options);
          map.addLayer(layer);
  
          // randomly assigned property
          layer.chocolate = 5;
  
          var clone = layer.clone();
  
          t.ok( clone instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
          t.eq( clone.name, "Test Layer", "default clone.name is correct" );
          t.ok( ((clone.options["chicken"] == 151) && (clone.options["foo"] == "bar")), "clone.options correctly set" );
          t.eq(clone.chocolate, 5, "correctly copied randomly assigned property");
  
          layer.addOptions({chicken:152});
          t.eq(clone.options["chicken"], 151, "made a clean copy of options");        
  
          
          t.ok( clone.map == null, "cloned layer has map property set to null")
          
      }
  
      function test_03_Layer_setName (t) {
          
          t.plan( 1 );
  
          layer = new OpenLayers.Layer('Test Layer');
          layer.setName("chicken");
          
          t.eq(layer.name, "chicken", "setName() works")
          
      }
  
      function test_04_Layer_addOptions (t) {
          
          t.plan( 4 );
  
          var options = { chicken: 151, foo: "bar" };
          var layer = new OpenLayers.Layer('Test Layer', options);
  
          layer.addOptions({bark:55, chicken: 171});
  
          t.eq(layer.bark, 55, "addOptions() assigns new option correctly to Layer");
          t.eq(layer.options.bark, 55, "addOptions() adds new option correctly to backup");
  
          t.eq(layer.chicken, 171, "addOptions() overwrites option correctly to Layer");
          t.eq(layer.options.chicken, 171, "addOptions() overwrites option correctly to backup");
  
      }
      
      function test_04_Layer_StandardOptionsAccessors (t) {
  
          t.plan( 4 );
  
          var projection = "chicken";
          var maxExtent = new OpenLayers.Bounds(50,50,100,100);
          var maxResolution = 1.5726;
          var numZoomLevels = 11;
  
          var options = { projection: projection, 
                          maxExtent: maxExtent,
                          maxResolution: maxResolution,
                          numZoomLevels: numZoomLevels
                          };
  
          var layer = new OpenLayers.Layer('Test Layer', options);
  
          t.eq(layer.getProjection(), projection, "getProjection() works");
          t.ok(layer.getMaxExtent().equals(maxExtent), "getMaxExtent() works");
          t.eq(layer.getMaxResolution(), maxResolution, "getMaxResolution() works");
          t.eq(layer.getNumZoomLevels(), numZoomLevels, "getNumZoomLevels() works");
      }
  
      function test_05_Layer_visibility(t) {
  
          t.plan(3)
  
          var layer = new OpenLayers.Layer('Test Layer');
      
          t.eq(layer.getVisibility(), true, "default for layer creation is visible");
          
          layer.setVisibility(false);
          t.eq(layer.getVisibility(), false, "setVisibility false works");
  
          layer.setVisibility(true);
          t.eq(layer.getVisibility(), true, "setVisibility true works");
      
      }
  
  
  /******
   * 
   * 
   * HERE IS WHERE SOME TESTS SHOULD BE PUT TO CHECK ON THE LONLAT-PX TRANSLATION
   * FUNCTIONS AND RESOLUTION AND GETEXTENT GETZOOMLEVEL, ETC
   * 
   * 
   */
  
  
      function test_99_Layer_destroy (t) {
          t.plan( 4 );    
  
          var map = new OpenLayers.Map('map');
          
          layer = new OpenLayers.Layer('Test Layer');
  
          map.addLayer(layer);
  
          layer.destroy();
  
          t.eq( layer.name, null, "layer.name is null after destroy" );
          t.eq( layer.div, null, "layer.div is null after destroy" );
          t.eq( layer.map, null, "layer.map is null after destroy" );
          t.eq( layer.options, null, "layer.options is null after destroy" );
  
      }
    // -->
    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_EventPane.html
  
  Index: test_Layer_EventPane.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var layer; 
  
      function test_01_Layer_EventPane_constructor (t) {
          t.plan( 5 );
          
          var layer = new OpenLayers.Layer.EventPane('Test Layer');
          
          t.ok( layer instanceof OpenLayers.Layer.EventPane, "new OpenLayers.Layer.EventPane returns object" );
          t.eq( layer.CLASS_NAME, "OpenLayers.Layer.EventPane", "CLASS_NAME variable set correctly");
          t.eq( layer.name, "Test Layer", "layer.name is correct" );
          t.eq( layer.isBaseLayer, true, "EventPane layer is always base layer" );
          if (!isMozilla) {
              t.ok( true, "skipping element test outside of Mozilla");
          } else {
              t.ok( layer.pane instanceof HTMLDivElement, "layer.pane is an HTMLDivElement" );
          }
      }
  
      function test_02_Layer_EventPane_clone (t) {
          t.plan( 1 );
          t.ok( true, "need to actually write some tests here" );
          return;
          
          /// FIX ME FIX ME: fix this later
  
          var map = new OpenLayers.Map('map'); 
          var options = { chicken: 151, foo: "bar" };
          var layer = new OpenLayers.Layer('Test Layer', options);
          map.addLayer(layer);
  
          // randomly assigned property
          layer.chocolate = 5;
  
          var clone = layer.clone();
  
          t.ok( clone instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
          t.eq( clone.name, "Test Layer", "default clone.name is correct" );
          t.ok( ((clone.options["chicken"] == 151) && (clone.options["foo"] == "bar")), "clone.options correctly set" );
          t.eq(clone.chocolate, 5, "correctly copied randomly assigned property");
  
          layer.addOptions({chicken:152});
          t.eq(clone.options["chicken"], 151, "made a clean copy of options");        
  
          
          t.ok( clone.map == null, "cloned layer has map property set to null")
          
      }
  
      function test_10_Layer_EventPane_setMap (t) {
  
  // MOUSEMOVE test does not seem to work... 
  //         t.plan( 2 );    
  
          if (document.createEventObject) {
            t.plan(3);
          } else {
            t.plan(1);
          }
          var map = new OpenLayers.Map('map');
          
          layer = new OpenLayers.Layer.EventPane('Test Layer');
  
          map.addLayer(layer);
          t.eq( parseInt(layer.pane.style.zIndex) - parseInt(layer.div.style.zIndex),
              1, "layer pane is 1 z-level above its div" );
  
          map.events.register("mousemove", map, function () {
              t.ok(true, "got mouse move");
          });
          
          if( document.createEvent ) { // Mozilla
            var evObj = document.createEvent('MouseEvents');
            evObj.initEvent( 'mousemove', true, false );
            layer.pane.dispatchEvent(evObj);
          } else if( document.createEventObject ) { // IE
            layer.pane.fireEvent('onmousemove');
          }
      }
  
      function test_20_Layer_EventPane_setVisibility (t) {
          t.plan( 2 );    
          layer = new OpenLayers.Layer.EventPane('Test Layer');
          layer.setVisibility(false);
          t.eq(layer.pane.style.display, "none", "layer pane is now invisible");
          layer.setVisibility(true);
          t.eq(layer.pane.style.display, "block", "layer pane is now visible");
      }
    // -->
    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_GeoRSS.html
  
  Index: test_Layer_GeoRSS.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var layer; 
  
      function test_01_Layer_GeoRSS_constructor (t) {
          t.plan( 5 );
          layer = new OpenLayers.Layer.GeoRSS('Test Layer', "./georss.txt" );
          t.ok( layer instanceof OpenLayers.Layer.GeoRSS, "new OpenLayers.Layer.GeoRSS returns object" );
          t.eq( layer.location, "./georss.txt", "layer.location is correct" );
          var markers;
          t.delay_call( 1, function() {  
              t.eq( layer.markers.length, 40, "marker length is correct" );
              var ll = new OpenLayers.LonLat(-71.142197, 42.405696);
              t.ok( layer.markers[0].lonlat.equals(ll), "lonlat on first marker is correct" );
              t.eq( layer.name, "Crschmidt's Places At Platial", "Layer name is correct." );
          } );
      }
      function test_02_Layer_GeoRSS_draw (t) { 
  //        t.plan(5);
          t.plan( 2 );
          layer = new OpenLayers.Layer.GeoRSS('Test Layer', './georss.txt');
          t.ok( layer instanceof OpenLayers.Layer.GeoRSS, "new OpenLayers.Layer.GeoRSS returns object" );
          var map = new OpenLayers.Map('map');
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
          map.addLayer(layer);
          t.delay_call( 1, function() { 
            map.setCenter(new OpenLayers.LonLat(0,0),0);
            t.eq( map.layers[1].name, layer.name, "Layer name is correct" );
  
          });;
      }
      function test_03_Layer_GeoRSS_events (t) {
          t.plan( 4 );    
          layer = new OpenLayers.Layer.GeoRSS('Test Layer', './georss.txt');
          var map = new OpenLayers.Map('map');
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
          map.addLayer(layer);
          map.setCenter(new OpenLayers.LonLat(0,0),0);
          var event = {};
          t.delay_call( 1, function() {  
            t.ok(layer.markers[0].events, "First marker has an events object");
            t.eq(layer.markers[0].events.listeners['click'].length, 1, "Marker events has one object");
            layer.markers[0].events.triggerEvent('click', event);
            t.eq(map.popups.length, 1, "Popup opened correctly");
            layer.markers[1].events.triggerEvent('click', event);
            t.eq(map.popups.length, 1, "1st popup gone, 2nd Popup opened correctly");
          });
      }
  
      function test_99_Layer_GeoRSS_destroy (t) {
          t.plan( 1 );    
          layer = new OpenLayers.Layer.GeoRSS('Test Layer', './georss.txt');
          var map = new OpenLayers.Map('map');
          map.addLayer(layer);
          layer.destroy();
          t.eq( layer.map, null, "layer.map is null after destroy" );
      }
    // -->
    </script>
  </head>
  <body>
    <div id="map" style="width:500px; height:500px"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_Google.html
  
  Index: test_Layer_Google.html
  ===================================================================
  <html>
  <head>
    <!-- this gmaps key generated for http://openlayers.org/dev/ -->
    <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghSPUCi5aRYVveCcVYxzezM4iaj_gxQ9t-UajFL70jfcpquH5l1IJ-Zyyw'></script>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var layer; 
  
      function test_01_Layer_Google_constructor (t) {
          t.plan( 4 );
          
          var map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.Google('Goog Layer');
          map.addLayer(layer);
          
          
          t.ok( layer instanceof OpenLayers.Layer.Google, "new OpenLayers.Layer.Google returns object" );
          t.eq( layer.CLASS_NAME, "OpenLayers.Layer.Google", "CLASS_NAME variable set correctly");
  
          t.eq( layer.name, "Goog Layer", "layer.name is correct" );
  
          t.ok ( layer.gmap != null, "GMap2 Object correctly loaded");
      }
  
      function test_02_Layer_Google_isBaseLayer (t) {
          t.plan(1);
          
          var layer = new OpenLayers.Layer.Google('Goog Layer');
  
          t.ok(layer.isBaseLayer, "a default load of google layer responds as a base layer");
      }    
  
      function test_03_Layer_Google_Translation_zoom (t) {
          
          t.plan( 4 );
          
          var map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.Google('Goog Layer');
          map.addLayer(layer);
  
       // these two lines specify an appropriate translation. 
       //  the code afterwards works by itself to test that translation
       //  works correctly both ways.
          var gZoom = 5;
          var correspondingOLZoom = 5;
  
  
          olZoom = layer.getOLZoomFromGZoom(gZoom);
          t.eq(olZoom, correspondingOLZoom, "Translation from GZoom to OL Zoom works");
          t.eq(layer.getGZoomFromOLZoom(olZoom), gZoom, "Translation from OL Zoom to GZoom works");
  
          t.ok( layer.getGZoomFromOLZoom(null) == null, "getGZoomFromOLZoom(null) returns null");
          t.ok( layer.getOLZoomFromGZoom(null) == null, "getOLZoomFromGZoom(null) returns null");
      }
  
      function test_04_Layer_Google_Translation_lonlat (t) {
          
          t.plan( 4 );
          
          var map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.Google('Goog Layer');
          map.addLayer(layer);
  
       // these two lines specify an appropriate translation. 
       //  the code afterwards works by itself to test that translation
       //  works correctly both ways.
          var gLatLng = new GLatLng(50,100);
          var correspondingOLLonLat = new OpenLayers.LonLat(100,50);
  
  
          olLonLat = layer.getOLLonLatFromGLatLng(gLatLng);
          t.ok(olLonLat.equals(correspondingOLLonLat), "Translation from GLatLng to OpenLayers.LonLat works");
  
          var transGLatLng = layer.getGLatLngFromOLLonLat(olLonLat);
          t.ok( transGLatLng.equals(gLatLng), "Translation from OpenLayers.LonLat to GLatLng works");
  
          t.ok( layer.getGLatLngFromOLLonLat(null) == null, "getGLatLngFromOLLonLat(null) returns null");
          t.ok( layer.getOLLonLatFromGLatLng(null) == null, "getOLLonLatFromGLatLng(null) returns null");
      }
  
      function test_05_Layer_Google_Translation_pixel (t) {
          
          t.plan( 4 );
          
          var map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.Google('Goog Layer');
          map.addLayer(layer);
  
       // these two lines specify an appropriate translation. 
       //  the code afterwards works by itself to test that translation
       //  works correctly both ways.
          var gPoint = new GPoint(50,100);
          var correspondingOLPixel = new OpenLayers.Pixel(50, 100);
  
  
          olPixel = layer.getOLPixelFromGPoint(gPoint);
          t.ok( olPixel.equals(correspondingOLPixel), "Translation from GPoint to OpenLayers.Pixel works");
  
          var transGPoint = layer.getGPointFromOLPixel(olPixel);
          t.ok( transGPoint.equals(gPoint), "Translation from OpenLayers.Pixel to GPoint works");
  
          t.ok( layer.getGPointFromOLPixel(null) == null, "getGPointFromOLPixel(null) returns null");
          t.ok( layer.getOLPixelFromGPoint(null) == null, "getOLPixelFromGPoint(null) returns null");
      }
  
      function test_06_Layer_Google_Translation_bounds (t) {
          
          t.plan( 4 );
          
          var map = new OpenLayers.Map('map');
          var layer = new OpenLayers.Layer.Google('Goog Layer');
          map.addLayer(layer);
  
       // these two lines specify an appropriate translation. 
       //  the code afterwards works by itself to test that translation
       //  works correctly both ways.
          var sw = new GLatLng(10,20);
          var ne = new GLatLng(50,40)
          var gBounds = new GLatLngBounds(sw, ne);
          var correspondingOLBounds = new OpenLayers.Bounds(20, 10, 40, 50);
  
  
          olBounds = layer.getOLBoundsFromGLatLngBounds(gBounds);
  
          t.ok(olBounds.equals(correspondingOLBounds), "Translation from GLatLngBounds to OpenLayers.Bounds works");
  
          var transGBounds = layer.getGLatLngBoundsFromOLBounds(olBounds);
          t.ok( transGBounds.equals(gBounds), "Translation from OpenLayers.Bounds to GLatLngBounds works");
  
          t.ok( layer.getGLatLngBoundsFromOLBounds(null) == null, "getGLatLngBoundsFromOLBounds(null) returns null");
          t.ok( layer.getOLBoundsFromGLatLngBounds(null) == null, "getOLBoundsFromGLatLngBounds(null) returns null");
      }
  
      function test_99_Layer_destroy (t) {
          t.plan( 5 );    
  
          var map = new OpenLayers.Map('map');
          
          layer = new OpenLayers.Layer.Google('Test Layer');
          map.addLayer(layer);
  
          layer.destroy();
  
          t.eq( layer.name, null, "layer.name is null after destroy" );
          t.eq( layer.div, null, "layer.div is null after destroy" );
          t.eq( layer.map, null, "layer.map is null after destroy" );
          t.eq( layer.options, null, "layer.options is null after destroy" );
          t.eq( layer.gmap, null, "layer.gmap is null after destroy" );
      }
    // -->
    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_Grid.html
  
  Index: test_Layer_Grid.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var layer; 
  
      var name = 'Test Layer';
      var url = "http://octo.metacarta.com/cgi-bin/mapserv";
      var params = { map: '/mapdata/vmap_wms.map', 
                     layers: 'basic', 
                     format: 'image/png'};
  
      /**
       *  NOTE TO READER:
       * 
       *    Some of the tests on the Grid class actually use the WMS class. 
       *    This is because WMS is a subclass of Grid and it implements the 
       *    core functions which are necessary to test the tile-generation 
       *    mechanism. 
       * 
       */
  
  
      function test_01_Layer_Grid_constructor (t) {
          t.plan( 1 );
                         
          layer = new OpenLayers.Layer.Grid(name, url, params, null);
          t.ok( layer instanceof OpenLayers.Layer.Grid, "returns OpenLayers.Layer.Grid object" );
      }
  
  
      function test_02_Layer_Grid_inittiles (t) {
          t.plan( 2 );
          var map = new OpenLayers.Map($('map'));
          layer = new OpenLayers.Layer.WMS(name, url, params);
          map.addLayer(layer);
          map.setCenter(new OpenLayers.LonLat(0,0),5);
          t.eq( layer.grid.length, 7, "Grid rows is correct." );
          t.eq( layer.grid[0].length, 6, "Grid cols is correct." );
          
      }
  
      function test_03_Layer_Grid_clearTiles (t) {
          t.plan(1);
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.WMS(name, url, params);
          map.addLayer(layer);
  
          map.setCenter(new OpenLayers.LonLat(0,0));
  
  
          //grab a reference to one of the tiles
          var tile = layer.grid[0][0];        
  
          layer.clearGrid();
  
          t.ok( layer.grid != null, "layer.grid does not get nullified" );
      }
  
  
      function test_04_Layer_Grid_getGridBounds(t) {
          t.plan( 1 );
  
          layer = new OpenLayers.Layer.WMS(name, url, params);
  
          var bl = { bounds: new OpenLayers.Bounds(1,2,0,0)};
          var tr = { bounds: new OpenLayers.Bounds(0,0,3,4)};
          layer.grid = [ [6, tr], 
                         [bl, 7]];
  
          var bounds = layer.getGridBounds();
      
          var testBounds = new OpenLayers.Bounds(1,2,3,4);
          
          t.ok( bounds.equals(testBounds), "getGridBounds() returns correct bounds")
      }
  
      function test_05_Layer_Grid_getResolution(t) {
          t.plan( 1 );
  
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.WMS(name, url, params);
          map.addLayer(layer);
  
          map.zoom = 5;
  
          t.eq( layer.getResolution(), 0.0439453125, "getResolution() returns correct value");
      }
  
      function test_06_Layer_Grid_getZoomForExtent(t) {
          t.plan( 2 );
          var bounds, zoom;
  
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.WMS(name, url, params);
          map.addLayer(layer);
  
          bounds = new OpenLayers.Bounds(10,10,12,12);
          zoom = layer.getZoomForExtent(bounds);
  
          t.eq( zoom, 8, "getZoomForExtent() returns correct value");
  
          bounds = new OpenLayers.Bounds(10,10,100,100);
          zoom = layer.getZoomForExtent(bounds);
  
          t.eq( zoom, 3, "getZoomForExtent() returns correct value");
      }   
  
  
      /** THIS WOULD BE WHERE THE TESTS WOULD GO FOR 
       *     
       *    -moveTo
       *    -insertColumn
       *    -insertRow
      
      function 07_Layer_Grid_moveTo(t) {
      }
  
      function 08_Layer_Grid_insertColumn(t) {
      }
  
      function 09_Layer_Grid_insertRow(t) {
      }
  
       * 
       */
  
      function test_10_Layer_Grid_clone(t) {
          t.plan(4);
          
          var options = {tileSize: new OpenLayers.Size(500,50)};
          var map = new OpenLayers.Map('map', options);
          layer = new OpenLayers.Layer.Grid(name, url, params);
          map.addLayer(layer);
  
          layer.grid = [ [6, 7], 
                         [8, 9]];
  
          var clone = layer.clone();
  
          t.ok( clone.grid == null, "clone does not copy grid");
  
          t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
  
          layer.tileSize.w += 40;
  
          t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference");
  
          t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
      }
  
      function test_11_Layer_Grid_setMap(t) {
  
          t.plan(2);
          
          var options = {tileSize: new OpenLayers.Size(500,50)};
          var map = new OpenLayers.Map('map', options);
          layer = new OpenLayers.Layer.Grid(name, url, params);
  
  
          layer.setMap(map);
          
          t.ok( layer.tileSize != null, "tileSize has been set");
          t.ok( (layer.tileSize.h == 50) && (layer.tileSize.w == 500), "tileSize has been set correctly");
      }
  
  
      function test_99_Layer_Grid_destroy (t) {
  
          t.plan( 3 );
  
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.Grid(name, url, params);
          map.addLayer(layer);
          layer.destroy();
          t.eq( layer.grid, null, "layer.grid is null after destroy" );
          t.eq( layer.tileSize, null, "layer.tileSize is null after destroy" );
  
  
      //test with tile creation
          layer = new OpenLayers.Layer.WMS(name, url, params);
          map.addLayer(layer);
  
          map.setCenter(new OpenLayers.LonLat(0,0), 5);
  
          //grab a reference to one of the tiles
          var tile = layer.grid[0][0];        
  
          layer.destroy();
  
          t.ok( layer.grid == null, "tiles appropriately destroyed")
      }
      
         // -->
    </script>
  </head>
  <body>
  <div id="map" style="width:500px;height:550px;display:none"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_HTTPRequest.html
  
  Index: test_Layer_HTTPRequest.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var layer; 
  
      var name = "Test Layer";
      var url = "http://octo.metacarta.com/cgi-bin/mapserv";
      var params = { map: '/mapdata/vmap_wms.map', 
                     layers: 'basic', 
                     format: 'image/png'};
      var options = { chicken: 151, foo: "bar" };
  
      function test_01_Layer_HTTPRequest_constructor (t) {
          t.plan( 5 );
  
          layer = new OpenLayers.Layer.HTTPRequest(name, url, params, options);
          
          t.ok( layer instanceof OpenLayers.Layer.HTTPRequest, "new OpenLayers.Layer.HTTPRequest returns correctly typed object" );
  
          // correct bubbling up to Layer.initialize()
          t.eq( layer.name, name, "layer.name is correct" );
          t.ok( ((layer.options["chicken"] == 151) && (layer.options["foo"] == "bar")), "layer.options correctly set" );
  
          // HTTPRequest-specific properties
          t.eq( layer.url, url, "layer.name is correct" );
          t.ok( ((layer.params["map"] == '/mapdata/vmap_wms.map') && 
                 (layer.params["layers"] == "basic") &&
                 (layer.params["format"] == "image/png")), "layer.params correctly set" );
  
  
      }
  
      function test_02_Layer_HTTPRequest_clone (t) {
          t.plan( 6 );
          
          var toClone = new OpenLayers.Layer.HTTPRequest(name, url, params, options);
          toClone.chocolate = 5;
  
          var layer = toClone.clone();
  
          t.eq(layer.chocolate, 5, "correctly copied randomly assigned property");
  
          t.ok( layer instanceof OpenLayers.Layer.HTTPRequest, "new OpenLayers.Layer.HTTPRequest returns correctly typed object" );
  
          // correct bubbling up to Layer.initialize()
          t.eq( layer.name, name, "layer.name is correct" );
          t.ok( ((layer.options["chicken"] == 151) && (layer.options["foo"] == "bar")), "layer.options correctly set" );
  
          // HTTPRequest-specific properties
          t.eq( layer.url, url, "layer.name is correct" );
          t.ok( ((layer.params["map"] == '/mapdata/vmap_wms.map') && 
                 (layer.params["layers"] == "basic") &&
                 (layer.params["format"] == "image/png")), "layer.params correctly set" );
  
      }
  
      function test_03_Layer_HTTPRequest_setUrl (t) {
          t.plan( 1 );
  
          layer = new OpenLayers.Layer.HTTPRequest(name, url, params, options);
          
          layer.setUrl("foo");
          t.eq( layer.url, "foo", "setUrl() works");
      }
  
      function test_05_Layer_HTTPRequest_mergeNewParams (t) {
          t.plan( 3 );
  
          layer = new OpenLayers.Layer.HTTPRequest(name, url, params, options);
          
          var newParams = { layers: 'sooper', 
                            chickpeas: 'image/png'};
  
          layer.mergeNewParams(newParams);
          
          t.eq( layer.params.layers, "sooper", "mergeNewParams() overwrites well");
          t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() adds well");
  
          newParams.chickpeas = 151;
  
          t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() makes clean copy of hash");
  
  
      }
  
      function test_06_Layer_HTTPRequest_getFullRequestString (t) {
  
          tParams = { layers: 'basic', 
                     format: 'image/png'};
          
          t.plan( 8 );
  
    // without ?        
          tUrl = "http://octo.metacarta.com/cgi-bin/mapserv";
          layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
          str = layer.getFullRequestString();
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?layers=basic&format=image/png", "getFullRequestString() works for url sans ?");
  
  
    // with ?        
          tUrl = "http://octo.metacarta.com/cgi-bin/mapserv?";
          layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
          str = layer.getFullRequestString();
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?layers=basic&format=image/png", "getFullRequestString() works for url with ?");
  
    // with ?param1=5
          tUrl = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5";
          layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
          str = layer.getFullRequestString();
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&layers=basic&format=image/png", "getFullRequestString() works for url with ?param1=5");
  
   
    // with ?param1=5&
          tUrl = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&";
          layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
          str = layer.getFullRequestString();
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&layers=basic&format=image/png", "getFullRequestString() works for url with ?param1=5&");
  
    // passing in new params
          layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
          str = layer.getFullRequestString( { chicken: 6, 
                                              layers:"road" } );
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&layers=road&format=image/png&chicken=6", "getFullRequestString() works for passing in new params");
  
    // layer with null params
          layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, null, null);
          str = layer.getFullRequestString();
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&", "getFullRequestString() works for layer with null params");
  
    // layer with null params passing in new params
          layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, null, null);
          str = layer.getFullRequestString( { chicken: 6, 
                                              layers:"road" } );
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&chicken=6&layers=road", "getFullRequestString() works for layer with null params passing in new params");
  
    // with specified altUrl parameter
          tUrl = "http://octo.metacarta.com/cgi-bin/mapserv";
          layer = new OpenLayers.Layer.HTTPRequest(name, "chicken", tParams, null);
          str = layer.getFullRequestString(null, tUrl);
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?layers=basic&format=image/png", "getFullRequestString() works for url sans ?");
  
      }
  
      function test_99_Layer_HTTPRequest_destroy (t) {
          t.plan( 6 );    
  
          var map = new OpenLayers.Map('map');
  
          layer = new OpenLayers.Layer.HTTPRequest("Test Layer",
                                                   "http://www.openlayers.org", 
                                                   { foo: 2, bar: 3}, 
                                                   { opt1: 8, opt2: 9});
  
          map.addLayer(layer);
          layer.destroy();
   
          // Ensure Layer.destroy() is called
          t.eq( layer.name, null, "layer.name is null after destroy" );
          t.eq( layer.div, null, "layer.div is null after destroy" );
          t.eq( layer.map, null, "layer.map is null after destroy" );
          t.eq( layer.options, null, "layer.options is null after destroy" );
   
   
          // Specific to HTTPRequest 
          t.eq( layer.url, null, "layer.url is null after destroy" );
          t.eq( layer.params, null, "layer.params is null after destroy" );
      }
    // -->
    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_KaMap.html
  
  Index: test_Layer_KaMap.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var layer; 
  
      var name = 'Test Layer';
      var url = "http://boston.freemap.in/tile.php?";
      var params = {
                    'map':'boston-new', 
                    'g':'border,water,roads,openspace', 
                    'i':'JPEG'
                   };
      var units = "meters";
  
  
  
      function test_01_Layer_KaMap_constructor (t) {
          t.plan( 1 );
                         
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
          t.ok( layer instanceof OpenLayers.Layer.KaMap, "returns OpenLayers.Layer.KaMap object" );
      }
  
  
      function test_02_Layer_KaMap_inittiles (t) {
          t.plan( 2 );
          var map = new OpenLayers.Map($('map'));
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
          map.addLayer(layer);
          map.setCenter(new OpenLayers.LonLat(0,0),5);
          t.eq( layer.grid.length, 6, "KaMap rows is correct." );
          t.eq( layer.grid[0].length, 4, "KaMap cols is correct." );
          
      }
  
      function test_03_Layer_KaMap_clearTiles (t) {
          t.plan( 1 );
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
          map.addLayer(layer);
  
          map.setCenter(new OpenLayers.LonLat(0,0));
  
          //grab a reference to one of the tiles
          var tile = layer.grid[0][0];        
  
          layer.clearGrid();
  
          t.ok( layer.grid != null, "layer.grid does not get nullified" );
      }
  
  
      function test_04_Layer_KaMap_getKaMapBounds(t) {
          t.plan( 1 );
  
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
  
          var bl = { bounds: new OpenLayers.Bounds(1,2,0,0)};
          var tr = { bounds: new OpenLayers.Bounds(0,0,3,4)};
          layer.grid = [ [6, tr], 
                         [bl, 7]];
  
          var bounds = layer.getGridBounds();
      
          var testBounds = new OpenLayers.Bounds(1,2,3,4);
          
          t.ok( bounds.equals(testBounds), "getKaMapBounds() returns correct bounds")
      }
  
      function test_05_Layer_KaMap_getResolution(t) {
          t.plan( 1 );
  
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
          map.addLayer(layer);
  
          map.zoom = 5;
  
          t.eq( layer.getResolution(), 0.0439453125, "getResolution() returns correct value");
      }
  
      function test_06_Layer_KaMap_getZoomForExtent(t) {
          t.plan( 2 );
          var bounds, zoom;
  
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
          map.addLayer(layer);
  
          bounds = new OpenLayers.Bounds(10,10,12,12);
          zoom = layer.getZoomForExtent(bounds);
  
          t.eq( zoom, 8, "getZoomForExtent() returns correct value");
  
          bounds = new OpenLayers.Bounds(10,10,100,100);
          zoom = layer.getZoomForExtent(bounds);
  
          t.eq( zoom, 3, "getZoomForExtent() returns correct value");
      }   
  
  
      /** THIS WOULD BE WHERE THE TESTS WOULD GO FOR 
       *     
       *    -moveTo
       *    -insertColumn
       *    -insertRow
      
      function 07_Layer_KaMap_moveTo(t) {
      }
  
      function 08_Layer_KaMap_insertColumn(t) {
      }
  
      function 09_Layer_KaMap_insertRow(t) {
      }
  
       * 
       */
  
      function test_10_Layer_KaMap_clone(t) {
          t.plan(4);
          
          var options = {tileSize: new OpenLayers.Size(500,50)};
          var map = new OpenLayers.Map('map', options);
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
          map.addLayer(layer);
  
          layer.grid = [ [6, 7], 
                         [8, 9]];
  
          var clone = layer.clone();
  
          t.ok( clone.grid == null, "clone does not copy grid");
  
          t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
  
          layer.tileSize.w += 40;
  
          t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference");
  
          t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
      }
  
      function test_11_Layer_KaMap_setMap(t) {
  
          t.plan(2);
          
          var options = {tileSize: new OpenLayers.Size(500,50)};
          var map = new OpenLayers.Map('map', options);
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
  
  
          layer.setMap(map);
          
          t.ok( layer.tileSize != null, "tileSize has been set");
          t.ok( (layer.tileSize.h == 50) && (layer.tileSize.w == 500), "tileSize has been set correctly");
      }
  
      function test_99_Layer_KaMap_destroy (t) {
  
          t.plan( 3 );
  
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
          map.addLayer(layer);
          layer.destroy();
          t.eq( layer.grid, null, "layer.grid is null after destroy" );
          t.eq( layer.tileSize, null, "layer.tileSize is null after destroy" );
  
  
      //test with tile creation
          layer = new OpenLayers.Layer.KaMap(name, url, params, units);
          map.addLayer(layer);
          map.setCenter(new OpenLayers.LonLat(0,0), 5);
          //grab a reference to one of the tiles
          var tile = layer.grid[0][0];        
  
          layer.destroy();
  
          t.ok( layer.grid == null, "tiles appropriately destroyed");
      }
      
         // -->
    </script>
  </head>
  <body>
  <div id="map" style="width:500px;height:550px;display:none"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_Markers.html
  
  Index: test_Layer_Markers.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var layer; 
  
      function test_01_Layer_Markers_constructor (t) {
          t.plan( 2 );
          
          layer = new OpenLayers.Layer.Markers('Test Layer');
          t.ok( layer instanceof OpenLayers.Layer.Markers, "new OpenLayers.Layer.Markers returns object" );
          t.eq( layer.name, "Test Layer", "layer.name is correct" );
      }
      function test_02_Layer_Markers_addlayer (t) {
          t.plan( 3 );
          
          layer = new OpenLayers.Layer.Markers('Test Layer');
          t.ok( layer instanceof OpenLayers.Layer.Markers, "new OpenLayers.Layer.Markers returns object" );
          t.eq( layer.name, "Test Layer", "layer.name is correct" );
          layer.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0), 
                                                new OpenLayers.Icon())
                         );
          t.eq( layer.markers.length, 1, "addLayer adds marker to layer." );
      }
  
      function test_99_Layer_Markers_destroy (t) {
          t.plan( 1 );    
          layer = new OpenLayers.Layer.Markers('Test Layer');
          var map = new OpenLayers.Map('map');
          map.addLayer(layer);
          layer.destroy();
          t.eq( layer.map, null, "layer.map is null after destroy" );
      }
    // -->
    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_Text.html
  
  Index: test_Layer_Text.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var layer; 
  
      function test_01_Layer_Text_constructor (t) {
          t.plan( 5 );
          
          layer = new OpenLayers.Layer.Text('Test Layer', { location: 'data_Layer_Text_textfile.txt'});
          t.ok( layer instanceof OpenLayers.Layer.Text, "new OpenLayers.Layer.Text returns object" );
          t.eq( layer.location, "data_Layer_Text_textfile.txt", "layer.location is correct" );
          var markers;
          t.delay_call( 1, function() {  
              t.eq( layer.markers.length, 2, "marker length is correct" );
              var ll = new OpenLayers.LonLat(20, 10);
              t.ok( layer.markers[0].lonlat.equals(ll), "first marker is correct" );
              t.eq( layer.markers[0].icon.url, 'http://boston.openguides.org/markers/ORANGE.png', "icon" );
          } );
      }
      function test_02_Layer_Text_draw (t) { 
  //        t.plan(5);
          t.plan( 2 );
          layer = new OpenLayers.Layer.Text('Test Layer', { location: 'data_Layer_Text_textfile.txt'});
          t.ok( layer instanceof OpenLayers.Layer.Text, "new OpenLayers.Layer.Text returns object" );
          var map = new OpenLayers.Map('map');
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
          map.addLayer(layer);
          t.eq( map.layers[1].name, layer.name, "Layer added to map okay" );
          t.delay_call( 1, function() { 
            map.setCenter(new OpenLayers.LonLat(0,0),0);
  
  /*
              if (!isMozilla)
                  t.ok( true, "skipping element test outside of Mozilla");
              else
                t.ok( map.layers[0].div.firstChild instanceof HTMLImageElement, "Marker added to div" )
  
            t.eq( map.layers[0].div.firstChild.style.top, "219px", "Marker top set correctly" )
            t.eq( map.layers[0].div.firstChild.style.left, "273px", "Marker left set correctly" )
  */
          });;
      }
      function test_03_Layer_Text_events (t) {
          t.plan( 4 );    
          layer = new OpenLayers.Layer.Text('Test Layer', { location: 'data_Layer_Text_textfile.txt'});
          var map = new OpenLayers.Map('map');
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
          map.addLayer(layer);
          map.setCenter(new OpenLayers.LonLat(0,0),0);
          var event = {};
          t.delay_call( 1, function() {  
            t.ok(layer.markers[0].events, "First marker has an events object");
            t.eq(layer.markers[0].events.listeners['click'].length, 1, "Marker events has one object");
            layer.markers[0].events.triggerEvent('click', event);
            t.eq(map.popups.length, 1, "Popup opened correctly");
            layer.markers[1].events.triggerEvent('click', event);
            t.eq(map.popups.length, 1, "1st popup gone, 2nd Popup opened correctly");
          });
      }
  
      function test_99_Layer_Text_destroy (t) {
          t.plan( 1 );    
          layer = new OpenLayers.Layer.Text('Test Layer');
          var map = new OpenLayers.Map('map');
          map.addLayer(layer);
          layer.destroy();
          t.eq( layer.map, null, "layer.map is null after destroy" );
      }
    // -->
    </script>
  </head>
  <body>
    <div id="map" style="width:500px; height:500px"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Layer_WMS.html
  
  Index: test_Layer_WMS.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var layer; 
  
      var name = 'Test Layer';
      var url = "http://octo.metacarta.com/cgi-bin/mapserv";
      var params = { map: '/mapdata/vmap_wms.map', 
                     layers: 'basic', 
                     format: 'image/png'};
  
      function test_01_Layer_WMS_constructor (t) {
          t.plan( 4 );
  
          layer = new OpenLayers.Layer.WMS();
  
          var url = "http://octo.metacarta.com/cgi-bin/mapserv";
          layer = new OpenLayers.Layer.WMS(name, url, params);
          t.ok( layer instanceof OpenLayers.Layer.WMS, "new OpenLayers.Layer.WMS returns object" );
          t.eq( layer.url, "http://octo.metacarta.com/cgi-bin/mapserv", "layer.url is correct (HTTPRequest inited)" );
          t.eq( layer.params.MAP, "/mapdata/vmap_wms.map", "params passed in correctly uppercased" );
  
          t.eq( layer.params.SERVICE, "WMS", "default params correclty uppercased and copied");
  
  
      }
      
      function test_02_Layer_WMS_addtile (t) {
          t.plan( 6 );
      
          var url = "http://octo.metacarta.com/cgi-bin/mapserv";
          layer = new OpenLayers.Layer.WMS(name, url, params);
          var map = new OpenLayers.Map($('map'));
          map.addLayer(layer);
          var pixel = new OpenLayers.Pixel(5,6);
          var tile = layer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
          tile.draw();
  
          var img = tile.imgDiv;
  
          t.eq( img.src, "http://octo.metacarta.com/cgi-bin/mapserv?MAP=/mapdata/vmap_wms.map&LAYERS=basic&FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application/vnd.ogc.se_inimage&SRS=EPSG:4326&BBOX=1,2,3,4&WIDTH=256&HEIGHT=256", "image src is created correctly via addtile" );
          t.eq( tile.imgDiv.style.top, "6px", "image top is set correctly via addtile" );
          t.eq( tile.imgDiv.style.left, "5px", "image top is set correctly via addtile" );
  
          var firstChild = layer.div.firstChild;
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( firstChild instanceof HTMLElement, "div first child is an image object" );
          t.eq( firstChild.src, "http://octo.metacarta.com/cgi-bin/mapserv?MAP=/mapdata/vmap_wms.map&LAYERS=basic&FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application/vnd.ogc.se_inimage&SRS=EPSG:4326&BBOX=1,2,3,4&WIDTH=256&HEIGHT=256", "div first child is correct image object" );
          t.eq( tile.position.toString(), "x=5,y=6", "Position of tile is set correctly." );
      }
      
      function test_03_Layer_WMS_inittiles (t) {
          t.plan( 2 );
          var map = new OpenLayers.Map($('map'));
          layer = new OpenLayers.Layer.WMS(name, url, params);
          map.addLayer(layer);
          map.setCenter(new OpenLayers.LonLat(0,0),5);
          t.eq( layer.grid.length, 7, "Grid rows is correct." );
          t.eq( layer.grid[0].length, 6, "Grid cols is correct." );
          
      }
  
  
      function test_04_Layer_WMS_clone (t) {
          t.plan(4);
          
          var url = "http://octo.metacarta.com/cgi-bin/mapserv";
          var options = {tileSize: new OpenLayers.Size(500,50)};
          var map = new OpenLayers.Map('map', options);
          layer = new OpenLayers.Layer.WMS(name, url, params);
          map.addLayer(layer);
  
          layer.grid = [ [6, 7], 
                         [8, 9]];
  
          var clone = layer.clone();
  
          t.ok( clone.grid == null, "clone does not copy grid");
  
          t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
  
          layer.tileSize.w += 40;
  
          t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference");
  
          t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
      }
  
      function test_05_Layer_WMS_isBaseLayer(t) {
  
          t.plan(2);
          
          var url = "http://octo.metacarta.com/cgi-bin/mapserv";
          layer = new OpenLayers.Layer.WMS(name, url, params);
  
          t.ok( layer.isBaseLayer, "baselayer is true by default");
  
          var newParams = Object.extend(new Object(), params);
          newParams.transparent = "true";
          layer = new OpenLayers.Layer.WMS(name, url, newParams);
          
  
          t.ok( !layer.isBaseLayer, "baselayer is false when transparent is set to true");
  
  
  
      }
  
      function test_06_Layer_WMS_mergeNewParams (t) {
          t.plan( 3 );
  
          var url = "http://octo.metacarta.com/cgi-bin/mapserv";
          layer = new OpenLayers.Layer.WMS(name, url, params);
          
          var newParams = { layers: 'sooper', 
                            chickpeas: 'image/png'};
  
          layer.mergeNewParams(newParams);
          
          t.eq( layer.params.LAYERS, "sooper", "mergeNewParams() overwrites well");
          t.eq( layer.params.CHICKPEAS, "image/png", "mergeNewParams() adds well");
  
          newParams.CHICKPEAS = 151;
  
          t.eq( layer.params.CHICKPEAS, "image/png", "mergeNewParams() makes clean copy of hashtable");
      }
  
      function test_07_Layer_WMS_getFullRequestString (t) {
  
          
          t.plan( 2 );
  
          var map = new OpenLayers.Map('map');
          map.projection = "xx";
          tUrl = "http://octo.metacarta.com/cgi-bin/mapserv";
          tParams = { layers: 'basic', 
                     format: 'image/png'};
          var tLayer = new OpenLayers.Layer.WMS(name, tUrl, tParams);
          map.addLayer(tLayer);
          str = tLayer.getFullRequestString();
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?LAYERS=basic&FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application/vnd.ogc.se_inimage&SRS=xx", "getFullRequestString() adds SRS value");
   
          tLayer.projection = "none";
          str = tLayer.getFullRequestString();
          t.eq(str, "http://octo.metacarta.com/cgi-bin/mapserv?LAYERS=basic&FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application/vnd.ogc.se_inimage", "getFullRequestString() by default does *not* add SRS value if projection is 'none'");
   
      }
      
      function test_99_Layer_WMS_destroy (t) {
  
          t.plan( 1 );
  
          var map = new OpenLayers.Map('map');
          layer = new OpenLayers.Layer.WMS(name, url, params);
          map.addLayer(layer);
  
          map.setCenter(new OpenLayers.LonLat(0,0), 5);
  
          //grab a reference to one of the tiles
          var tile = layer.grid[0][0];        
  
          layer.destroy();
          
      // checks to make sure superclass (grid) destroy() was called    
          
          t.ok( layer.grid == null, "grid set to null");
      }
    // -->
    </script>
  </head>
  <body>
  <div id="map" style="width:500px;height:550px;display:none"></div>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_LonLat.html
  
  Index: test_LonLat.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
  
      var lonlat; 
  
      function test_01_LonLat_constructor (t) {
          t.plan( 4 );
          lonlat = new OpenLayers.LonLat(6, 5);
          t.ok( lonlat instanceof OpenLayers.LonLat, "new OpenLayers.LonLat returns LonLat object" );
          t.eq( lonlat.CLASS_NAME, "OpenLayers.LonLat", "lonlat.CLASS_NAME is set correctly");
          t.eq( lonlat.lon, 6, "lonlat.lon is set correctly");
          t.eq( lonlat.lat, 5, "lonlat.lat is set correctly");
      }
  
      function test_02_LonLat_toString(t) {
          t.plan( 1 );
          lonlat = new OpenLayers.LonLat(5,6);
          t.eq( lonlat.toString(), "lon=5,lat=6", "lonlat.toString() returns correctly");
      }
  
      function test_02A_LonLat_toShortString(t) {
          t.plan( 1 );
          lonlat = new OpenLayers.LonLat(5,6);
          t.eq( lonlat.toShortString(), "5, 6", "lonlat.toShortString() returns correctly");
      }
  
      function test_03_LonLat_clone(t) {
          t.plan( 3 );
          oldLonLat = new OpenLayers.LonLat(5,6);
          lonlat = oldLonLat.clone();
          t.ok( lonlat instanceof OpenLayers.LonLat, "clone returns new OpenLayers.LonLat object" );
          t.ok( lonlat.equals(oldLonLat), "lonlat is set correctly");
          
          oldLonLat.lon = 100;
          t.eq( lonlat.lon, 5, "changing oldLonLat.lon doesn't change lonlat.lon");
      }
  
      function test_04_LonLat_add(t) {
          t.plan( 2 );
  
          lonlatA = new OpenLayers.LonLat(10,100);
  
          addpx = lonlatA.add(5, 50);
          var ll = new OpenLayers.LonLat(10,100);
          t.ok( lonlatA.equals(ll), "lonlatA is not modified by add operation");
  
          var ll = new OpenLayers.LonLat(15,150);
          t.ok( addpx.equals(ll), "addpx is set correctly");
      }
      
      function test_06_LonLat_equals(t) {
          t.plan( 5 );
          lonlat = new OpenLayers.LonLat(5,6);
  
          ll = new OpenLayers.LonLat(5,6);
          t.eq( lonlat.equals(ll), true, "(5,6) equals (5,6)");
  
          ll = new OpenLayers.LonLat(1,6);
          t.eq( lonlat.equals(ll), false, "(5,6) does not equal (1,6)");
  
          ll = new OpenLayers.LonLat(5,2);
          t.eq( lonlat.equals(ll), false, "(5,6) does not equal (5,2)");
  
          ll = new OpenLayers.LonLat(1,2);
          t.eq( lonlat.equals(ll), false, "(5,6) does not equal (1,2)");
  
          t.ok( !lonlat.equals(null), "equals() returns false on comparison to null");
  
      }
  
      function test_07_LonLat_fromString(t) {
          t.plan( 2 );
          lonlat = OpenLayers.LonLat.fromString("6,5");
          t.ok( lonlat instanceof OpenLayers.LonLat, "new OpenLayers.LonLat returns LonLat object" );
  
          var ll = new OpenLayers.LonLat(6, 5);
          t.ok( lonlat.equals(ll), "lonlat is set correctly");
      }
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Map.html
  
  Index: test_Map.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var map; 
      function test_01_Map_constructor (t) {
          t.plan( 9 );
          
          map = new OpenLayers.Map('map'); // no longer need to call $(), constructor does it
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
  
          t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map returns object" );
          if (!isMozilla) {
              t.ok( true, "skipping element test outside of Mozilla");
              t.ok( true, "skipping element test outside of Mozilla");
              t.ok( true, "skipping element test outside of Mozilla");
          } else {
              t.ok( map.div instanceof HTMLDivElement, "map.div is an HTMLDivElement" );
              t.ok( map.viewPortDiv instanceof HTMLDivElement, "map.viewPortDiv is an HTMLDivElement" );
              t.ok( map.layerContainerDiv instanceof HTMLDivElement, "map.layerContainerDiv is an HTMLDivElement" );
          }
          t.ok( map.layers instanceof Array, "map.layers is an Array" );
          t.ok( map.controls instanceof Array, "map.controls is an Array" );
          t.ok( map.events instanceof OpenLayers.Events, "map.events is an OpenLayers.Events" );
          t.ok( map.getMaxExtent() instanceof OpenLayers.Bounds, "map.maxExtent is an OpenLayers.Bounds" );
          t.ok( map.getNumZoomLevels() > 0, "map has a default numZoomLevels" );
      }
      function test_02_Map_center(t) {
          t.plan(3);
          map = new OpenLayers.Map($('map'));
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
          var ll = new OpenLayers.LonLat(2,1);
          map.setCenter(ll, 0);
          t.ok( map.getCenter() instanceof OpenLayers.LonLat, "map.getCenter returns a LonLat");
          t.eq( map.getZoom(), 0, "map.zoom is correct after calling setCenter");
          t.ok( map.getCenter().equals(ll), "map center is correct after calling setCenter");
      }
      function test_03_Map_add_layers(t) {
          t.plan(6);
          map = new OpenLayers.Map($('map'));
          var layer1 = new OpenLayers.Layer.WMS("Layer 1", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          var layer2 = new OpenLayers.Layer.WMS("Layer 2",
              "http://wms.jpl.nasa.gov/wms.cgi", {layers: "modis,global_mosaic"});
          // this uses map.addLayer internally
          map.addLayers([layer1, layer2])
          t.eq( map.layers.length, 2, "map has exactly two layers" );
          t.ok( map.layers[0] === layer1, "1st layer is layer1" );
          t.ok( map.layers[1] === layer2, "2nd layer is layer2" );
          t.ok( layer1.map === map, "layer.map is map" ); 
          t.eq( parseInt(layer1.div.style.zIndex), map.Z_INDEX_BASE['BaseLayer'], 
                  "layer1 zIndex is set" );
          t.eq( parseInt(layer2.div.style.zIndex), map.Z_INDEX_BASE['BaseLayer'] + 5, 
                  "layer2 zIndex is set" );
      }
      function test_04_Map_options(t) {
          t.plan(2);
          map = new OpenLayers.Map($('map'), {numZoomLevels: 6, maxResolution: 3.14159});
          t.eq( map.numZoomLevels, 6, "map.numZoomLevels set correctly via options hashtable" );
          t.eq( map.maxResolution, 3.14159, "map.maxResolution set correctly via options hashtable" );
      }
      function test_05_Map_center(t) {
          t.plan(4);
          map = new OpenLayers.Map($('map'));
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"} );
          map.addLayer(baseLayer);
          var ll = new OpenLayers.LonLat(2,1);
          map.setCenter(ll, 0);
          map.zoomIn();
          t.eq( map.getZoom(), 1, "map.zoom is correct after calling setCenter,zoom in");
          t.ok( map.getCenter().equals(ll), "map center is correct after calling setCenter, zoom in");
          map.zoomOut();
          t.eq( map.getZoom(), 0, "map.zoom is correct after calling setCenter,zoom in, zoom out");
  
      map.zoomTo(5);
      t.eq( map.getZoom(), 5, "map.zoom is correct after calling zoomTo" );
  /**
      map.zoomToMaxExtent();
      t.eq( map.getZoom(), 2, "map.zoom is correct after calling zoomToMaxExtent" );
      var lonlat = map.getCenter();
      var zero = new OpenLayers.LonLat(0, 0);
      t.ok( lonlat.equals(zero), "map center is correct after calling zoomToFullExtent" );
  
      */
      }
  
      function test_06_Map_zoomend_event (t) {
          t.plan(2);
          map = new OpenLayers.Map('map');
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
          map.events.register("zoomend", {count: 0}, function() { 
              this.count++; 
              t.ok(true, "zoomend event was triggered " + this.count + " times");
              });
          map.setCenter(new OpenLayers.LonLat(2, 1), 0);
          map.zoomIn();
          map.zoomOut();
      }
      
      function test_07_Map_add_remove_popup (t) {
          t.plan(4);
  
          map = new OpenLayers.Map('map');
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
          
          var popup = new OpenLayers.Popup("chicken", 
                                           new OpenLayers.LonLat(0,0),
                                           new OpenLayers.Size(200,200));
          map.setCenter(new OpenLayers.LonLat(0, 0), 0);
  
          map.addPopup(popup);
          t.eq(map.popups.indexOf(popup), 0, "popup successfully added to Map's internal popups array");
  
          var nodes = map.layerContainerDiv.childNodes;
          
          var found = false;
          for (var i=0; i < nodes.length; i++) {
              if (nodes.item(i) == popup.div) {
                  found = true;
                  break;
              }
          }
          t.ok(found, "popup.div successfully added to the map's viewPort");
  
          
          map.removePopup(popup);
          t.eq(map.popups.indexOf(popup), -1, "popup successfully removed from Map's internal popups array");
  
          var found = false;
          for (var i=0; i < nodes.length; i++) {
              if (nodes.item(i) == popup.div) {
                  found = true;
                  break;
              }
          }
          t.ok(!found, "popup.div successfully removed from the map's viewPort");
      }
  /***  THIS IS A GOOD TEST, BUT IT SHOULD BE MOVED TO WMS. 
   *     Also, it won't work until we figure out the viewSize bug
  
      function 08_Map_px_lonlat_translation (t) {
          t.plan( 6 );    
          map = new OpenLayers.Map($('map'));
          var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
              "http://octo.metacarta.com/cgi-bin/mapserv?",
              {map: "/mapdata/vmap_wms.map", layers: "basic"});
          map.addLayer(baseLayer);
          map.setCenter(new OpenLayers.LonLat(0, 0), 0);
   
          var pixel = new OpenLayers.Pixel(50,150);
          var lonlat = map.getLonLatFromViewPortPx(pixel);
          t.ok( lonlat instanceof OpenLayers.LonLat, "getLonLatFromViewPortPx returns valid OpenLayers.LonLat" );
  
          var newPixel = map.getViewPortPxFromLonLat(lonlat);
          t.ok( newPixel instanceof OpenLayers.Pixel, "getViewPortPxFromLonLat returns valid OpenLayers.Pixel" );
  
          // WARNING!!!  I'm faily sure that the following test's validity 
          //             depends highly on rounding and the resolution. For now,
          //             in the default case, it seems to work. This may not 
          //             always be so.
          t.ok( newPixel.equals(pixel), "Translation to pixel and back to lonlat is consistent");
  
          lonlat = map.getLonLatFromPixel(pixel);
          t.ok( lonlat instanceof OpenLayers.LonLat, "getLonLatFromPixel returns valid OpenLayers.LonLat" );
  
          newPixel = map.getPixelFromLonLat(lonlat);
          t.ok( newPixel instanceof OpenLayers.Pixel, "getPixelFromLonLat returns valid OpenLayers.Pixel" );
  
          t.ok( newPixel.equals(pixel), "2nd translation to pixel and back to lonlat is consistent");
      }
   */
      function test_09_Map_isValidLonLat(t) {
          t.plan( 3 );    
          map = new OpenLayers.Map($('map'));
          layer = new OpenLayers.Layer.WMS('Test Layer', 
                      "http://octo.metacarta.com/cgi-bin/mapserv", 
                      {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
                      {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
          map.addLayer(layer);
          
          t.ok( !map.isValidLonLat(null), "null lonlat is not valid" );
          t.ok( map.isValidLonLat(new OpenLayers.LonLat(33862, 717606)), "lonlat outside max extent is valid" );
          t.ok( !map.isValidLonLat(new OpenLayers.LonLat(10, 10)), "lonlat outside max extent is not valid" );
      }
  
      function test_10_Map_getLayer(t) {
          t.plan( 2 );    
          map = new OpenLayers.Map($('map'));
          layer = new OpenLayers.Layer.WMS('Test Layer', 
                      "http://octo.metacarta.com/cgi-bin/mapserv", 
                      {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
                      {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
  
          map.addLayer(layer);
          var gotLayer = map.getLayer(layer.id);
  
          t.ok( layer == gotLayer, "getLayer correctly returns layer" );
  
          gotLayer = map.getLayer("chicken");
  
          t.ok( gotLayer == null, "getLayer correctly returns null when layer not found");
      }
  
      function test_10_Map_setBaseLayer(t) {
          t.plan( 4 );
          
          map = new OpenLayers.Map($('map'));
  
          var wmslayer = new OpenLayers.Layer.WMS('Test Layer', 
                      "http://octo.metacarta.com/cgi-bin/mapserv", 
                      {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
                      {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
  
          var wmslayer2 = new OpenLayers.Layer.WMS('Test Layer2', 
                      "http://octo.metacarta.com/cgi-bin/mapserv", 
                      {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
                      {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
  
          map.addLayers([wmslayer, wmslayer2]);
  
          t.ok(map.baseLayer == wmslayer, "default base layer is first one added");
          
          map.setBaseLayer(null);
          t.ok(map.baseLayer == wmslayer, "setBaseLayer on null object does nothing (and does not break)");
          
          map.setBaseLayer("chicken");
          t.ok(map.baseLayer == wmslayer, "setBaseLayer on non-layer object does nothing (and does not break)");
          
          map.setBaseLayer(wmslayer2);
          t.ok(map.baseLayer == wmslayer2, "setbaselayer correctly sets 'baseLayer' property");
  
      }
      
      
      function test_99_Map_destroy (t) {
          t.plan( 2 );    
          map = new OpenLayers.Map($('map'));
          map.destroy();
          t.eq( map.layers, null, "map.layers is null after destroy" );
          t.eq( map.controls, null, "map.controls is null after destroy" );
      }
    // -->
    </script>
  </head>
  <body>
      <div id="map" style="width: 1080px; height: 600px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Marker.html
  
  Index: test_Marker.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var marker; 
      
      function test_01_Marker_constructor (t) {
          t.plan( 4 );
          var ll = new OpenLayers.LonLat(2,1);
          marker = new OpenLayers.Marker(ll,new OpenLayers.Icon());
          t.ok( marker instanceof OpenLayers.Marker, "new OpenLayers.Marker returns Marker object" );
          t.ok( marker.icon instanceof OpenLayers.Icon, "new marker.Icon returns Icon object" );
          t.ok( marker.lonlat instanceof OpenLayers.LonLat, "new marker.lonlat returns LonLat object" );
          t.ok( marker.lonlat.equals(ll), "marker.lonlat returns correct" );
      }
  
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Pixel.html
  
  Index: test_Pixel.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var pixel; 
      
      function test_01_Pixel_constructor (t) {
          t.plan( 4 );
          pixel = new OpenLayers.Pixel(5,6);
          t.ok( pixel instanceof OpenLayers.Pixel, "new OpenLayers.Pixel returns Pixel object" );
          t.eq( pixel.CLASS_NAME, "OpenLayers.Pixel", "pixel.CLASS_NAME is set correctly");
          t.eq( pixel.x, 5, "pixel.x is set correctly");
          t.eq( pixel.y, 6, "pixel.y is set correctly");
      }
  
      function test_02_Pixel_toString(t) {
          t.plan( 1 );
          pixel = new OpenLayers.Pixel(5,6);
          t.eq( pixel.toString(), "x=5,y=6", "pixel.toString() returns correctly");
      }
  
      function test_03_Pixel_clone(t) {
          t.plan( 4 );
          oldPixel = new OpenLayers.Pixel(5,6);
          pixel = oldPixel.clone();
          t.ok( pixel instanceof OpenLayers.Pixel, "clone returns new OpenLayers.Pixel object" );
          t.eq( pixel.x, 5, "pixel.x is set correctly");
          t.eq( pixel.y, 6, "pixel.y is set correctly");
          
          oldPixel.x = 100;
          t.eq( pixel.x, 5, "changing oldPixel.x doesn't change pixel.x");
      }
  
      function test_06_Pixel_equals(t) {
          t.plan( 5 );
          pixel = new OpenLayers.Pixel(5,6);
  
          px = new OpenLayers.Pixel(5,6);
          t.eq( pixel.equals(px), true, "(5,6) equals (5,6)");
  
          px = new OpenLayers.Pixel(1,6);
          t.eq( pixel.equals(px), false, "(5,6) does not equal (1,6)");
  
          px = new OpenLayers.Pixel(5,2);
          t.eq( pixel.equals(px), false, "(5,6) does not equal (5,2)");
  
          px = new OpenLayers.Pixel(1,2);
          t.eq( pixel.equals(px), false, "(5,6) does not equal (1,2)");
  
          t.ok( !pixel.equals(null), "equals() returns false on comparison to null");
  
      }
  
      function test_07_Pixel_add(t) {
          t.plan( 4 );
          oldPixel = new OpenLayers.Pixel(5,6);
  
          pixel = oldPixel.add(10,20);
  
          t.eq( oldPixel.x, 5, "oldPixel.x not modified by add operation");
          t.eq( oldPixel.y, 6, "oldPixel.y not modified by add operation");
  
          t.eq( pixel.x, 15, "pixel.x is set correctly");
          t.eq( pixel.y, 26, "pixel.y is set correctly");
      }
  
      function test_08_Pixel_offset(t) {
          t.plan( 4 );
  
          var oldPixel = new OpenLayers.Pixel(5,6);
          var offset = new OpenLayers.Pixel(10,20);
  
          pixel = oldPixel.offset(offset);
  
          t.eq( oldPixel.x, 5, "oldPixel.x not modified by offset operation");
          t.eq( oldPixel.y, 6, "oldPixel.y not modified by offset operation");
  
          t.eq( pixel.x, 15, "pixel.x is set correctly");
          t.eq( pixel.y, 26, "pixel.y is set correctly");
      }
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Popup.html
  
  Index: test_Popup.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var popup; 
      
      function test_01_Popup_default_constructor(t) {
          t.plan( 8 );
  
          var size = new OpenLayers.Size(OpenLayers.Popup.WIDTH,
                                         OpenLayers.Popup.HEIGHT);
          popup = new OpenLayers.Popup();
  
          t.ok( popup instanceof OpenLayers.Popup, "new OpenLayers.Popup returns Popup object" );
          t.ok(popup.id.startsWith("Popup"), "good default popup.id");
          t.ok(popup.size.equals(size), "good default popup.size");
          t.eq(popup.contentHTML, "", "good default popup.contentHTML");
          t.eq(popup.backgroundColor, OpenLayers.Popup.COLOR, "good default popup.backgroundColor");
          t.eq(popup.opacity, OpenLayers.Popup.OPACITY, "good default popup.opacity");
          t.eq(popup.border, OpenLayers.Popup.BORDER, "good default popup.border");
  
          
          var oldIndex = parseInt(popup.id.slice("Popup".length));
  
          popup = new OpenLayers.Popup();
          var newIndex = parseInt(popup.id.slice("Popup".length));
          
          t.eq(newIndex, oldIndex + 1, "default id generator incrementing correctly");
      }
      
      function test_02_Popup_constructor (t) {
          t.plan( 5 );
  
          var id = "chicken";
          var w = 500;
          var h = 400;
          var sz = new OpenLayers.Size(w,h);
          var lon = 5;
          var lat = 40;
          var ll = new OpenLayers.LonLat(lon, lat);
          var content = "foo";
  
          popup = new OpenLayers.Popup(id,
                                       ll,
                                       sz,
                                       content);
  
          t.ok( popup instanceof OpenLayers.Popup, "new OpenLayers.Popup returns Popup object" );
          t.eq(popup.id, id, "popup.id set correctly");
          t.ok(popup.lonlat.equals(ll), "popup.lonlat set correctly");
          t.ok(popup.size.equals(sz), "popup.size set correctly");
          t.eq(popup.contentHTML, content, "contentHTML porpoerty of set correctly");
      }
  
      function test_03_Popup_draw(t) {
      
          t.plan( 11 );
          
          var id = "chicken";
          var x = 50;
          var y = 100;
          var w = 500;
          var h = 400;
          var content = "charlie";
          var color = "red";
          var opacity = 0.5;
          var border = "1px solid";
  
  
          popup = new OpenLayers.Popup(id);
          popup.setSize(new OpenLayers.Size(w, h));
          popup.setContentHTML(content);
          popup.setBackgroundColor(color);
          popup.setOpacity(opacity);
          popup.setBorder(border);
          popup.draw(new OpenLayers.Pixel(x, y));
                                       
          t.eq(popup.div.id, id + "_div", "popup.div.id set correctly");
          t.eq(popup.div.style.left, x + "px", "left position of popup.div set correctly");
          t.eq(popup.div.style.top, y + "px", "top position of popup.div set correctly");
          t.eq(popup.div.style.width, w + "px", "width position of popup.div set correctly");
          t.eq(popup.div.style.height, h + "px", "heightposition of popup.div set correctly");
          t.eq(popup.div.innerHTML, content, "good default popup.contentHTML");
          t.eq(popup.div.style.backgroundColor, color, "good default popup.backgroundColor");
  
          if (navigator.appName.indexOf("Microsoft") == -1) {
              t.eq(parseFloat(popup.div.style.opacity), opacity, "good default popup.opacity");
          } else {
              t.eq(popup.div.style.filter, "alpha(opacity=" + opacity*100 + ")", "good default popup.opacity");
          }
          t.ok(popup.div.style.border.indexOf(border) != -1, "good default popup.border");
  
          x += 50;
          popup.moveTo(new OpenLayers.Pixel(x, y));
          t.eq(popup.div.style.left, x + "px", "moveTo updates left position of popup.div correctly");
          t.eq(popup.div.style.top, y + "px", "moveTo updates top position of popup.div correctly");
          
  
      }
  
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Size.html
  
  Index: test_Size.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var Size; 
      
      function test_01_Size_constructor (t) {
          t.plan( 4 );
          size = new OpenLayers.Size(5,6);
          t.ok( size instanceof OpenLayers.Size, "new OpenLayers.Size returns size object" );
          t.eq( size.CLASS_NAME, "OpenLayers.Size", "size.CLASS_NAME is set correctly");
          t.eq( size.w, 5, "size.w is set correctly");
          t.eq( size.h, 6, "size.h is set correctly");
      }
  
      function test_02_Size_toString(t) {
          t.plan( 1 );
          size = new OpenLayers.Size(5,6);
          t.eq( size.toString(), "w=5,h=6", "size.toString() returns correctly");
      }
  
      function test_03_Size_clone(t) {
          t.plan( 3 );
  
          oldSize = new OpenLayers.Size(5,6);
          size = oldSize.clone();
          t.ok( size instanceof OpenLayers.Size, "clone returns new OpenLayers.Size object" );
          t.ok( size.equals(oldSize), "new size is equal to old size correctly");
          
          oldSize.w = 100;
          t.eq( size.w, 5, "changing oldSize.w doesn't change size.w");
      }
  
       function test_04_Size_equals(t) {
          t.plan( 5 );
          size = new OpenLayers.Size(5,6);
  
          sz = new OpenLayers.Size(5,6);
          t.eq( size.equals(sz), true, "(5,6) equals (5,6)");
  
          sz = new OpenLayers.Size(1,6);
          t.eq( size.equals(sz), false, "(5,6) does not equal (1,6)");
  
          sz = new OpenLayers.Size(5,2);
          t.eq( size.equals(sz), false, "(5,6) does not equal (5,2)");
  
          sz = new OpenLayers.Size(1,2);
          t.eq( size.equals(sz), false, "(5,6) does not equal (1,2)");
  
          t.ok( !size.equals(null), "equals() returns false on comparison to null");
      }
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Tile.html
  
  Index: test_Tile.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var tile; 
      
      function test_01_Tile_constructor (t) {
          t.plan( 8 );
          
          var layer = new Object(); // bogus layer
          var position = new OpenLayers.Pixel(10,20);
          var bounds = new OpenLayers.Bounds(1,2,3,4);
          var url = "bobob";
          var size = new OpenLayers.Size(5,6);
          
          tile = new OpenLayers.Tile(layer, position, bounds, url, size);
  
          t.ok( tile instanceof OpenLayers.Tile, "new OpenLayers.Tile returns Tile object" );
          t.eq( tile.layer, layer, "tile.layer set correctly");
          t.ok( tile.position.equals(position), "tile.position set correctly");
          t.ok( tile.bounds.equals(bounds), "tile.bounds set correctly");
          t.eq( tile.url, url, "tile.url set correctly");        
          t.ok( tile.size.equals(size), "tile.size is set correctly" );
  
          t.ok( tile.id != null, "tile is given an id");
          t.ok( tile.id.startsWith("Tile_"), "tile's id starts correctly");
      }
  
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Tile_Image.html
  
  Index: test_Tile_Image.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var tile; 
      
      function test_01_Tile_Image_constructor (t) {
          t.plan( 6 );
          
          var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
              "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}); 
  
          var position = new OpenLayers.Pixel(20,30);
          var bounds = new OpenLayers.Bounds(1,2,3,4);
          var url = "http://www.openlayers.org/dev/tests/tileimage";
          var size = new OpenLayers.Size(5,6);
          tile = new OpenLayers.Tile.Image(layer, position, bounds, url, size);
          
          t.ok( tile instanceof OpenLayers.Tile.Image, "new OpenLayers.Tile returns Tile object" );
          t.ok( tile.layer == layer, "tile.layer is set correctly");
          t.ok( tile.position.equals(position), "tile.position is set correctly");
          t.ok( tile.bounds.equals(bounds), "tile.bounds is set correctly");
          t.eq( tile.url, url, "tile.url is set correctly");
          t.ok( tile.size.equals(size), "tile.size is set correctly");
      }
      function test_02_Tile_Image_draw (t) {
          t.plan( 5 );
  
          var layer = new Object(); //bogus layer
          layer.div = document.createElement("div");
          var position = new OpenLayers.Pixel(20,30);
          var bounds = new OpenLayers.Bounds(1,2,3,4);
          var url = "http://www.openlayers.org/dev/tests/tileimage";
          var size = new OpenLayers.Size(5,6);
          tile = new OpenLayers.Tile.Image(layer, position, bounds, url, size);
          
          tile.draw();
          
          var img = tile.imgDiv;
          
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( tile.imgDiv instanceof HTMLElement, "tile.draw creates an image");
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( img instanceof HTMLImageElement, "tile.draw creates an image");
          t.eq( img.src, "http://www.openlayers.org/dev/tests/tileimage", "tile.draw creates an image");
          t.eq( tile.imgDiv.style.width, "5px", "Image width is correct" );
          t.eq( tile.imgDiv.style.height, "6px", "Image height is correct" );
      }
  
    // -->
    </script>
  </head>
  <body>
  </body>
  </html>
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/test_Util.html
  
  Index: test_Util.html
  ===================================================================
  <html>
  <head>
    <script src="../lib/OpenLayers.js"></script>
    <script type="text/javascript"><!--
      var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
      var map; 
      function test_01_Util_getImagesLocation (t) {
          t.plan( 1 );
          t.ok( OpenLayers.Util.getImagesLocation(), "../img/",
                      "getImagesLocation()" );
      }
  
      function test_02_Util_Strings(t) {
          t.plan(5);
          
          var str = "  chicken pox  ";
  
          t.ok(str.contains("chicken"), "contains() function correctly finds an embedded string");
          t.ok(!str.contains("marsupial"), "contains() function correctly does not finds an random string");
          
  
          var trimmedStr = str.trim();        
  
          t.eq(trimmedStr, "chicken pox", "String.trim works correctly");
  
          t.eq(trimmedStr.startsWith("chicken"), true, "String.startsWith correctly finds chicken");
          t.eq(trimmedStr.startsWith("dolphin"), false, "String.startsWith correctly does not find turkey");
  
  
      }
  
      function test_03_Util_Array(t) {
          t.plan( 5 );
  
          var array = new Array(1,2,3,4,5);
  
          array.remove(3);
          t.eq( array.toString(), "1,2,4,5", "array.remove works");    
  
          copy = array.clone();
          t.eq( copy.toString(), "1,2,4,5", "array.clone() works");    
          array.push(7);
          t.eq( copy.toString(), "1,2,4,5", "changing a value in the copied array doesnt affect the new array");    
  
          
          t.eq( copy.indexOf(5), 3, "indexOf function returns index of value in an array");    
          t.eq( copy.indexOf(75), -1, "indexOf function returns -1 when element not found in array");    
          
      }
  
      function test_04_Util_createDiv(t) {
          t.plan( 20 );
  
          var id = "boo";
          var px = new OpenLayers.Pixel(5,5);
          var sz = new OpenLayers.Size(10,10);
          var img = "http://www.openlayers.org/images/OpenLayers.trac.png";
          var position = "absolute";
          var border = "13px solid";
          var overflow = "hidden";
  
          var div = OpenLayers.Util.createDiv(id, px, sz, img, position, border, overflow);
  
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( div instanceof HTMLDivElement, "createDiv creates a valid HTMLDivElement" );
          t.eq( div.id, id, "div.id set correctly");    
          t.eq( div.style.left, px.x + "px", "div.style.left set correctly");    
          t.eq( div.style.top, px.y + "px", "div.style.top set correctly");    
  
          t.eq( div.style.width, sz.w + "px", "div.style.width set correctly");    
          t.eq( div.style.height, sz.h + "px", "div.style.height set correctly");    
  
          t.eq( div.style.backgroundImage, "url(" + img + ")", "div.style.backgroundImage correctly");    
  
          t.eq( div.style.position, position, "div.style.positionset correctly");    
          t.ok( (div.style.border.indexOf(border) != -1), "div.style.border set correctly");    
          t.eq( div.style.overflow, overflow, "div.style.overflow set correctly");    
  
          //test defaults
          var div = OpenLayers.Util.createDiv();
  
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( div instanceof HTMLDivElement, "createDiv creates a valid HTMLDivElement" );
          t.ok( (div.id != ""), "div.id set correctly");    
          t.eq(div.style.left, "", "div.style.left set correctly");    
          t.eq(div.style.top, "", "div.style.top set correctly");    
  
          t.eq( div.style.width, "", "div.style.width set correctly");    
          t.eq( div.style.height, "", "div.style.height set correctly");    
  
          t.eq(div.style.backgroundImage, "", "div.style.backgroundImage correctly");    
  
          t.eq( div.style.position, "absolute", "div.style.positionset correctly");    
          t.eq( div.style.border, "", "div.style.border set correctly");    
          t.eq(div.style.overflow, "", "div.style.overflow set correctly");    
  
      }
  
      function test_05_Util_createImage(t) {
          t.plan( 18 );
  
          var img = "http://www.openlayers.org/images/OpenLayers.trac.png";
          var sz = new OpenLayers.Size(10,10);
          var xy = new OpenLayers.Pixel(5,5);
          var position = "absolute";
          var id = "boo";
          var border = "1px solid";
  
          var image = OpenLayers.Util.createImage(id, xy, sz, img, position, border);
  
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( image instanceof HTMLImageElement, "createImage creates a valid HTMLImageElement" );
          t.eq( image.id, id, "image.id set correctly");    
          t.eq( image.style.left, xy.x + "px", "image.style.left set correctly");    
          t.eq( image.style.top, xy.y + "px", "image.style.top set correctly");    
  
          t.eq( image.style.width, sz.w + "px", "image.style.width set correctly");    
          t.eq( image.style.height, sz.h + "px", "image.style.height set correctly");    
  
          t.ok( (image.style.border.indexOf(border) != -1), "image.style.border set correctly");    
          t.eq( image.src, img, "image.style.backgroundImage correctly");    
          t.eq( image.style.position, position, "image.style.positionset correctly");    
  
          //test defaults
          var image = OpenLayers.Util.createImage();
  
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( image instanceof HTMLImageElement, "createDiv creates a valid HTMLDivElement" );
          t.ok( (image.id != ""), "image.id set to something");    
          t.eq( image.style.left, "", "image.style.left set correctly");    
          t.eq( image.style.top, "", "image.style.top set correctly");    
  
          t.eq( image.style.width, "", "image.style.width set correctly");    
          t.eq( image.style.height, "", "image.style.height set correctly");    
  
          t.ok((image.style.border == ""), "image.style.border set correctly");    
          t.eq(image.src, "", "image.style.backgroundImage correctly");    
          t.eq( image.style.position, "relative", "image.style.positionset correctly");    
  
      }
  
      function test_06_Util_applyDefaults(t) {
      
          t.plan(4);
          
          var to = { a: "abra",
                     b: "blorg"
                   };
  
          var from = { b: "zoink",
                       c: "press"
                     };
  
          OpenLayers.Util.applyDefaults(to, from);
  
          t.ok( to instanceof Object, " applyDefaults returns an object");
          t.eq( to["a"], "abra", "key present in to but not from maintained");
          t.eq( to["b"], "blorg", "key present in to and from, maintained in to");
          t.eq( to["c"], "press", "key present in from and not to successfully copied to to");
      }
  
      function test_07_Util_getParameterString(t) {
          t.plan( 1 );
  
          var params = { foo: "bar",
                         chicken: 1.5
                       }
  
          t.eq( OpenLayers.Util.getParameterString(params), "foo=bar&chicken=1.5", "getParameterString returns correctly");    
      }
  
      function test_08_Util_createAlphaImageDiv(t) {
          t.plan( 17 );
  
          var img = "http://www.openlayers.org/images/OpenLayers.trac.png";
          var sz = new OpenLayers.Size(10,10);
          var xy = new OpenLayers.Pixel(5,5);
          var position = "absolute";
          var id = "boo";
          var border = "1px solid";
          var sizing = "crop";
  
          var imageDiv = OpenLayers.Util.createAlphaImageDiv(id, xy, sz, img, position, border, sizing);
  
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( imageDiv instanceof HTMLDivElement, "createDiv creates a valid HTMLDivElement" );
  
          t.eq( imageDiv.id, id, "image.id set correctly");    
          t.eq( imageDiv.style.left, xy.x + "px", "image.style.left set correctly");    
          t.eq( imageDiv.style.top, xy.y + "px", "image.style.top set correctly");    
  
          t.eq( imageDiv.style.width, sz.w + "px", "image.style.width set correctly");    
          t.eq( imageDiv.style.height, sz.h + "px", "image.style.height set correctly");    
  
          t.eq( imageDiv.style.position, position, "image.style.positionset correctly");    
  
  
          image = imageDiv.firstChild;
  
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( image instanceof HTMLImageElement, "createImage creates a valid HTMLImageElement" );
          t.eq( image.id, id + "_innerImage", "image.id set correctly");    
  
          t.eq( image.style.width, sz.w + "px", "image.style.width set correctly");    
          t.eq( image.style.height, sz.h + "px", "image.style.height set correctly");    
  
          t.ok( (image.style.border.indexOf(border) != -1), "image.style.border set correctly");    
          t.eq( image.style.position, "relative", "image.style.positionset correctly");    
  
          if (OpenLayers.Util.alphaHack()) {
          
              t.eq(imageDiv.style.display, "inline-block", "imageDiv.style.display set correctly");
  
              var filter = "progid:DXImageTransform.Microsoft" +
                           ".AlphaImageLoader(src='" + img + "', " +
                           "sizingMethod='" + sizing + "')";
              t.eq(imageDiv.style.filter, filter, "div filter value correctly set");
  
              filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=0)";
              t.eq(image.style.filter, filter, "image filter set correctly");
  
          } else {
              t.eq( image.src, img, "image.style.backgroundImage correctly");    
              t.ok(true, "div filter value not set (not in IE)");
              t.ok(true, "image filter value not set (not in IE)");
          }
  
          var imageDiv = OpenLayers.Util.createAlphaImageDiv(id, xy, sz, img, position, border);
          if (OpenLayers.Util.alphaHack()) {
              var filter = "progid:DXImageTransform.Microsoft" +
                           ".AlphaImageLoader(src='" + img + "', " +
                           "sizingMethod='scale')";
              t.eq(imageDiv.style.filter, filter, "sizingMethod default correctly set to scale");
          } else {
              t.ok(true);
          }        
  
      }
  
      function test_09_Util_modifyDOMElement(t) {
  
          t.plan( 8 );
  
          var id = "boo";
          var px = new OpenLayers.Pixel(5,5);
          var sz = new OpenLayers.Size(10,10);
          var position = "absolute";
          var border = "1px solid";
          var overflow = "hidden";
  
          var element = document.createElement("div");
  
          OpenLayers.Util.modifyDOMElement(element, id, px, sz, 
                                           position, border, overflow);
  
          t.eq( element.id, id, "element.id set correctly");    
          t.eq( element.style.left, px.x + "px", "element.style.left set correctly");    
          t.eq( element.style.top, px.y + "px", "element.style.top set correctly");    
  
          t.eq( element.style.width, sz.w + "px", "element.style.width set correctly");    
          t.eq( element.style.height, sz.h + "px", "element.style.height set correctly");    
  
          t.eq( element.style.position, position, "element.style.position set correctly");    
          t.ok( (element.style.border.indexOf(border) != -1), "element.style.border set correctly");    
          t.eq( element.style.overflow, overflow, "element.style.overflow set correctly");    
  
      }
  
      function test_09_Util_modifyAlphaImageDiv(t) {
          t.plan( 17 );
  
          var imageDiv = OpenLayers.Util.createAlphaImageDiv();
  
          var img = "http://www.openlayers.org/images/OpenLayers.trac.png";
          var sz = new OpenLayers.Size(10,10);
          var xy = new OpenLayers.Pixel(5,5);
          var position = "absolute";
          var id = "boo";
          var border = "1px solid";
          var sizing = "crop";
  
          OpenLayers.Util.modifyAlphaImageDiv(imageDiv, id, xy, sz, img, position, border, sizing);
  
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( imageDiv instanceof HTMLDivElement, "createDiv creates a valid HTMLDivElement" );
  
          t.eq( imageDiv.id, id, "image.id set correctly");    
          t.eq( imageDiv.style.left, xy.x + "px", "image.style.left set correctly");    
          t.eq( imageDiv.style.top, xy.y + "px", "image.style.top set correctly");    
  
          t.eq( imageDiv.style.width, sz.w + "px", "image.style.width set correctly");    
          t.eq( imageDiv.style.height, sz.h + "px", "image.style.height set correctly");    
  
          t.eq( imageDiv.style.position, position, "image.style.positionset correctly");    
  
  
          image = imageDiv.firstChild;
  
          if (!isMozilla)
              t.ok( true, "skipping element test outside of Mozilla");
          else
              t.ok( image instanceof HTMLImageElement, "createImage creates a valid HTMLImageElement" );
          t.eq( image.id, id + "_innerImage", "image.id set correctly");    
  
          t.eq( image.style.width, sz.w + "px", "image.style.width set correctly");    
          t.eq( image.style.height, sz.h + "px", "image.style.height set correctly");    
  
          t.ok( (image.style.border.indexOf(border) != -1), "image.style.border set correctly");    
          t.eq( image.style.position, "relative", "image.style.positionset correctly");    
  
          if (OpenLayers.Util.alphaHack()) {
          
              t.eq(imageDiv.style.display, "inline-block", "imageDiv.style.display set correctly");
  
              var filter = "progid:DXImageTransform.Microsoft" +
                           ".AlphaImageLoader(src='" + img + "', " +
                           "sizingMethod='" + sizing + "')";
              t.eq(imageDiv.style.filter, filter, "div filter value correctly set");
  
              filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=0)";
              t.eq(image.style.filter, filter, "image filter set correctly");
  
          } else {
              t.eq( image.src, img, "image.style.backgroundImage correctly");    
              t.ok(true, "div filter value not set (not in IE)");
              t.ok(true, "image filter value not set (not in IE)");
          }
  
          var imageDiv = OpenLayers.Util.createAlphaImageDiv(id, xy, sz, img, position, border);
          if (OpenLayers.Util.alphaHack()) {
              var filter = "progid:DXImageTransform.Microsoft" +
                           ".AlphaImageLoader(src='" + img + "', " +
                           "sizingMethod='scale')";
              t.eq(imageDiv.style.filter, filter, "sizingMethod default correctly set to scale");
          } else {
              t.ok(true);
          }        
     
      }
         
      function test_10_Util_upperCaseObject(t) {
      
          t.plan(8);
          
          var aKey = "chicken";
          var aValue = "pot pie";
  
          var bKey = "blorg";
          var bValue = "us maximus";
          
          var obj = new Object();
          obj[aKey] = aValue;        
          obj[bKey] = bValue;        
               
          var uObj = OpenLayers.Util.upperCaseObject(obj);          
  
          //make sure old object not modified
          t.eq(obj[aKey], aValue, "old lowercase value still present in old obj");
          t.eq(obj[bKey], bValue, "old lowercase value still present in old obj");
  
          t.eq(obj[aKey.toUpperCase()], null, "new uppercase value not present in old obj");
          t.eq(obj[bKey.toUpperCase()], null, "new uppercase value not present in old obj");
  
          //make sure new object modified
          t.eq(uObj[aKey], null, "old lowercase value not present");
          t.eq(uObj[bKey], null, "old lowercase value not present");
  
          t.eq(uObj[aKey.toUpperCase()], aValue, "new uppercase value present");
          t.eq(uObj[bKey.toUpperCase()], bValue, "new uppercase value present");
      }
      
      function test_11_Util_createUniqueID(t) {
          t.plan(2);
          
          var id = OpenLayers.Util.createUniqueID();
          t.ok( id.startsWith("id_"), "default OpenLayers.Util.createUniqueID starts id correctly");
  
          var id = OpenLayers.Util.createUniqueID("chicken");
          t.ok( id.startsWith("chicken"), "OpenLayers.Util.createUniqueID starts id correctly");
      }
      
      function test_12_Util_limitSigDigs(t) {
  
          t.plan(7);
  
          var x;
  
          x = 123456;
          t.eq(x.limitSigDigs(3), 123000, "correctly rounds down");
  
          x = 555555;
          t.eq(x.limitSigDigs(3), 556000, "correctly rounds up");
  
          x = 66;
          t.eq(x.limitSigDigs(3), 66, "correctly handles number smaller than sigdig");
  
          t.eq(x.limitSigDigs(null), 0, "correctly handles null sigdig");
          t.eq(x.limitSigDigs(0), 0, "correctly handles 0 sigdig");
          t.eq(x.limitSigDigs(-1), 0, "correctly handles negative sigdig");
  
          x = 0;
          t.eq(x.limitSigDigs(2), 0, "correctly handles 0 number");
  
  
  
      }
  
    // -->
    </script>
  </head>
  <body>
      <div id="map" style="width: 1024px; height: 512px;"/>
  </body>
  </html>
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tests/throws.js
  
  Index: throws.js
  ===================================================================
  /*
  
    throws.js -- Adds a `throws_` method to AnotherWay test objects.
  
    Copyright 2005 MetaCarta, Inc., released under the BSD License.
  
  
    A reference to this file needs to be added to `run-tests.html` in the
    head element after the AnotherWay classes are created:
  
      <script type="text/javascript" src="throws.js"></script>
  
    Then, it can be used just like the `ok`, `fail` and other such methods
    in your unit tests.
  
    e.g. 
  
     t.throws_(function () {new OpenLayers.View.Map.Dynamic();},
               ReferenceError("No container supplied."),
               "OpenLayers.View.Map.Dynamic instantiation with no container "
               + "must throw.");
  
    This was inspired by the `assertRaises` method of Python's unittest
    library.
  
    Possible future enhancements:
  
      * Contribute to official AnotherWay distribution.
      * Use `apply` rather than require a inner function (or as an option).
      * Preserve the stack fields.
  
   */
  
  Test.AnotherWay._test_object_t.prototype.throws_ = 
  function (fn, expectedException, doc) {
      /*
        
         Executes the supplied function object catching any exception(s)
         thrown, then verifies the supplied expected exception occurred.
        
         If no exception is thrown the test fails.
  
         If an exception is thrown and it does not match the supplied
         expected exception the test fails.
  
         If the exception thrown matches the supplied expected exception
         the test passes.
  
         Two exceptions "match" if Test.AnotherWay's `eq` method considers
         the two equal when their respective stacks are ignored.
  
                        fn - The function object to be executed
         expectedException - The exception object expected to result
                       doc - Description of the test
  
         Note: The name of this method is `throws_` (with a trailing
               underscore) as `throws` is a reserved identifier and can
               not be used as a method name.
  
         Note: This function does not preserve the stack field associated
               with either exception.
  
       */
      var theCaughtException = null;
  
      try {
          fn();
      } catch (innerCaughtException) {
          // As `innerCaughtException` is not visible outside the scope
          // of this `catch` block we need to make it visible explicitly. 
          theCaughtException = innerCaughtException;
      }
  
      if (theCaughtException) {
          // We delete the stacks before comparison as they will never match.
          delete theCaughtException.stack;
          delete expectedException.stack;
          this.eq(theCaughtException, expectedException, doc);
      } else {
          this.fail(doc);
      }
  }
  
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tools/README.txt
  
  Index: README.txt
  ===================================================================
  This directory contains tools used in the packaging or deployment of OpenLayers.
  
  Javascript minimizing tools:
  
   * jsmin.c, jsmin.py:
     jsmin.py is a direct translation of the jsmin.c code into Python. jsmin.py
     will therefore run anyplace Python runs... but at significantly slower speed.
   
   * shrinksafe.py
     shrinksafe.py calls out to a third party javascript shrinking service. This 
     creates file sizes about 4% smaller (as of commit 501) of the OpenLayers 
     code. However, this also has the side effect of making you dependant on the 
     web service -- and since that service sometimes goes dead, it's risky to 
     depend on it.
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tools/jsmin.c
  
  Index: jsmin.c
  ===================================================================
  /* jsmin.c
     2006-05-04
  
  Copyright (c) 2002 Douglas Crockford  (www.crockford.com)
  
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in
  the Software without restriction, including without limitation the rights to
  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
  of the Software, and to permit persons to whom the Software is furnished to do
  so, subject to the following conditions:
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
  
  The Software shall be used for Good, not Evil.
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE.
  */
  
  #include <stdlib.h>
  #include <stdio.h>
  
  static int   theA;
  static int   theB;
  static int   theLookahead = EOF;
  
  
  /* isAlphanum -- return true if the character is a letter, digit, underscore,
          dollar sign, or non-ASCII character.
  */
  
  static int
  isAlphanum(int c)
  {
      return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
          (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' ||
          c > 126);
  }
  
  
  /* get -- return the next character from stdin. Watch out for lookahead. If
          the character is a control character, translate it to a space or
          linefeed.
  */
  
  static int
  get()
  {
      int c = theLookahead;
      theLookahead = EOF;
      if (c == EOF) {
          c = getc(stdin);
      }
      if (c >= ' ' || c == '\n' || c == EOF) {
          return c;
      }
      if (c == '\r') {
          return '\n';
      }
      return ' ';
  }
  
  
  /* peek -- get the next character without getting it.
  */
  
  static int
  peek()
  {
      theLookahead = get();
      return theLookahead;
  }
  
  
  /* next -- get the next character, excluding comments. peek() is used to see
          if a '/' is followed by a '/' or '*'.
  */
  
  static int
  next()
  {
      int c = get();
      if  (c == '/') {
          switch (peek()) {
          case '/':
              for (;;) {
                  c = get();
                  if (c <= '\n') {
                      return c;
                  }
              }
          case '*':
              get();
              for (;;) {
                  switch (get()) {
                  case '*':
                      if (peek() == '/') {
                          get();
                          return ' ';
                      }
                      break;
                  case EOF:
                      fprintf(stderr, "Error: JSMIN Unterminated comment.\n");
                      exit(1);
                  }
              }
          default:
              return c;
          }
      }
      return c;
  }
  
  
  /* action -- do something! What you do is determined by the argument:
          1   Output A. Copy B to A. Get the next B.
          2   Copy B to A. Get the next B. (Delete A).
          3   Get the next B. (Delete B).
     action treats a string as a single character. Wow!
     action recognizes a regular expression if it is preceded by ( or , or =.
  */
  
  static void
  action(int d)
  {
      switch (d) {
      case 1:
          putc(theA, stdout);
      case 2:
          theA = theB;
          if (theA == '\'' || theA == '"') {
              for (;;) {
                  putc(theA, stdout);
                  theA = get();
                  if (theA == theB) {
                      break;
                  }
                  if (theA <= '\n') {
                      fprintf(stderr,
  "Error: JSMIN unterminated string literal: %c\n", theA);
                      exit(1);
                  }
                  if (theA == '\\') {
                      putc(theA, stdout);
                      theA = get();
                  }
              }
          }
      case 3:
          theB = next();
          if (theB == '/' && (theA == '(' || theA == ',' || theA == '=' ||
                  theA == ':' || theA == '[' || theA == '!' || theA == '&' || 
                  theA == '|')) {
              putc(theA, stdout);
              putc(theB, stdout);
              for (;;) {
                  theA = get();
                  if (theA == '/') {
                      break;
                  } else if (theA =='\\') {
                      putc(theA, stdout);
                      theA = get();
                  } else if (theA <= '\n') {
                      fprintf(stderr,
  "Error: JSMIN unterminated Regular Expression literal.\n", theA);
                      exit(1);
                  }
                  putc(theA, stdout);
              }
              theB = next();
          }
      }
  }
  
  
  /* jsmin -- Copy the input to the output, deleting the characters which are
          insignificant to JavaScript. Comments will be removed. Tabs will be
          replaced with spaces. Carriage returns will be replaced with linefeeds.
          Most spaces and linefeeds will be removed.
  */
  
  static void
  jsmin()
  {
      theA = '\n';
      action(3);
      while (theA != EOF) {
          switch (theA) {
          case ' ':
              if (isAlphanum(theB)) {
                  action(1);
              } else {
                  action(2);
              }
              break;
          case '\n':
              switch (theB) {
              case '{':
              case '[':
              case '(':
              case '+':
              case '-':
                  action(1);
                  break;
              case ' ':
                  action(3);
                  break;
              default:
                  if (isAlphanum(theB)) {
                      action(1);
                  } else {
                      action(2);
                  }
              }
              break;
          default:
              switch (theB) {
              case ' ':
                  if (isAlphanum(theA)) {
                      action(1);
                      break;
                  }
                  action(3);
                  break;
              case '\n':
                  switch (theA) {
                  case '}':
                  case ']':
                  case ')':
                  case '+':
                  case '-':
                  case '"':
                  case '\'':
                      action(1);
                      break;
                  default:
                      if (isAlphanum(theA)) {
                          action(1);
                      } else {
                          action(3);
                      }
                  }
                  break;
              default:
                  action(1);
                  break;
              }
          }
      }
  }
  
  
  /* main -- Output any command line arguments as comments
          and then minify the input.
  */
  extern int
  main(int argc, char* argv[])
  {
      int i;
      for (i = 1; i < argc; i += 1) {
          fprintf(stdout, "// %s\n", argv[i]);
      }
      jsmin();
      return 0;
  }
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tools/jsmin.py
  
  Index: jsmin.py
  ===================================================================
  #!/usr/bin/python
  
  # This code is original from jsmin by Douglas Crockford, it was translated to
  # Python by Baruch Even. The original code had the following copyright and
  # license.
  #
  # /* jsmin.c
  #    2003-04-21
  # 
  # Copyright (c) 2002 Douglas Crockford  (www.crockford.com)
  # 
  # Permission is hereby granted, free of charge, to any person obtaining a copy of
  # this software and associated documentation files (the "Software"), to deal in
  # the Software without restriction, including without limitation the rights to
  # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
  # of the Software, and to permit persons to whom the Software is furnished to do
  # so, subject to the following conditions:
  # 
  # The above copyright notice and this permission notice shall be included in all
  # copies or substantial portions of the Software.
  # 
  # The Software shall be used for Good, not Evil.
  # 
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  # SOFTWARE.
  # */
  
  from StringIO import StringIO
  
  def jsmin(js):
  	ins = StringIO(js)
  	outs = StringIO()
  	JavascriptMinify().minify(ins, outs)
  	str = outs.getvalue()
  	if len(str) > 0 and str[0] == '\n':
  		str = str[1:]
  	return str
  
  def isAlphanum(c):
  	"""return true if the character is a letter, digit, underscore,
             dollar sign, or non-ASCII character.
  	"""
  	return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or
  	        (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126));
  
  class UnterminatedComment(Exception):
  	pass
  
  class UnterminatedStringLiteral(Exception):
  	pass
  
  class UnterminatedRegularExpression(Exception):
  	pass
  
  class JavascriptMinify(object):
  
  	def _outA(self):
  		self.outstream.write(self.theA)
  	def _outB(self):
  		self.outstream.write(self.theB)
  
  	def _get(self):
  		"""return the next character from stdin. Watch out for lookahead. If
  		   the character is a control character, translate it to a space or
  		   linefeed.
  		"""
  		c = self.theLookahead
  		self.theLookahead = None
  		if c == None:
  			c = self.instream.read(1)
  		if c >= ' ' or c == '\n':
  			return c
  		if c == '': # EOF
  			return '\000'
  		if c == '\r':
  			return '\n'
  		return ' '
  
  	def _peek(self):
  		self.theLookahead = self._get()
  		return self.theLookahead
  
  	def _next(self):
  		"""get the next character, excluding comments. peek() is used to see
  		   if a '/' is followed by a '/' or '*'.
  		"""
  		c = self._get()
  		if c == '/':
  			p = self._peek()
  			if p == '/':
  				c = self._get()
  				while c > '\n':
  					c = self._get()
  				return c
  			if p == '*':
  				c = self._get()
  				while 1:
  					c = self._get()
  					if c == '*':
  						if self._peek() == '/':
  							self._get()
  							return ' '
  					if c == '\000':
  						raise UnterminatedComment()
  
  		return c
  
  	def _action(self, action):
  		"""do something! What you do is determined by the argument:
  		   1   Output A. Copy B to A. Get the next B.
  		   2   Copy B to A. Get the next B. (Delete A).
  		   3   Get the next B. (Delete B).
  		   action treats a string as a single character. Wow!
  		   action recognizes a regular expression if it is preceded by ( or , or =.
  		"""
  		if action <= 1:
  			self._outA()
  			
  		if action <= 2:
  			self.theA = self.theB
  			if self.theA == "'" or self.theA == '"':
  				while 1:
  					self._outA()
  					self.theA = self._get()
  					if self.theA == self.theB:
  						break
  					if self.theA <= '\n':
  						raise UnterminatedStringLiteral()
  					if self.theA == '\\':
  						self._outA()
  						self.theA = self._get()
  
  
  		if action <= 3:
  			self.theB = self._next()
  			if self.theB == '/' and (self.theA == '(' or self.theA == ',' or self.theA == '='):
  				self._outA()
  				self._outB()
  				while 1:
  					self.theA = self._get()
  					if self.theA == '/':
  						break
  					elif self.theA == '\\':
  						self._outA()
  						self.theA = self._get()
  					elif self.theA <= '\n':
  						raise UnterminatedRegularExpression()
  					self._outA()
  				self.theB = self._next()
  
  
  	def _jsmin(self):
  		"""Copy the input to the output, deleting the characters which are
  		   insignificant to JavaScript. Comments will be removed. Tabs will be
  		   replaced with spaces. Carriage returns will be replaced with linefeeds.
  		   Most spaces and linefeeds will be removed.
  		"""
  		self.theA = '\n'
  		self._action(3)
  
  		while self.theA != '\000':
  			if self.theA == ' ':
  				if isAlphanum(self.theB):
  					self._action(1)
  				else:
  					self._action(2)
  			elif self.theA == '\n':
  				if self.theB in ['{', '[', '(', '+', '-']:
  					self._action(1)
  				elif self.theB == ' ':
  					self._action(3)
  				else:
  					if isAlphanum(self.theB):
  						self._action(1)
  					else:
  						self._action(2)
  			else:
  				if self.theB == ' ':
  					if isAlphanum(self.theA):
  						self._action(1)
  					else:
  						self._action(3)
  				elif self.theB == '\n':
  					if self.theA in ['}', ']', ')', '+', '-', '"', '\'']:
  						self._action(1)
  					else:
  						if isAlphanum(self.theA):
  							self._action(1)
  						else:
  							self._action(3)
  				else:
  					self._action(1)
  
  	def minify(self, instream, outstream):
  		self.instream = instream
  		self.outstream = outstream
  		self.theA = None
  		self.thaB = None
  		self.theLookahead = None
  
  		self._jsmin()
  		self.instream.close()
  
  if __name__ == '__main__':
  	import sys
  	jsm = JavascriptMinify()
  	jsm.minify(sys.stdin, sys.stdout)
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tools/mergejs.py
  
  Index: mergejs.py
  ===================================================================
  #!/usr/bin/env python
  #
  # Merge multiple JavaScript source code files into one.
  #
  # Usage:
  # This script requires source files to have dependencies specified in them.
  #
  # Dependencies are specified with a comment of the form:
  #
  #     // @requires <file path>
  #
  #  e.g.
  #
  #    // @requires Geo/DataSource.js
  #
  #  or (ideally) within a class comment definition
  #
  #     /**
  #      * @class
  #      *
  #      * @requires OpenLayers/Layer.js
  #      */
  #
  # This script should be executed like so:
  #
  #     mergejs.py <output.js> <directory> [...]
  #
  # e.g.
  #
  #     mergejs.py openlayers.js Geo/ CrossBrowser/
  #
  #  This example will cause the script to walk the `Geo` and
  #  `CrossBrowser` directories--and subdirectories thereof--and import
  #  all `*.js` files encountered. The dependency declarations will be extracted
  #  and then the source code from imported files will be output to 
  #  a file named `openlayers.js` in an order which fulfils the dependencies
  #  specified.
  #
  #
  # Note: This is a very rough initial version of this code.
  #
  # -- Copyright 2005-2006 MetaCarta, Inc. / OpenLayers project --
  #
  
  # TODO: Allow files to be excluded. e.g. `Crossbrowser/DebugMode.js`?
  # TODO: Report error when dependency can not be found rather than KeyError.
  
  import re
  import os
  import sys
  
  SUFFIX_JAVASCRIPT = ".js"
  
  RE_REQUIRE = "@requires (.*)\n" # TODO: Ensure in comment?
  class SourceFile:
      """
      Represents a Javascript source code file.
      """
  
      def __init__(self, filepath, source):
          """
          """
          self.filepath = filepath
          self.source = source
  
          self.requiredBy = []
  
  
      def _getRequirements(self):
          """
          Extracts the dependencies specified in the source code and returns
          a list of them.
          """
          # TODO: Cache?
          return re.findall(RE_REQUIRE, self.source)
  
      requires = property(fget=_getRequirements, doc="")
  
  
  
  def usage(filename):
      """
      Displays a usage message.
      """
      print "%s [-c <config file>] <output.js> <directory> [...]" % filename
  
  
  class Config:
      """
      Represents a parsed configuration file.
  
      A configuration file should be of the following form:
  
          [first]
          3rd/prototype.js
          core/application.js
          core/params.js
  
          [last]
          core/api.js
  
          [exclude]
          3rd/logger.js
  
      All headings are required.
  
      The files listed in the `first` section will be forced to load
      *before* all other files (in the order listed). The files in `last`
      section will be forced to load *after* all the other files (in the
      order listed).
  
      The files list in the `exclude` section will not be imported.
      
      """
  
      def __init__(self, filename):
          """
          Parses the content of the named file and stores the values.
          """
          lines = [line[:-1] # Assumes end-of-line character is present
                   for line in open(filename)
                   if line != "\n"] # Skip blank lines
  
          self.forceFirst = \
                      lines[lines.index("[first]") + 1:lines.index("[last]")]
  
          self.forceLast = \
                        lines[lines.index("[last]") + 1:lines.index("[exclude]")]
          
          self.exclude =  lines[lines.index("[exclude]") + 1:]
  
  if __name__ == "__main__":
      import getopt
  
      options, args = getopt.getopt(sys.argv[1:], "-c:")
      
      try:
          outputFilename = args[0]
      except IndexError:
          usage(sys.argv[0])
          raise SystemExit
      else:
          sourceDirectory = args[1]
          if not sourceDirectory:
              usage(sys.argv[0])
              raise SystemExit
  
      cfg = None
      if options and options[0][0] == "-c":
          filename = options[0][1]
          print "Parsing configuration file: %s" % filename
  
          cfg = Config(filename)
  
      allFiles = []
  
      ## Find all the Javascript source files
      for root, dirs, files in os.walk(sourceDirectory):
  	for filename in files:
  	    if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
  		filepath = os.path.join(root, filename)[len(sourceDirectory)+1:]
  		if (not cfg) or (filepath not in cfg.exclude):
  		    allFiles.append(filepath)
  
      ## Header inserted at the start of each file in the output
      HEADER = "/* " + "=" * 70 + "\n"\
               "    %s\n" +\
               "   " + "=" * 70 + " */\n\n"
  
      files = {}
  
      order = [] # List of filepaths to output, in a dependency satisfying order 
  
      ## Import file source code
      ## TODO: Do import when we walk the directories above?
      for filepath in allFiles:
          print "Importing: %s" % filepath
  	fullpath = os.path.join(sourceDirectory, filepath)
          content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
          files[filepath] = SourceFile(filepath, content) # TODO: Chop path?
  
      ## Resolve the dependencies
      print "\nResolving dependencies...\n"
  
      from toposort import toposort
  
      nodes = []
      routes = []
  
      for filepath, info in files.items():
          nodes.append(filepath)
          for neededFilePath in info.requires:
              routes.append((neededFilePath, filepath))
  
      for dependencyLevel in toposort(nodes, routes):
          for filepath in dependencyLevel:
              order.append(filepath)
  
  
      ## Move forced first and last files to the required position
      if cfg:
          print "Re-ordering files...\n"
          order = cfg.forceFirst + \
                      [item
                       for item in order
                       if ((item not in cfg.forceFirst) and
                           (item not in cfg.forceLast))] + \
                  cfg.forceLast
  
      ## Double check all dependencies have been met
      for fp in order:
          if max([order.index(rfp) for rfp in files[fp].requires] +
                 [order.index(fp)]) != order.index(fp):
              print "Inconsistent!"
              raise SystemExit
  
  
      ## Output the files in the determined order
      result = []
  
      for fp in order:
          f = files[fp]
          print "Exporting: ", f.filepath
          result.append(HEADER % f.filepath)
          source = f.source
          result.append(source)
          if not source.endswith("\n"):
              result.append("\n")
  
      print "\nTotal files merged: %d " % len(allFiles)
  
      print "\nGenerating: %s" % (outputFilename)
  
      open(outputFilename, "w").write("".join(result))
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tools/shrinksafe.py
  
  Index: shrinksafe.py
  ===================================================================
  #!/usr/bin/env python
  #
  # Script to provide a wrapper around the ShrinkSafe "web service"
  # <http://alex.dojotoolkit.org/shrinksafe/>
  #
  
  #
  # We use this script for two reasons:
  #
  #  * This avoids having to install and configure Java and the standalone
  #    ShrinkSafe utility.
  #
  #  * The current ShrinkSafe standalone utility was broken when we last
  #    used it.
  #
  
  import sys
  
  import urllib
  import urllib2
  
  URL_SHRINK_SAFE = "http://alex.dojotoolkit.org/shrinksafe/shrinksafe.php"
  
  # This would normally be dynamically generated:
  BOUNDARY_MARKER = "---------------------------72288400411964641492083565382"
                     
  if __name__ == "__main__":
      ## Grab the source code
      try:
          sourceFilename = sys.argv[1]
      except:
          print "Usage: %s (<source filename>|-)" % sys.argv[0]
          raise SystemExit
  
      if sourceFilename == "-":
          sourceCode = sys.stdin.read()
          sourceFilename = "stdin.js"
      else:
          sourceCode = open(sourceFilename).read()
          
      ## Create the request replicating posting of the form from the web page
      request = urllib2.Request(url=URL_SHRINK_SAFE)
      request.add_header("Content-Type",
                         "multipart/form-data; boundary=%s" % BOUNDARY_MARKER)
      request.add_data("""
  --%s
  Content-Disposition: form-data; name="shrinkfile[]"; filename="%s"
  Content-Type: application/x-javascript
  
  %s
  """ % (BOUNDARY_MARKER, sourceFilename, sourceCode))
  
      ## Deliver the result
      print urllib2.urlopen(request).read(),
  
  
  
  1.1                  metacat/lib/spatial/openlayers/tools/toposort.py
  
  Index: toposort.py
  ===================================================================
  #
  # According to <http://www.vrplumber.com/programming/> this file
  # is licensed under a BSD-style license. We only use the section
  # originally by Tim Peters.
  #
  # TODO: The use of this code needs to be okayed by someone.
  #
  
  class RecursionError( OverflowError, ValueError ):
      '''Unable to calculate result because of recursive structure'''
      
  
  def sort(nodes, routes, noRecursion=1):
      '''Passed a list of node IDs and a list of source,dest ID routes
      attempt to create a list of stages where each sub list
      is one stage in a process.
      '''
      children, parents = _buildChildrenLists(routes)
      # first stage is those nodes
      # having no incoming routes...
      stage = []
      stages = [stage]
      taken = []
      for node in nodes:
          if (not parents.get(node)):
              stage.append (node)
      if nodes and not stage:
          # there is no element which does not depend on
          # some other element!!!
          stage.append( nodes[0])
      taken.extend( stage )
      nodes = filter ( lambda x, l=stage: x not in l, nodes )
      while nodes:
          previousStageChildren = []
          nodelen = len(nodes)
          # second stage are those nodes
          # which are direct children of the first stage
          for node in stage:
              for child in children.get (node, []):
                  if child not in previousStageChildren and child not in taken:
                      previousStageChildren.append(child)
                  elif child in taken and noRecursion:
                      raise RecursionError( (child, node) )
          # unless they are children of other direct children...
          # TODO, actually do that...
          stage = previousStageChildren
          removes = []
          for current in stage:
              currentParents = parents.get( current, [] )
              for parent in currentParents:
                  if parent in stage and parent != current:
                      # might wind up removing current...
                      if not current in parents.get(parent, []):
                          # is not mutually dependent...
                          removes.append( current )
          for remove in removes:
              while remove in stage:
                  stage.remove( remove )
          stages.append( stage)
          taken.extend( stage )
          nodes = filter ( lambda x, l=stage: x not in l, nodes )
          if nodelen == len(nodes):
              if noRecursion:
                  raise RecursionError( nodes )
              else:
                  stages.append( nodes[:] )
                  nodes = []
      return stages
  
  def _buildChildrenLists (routes):
      childrenTable = {}
      parentTable = {}
      for sourceID,destinationID in routes:
          currentChildren = childrenTable.get( sourceID, [])
          currentParents = parentTable.get( destinationID, [])
          if not destinationID in currentChildren:
              currentChildren.append ( destinationID)
          if not sourceID in currentParents:
              currentParents.append ( sourceID)
          childrenTable[sourceID] = currentChildren
          parentTable[destinationID] = currentParents
      return childrenTable, parentTable
  
  
  def toposort (nodes, routes, noRecursion=1):
      '''Topological sort from Tim Peters, fairly efficient
      in comparison (it seems).'''
      #first calculate the recursion depth
      
      dependencies = {}
      inversedependencies = {}
      if not nodes:
          return []
      if not routes:
          return [nodes]
      for node in nodes:
          dependencies[ node ] = (0, node)
          inversedependencies[ node ] = []
      
      
      for depended, depends in routes:
          # is it a null rule
          try:
              newdependencylevel, object = dependencies.get ( depends, (0, depends))
          except TypeError:
              print depends
              raise
          dependencies[ depends ] = (newdependencylevel + 1,  depends)
          # "dependency (existence) of depended-on"
          newdependencylevel,object = dependencies.get ( depended, (0, depended) )
          dependencies[ depended ] = (newdependencylevel, depended)
          # Inverse dependency set up
          dependencieslist = inversedependencies.get ( depended, [])
          dependencieslist.append (depends)
          inversedependencies[depended] = dependencieslist
      ### Now we do the actual sorting
      # The first task is to create the sortable
      # list of dependency-levels
      sortinglist = dependencies.values()
      sortinglist.sort ()
      output = []
      while sortinglist:
          deletelist = []
          generation = []
          output.append( generation)
          while sortinglist and sortinglist[0][0] == 0:
              number, object = sortinglist[0]
              generation.append ( object )
              deletelist.append( object )
              for inverse in inversedependencies.get(object, () ):
                  try:
                      oldcount, inverse = dependencies [ inverse]
                      if oldcount > 0:
                          # will be dealt with on later pass
                          dependencies [ inverse] = (oldcount-1, inverse)
                      else:
                          # will be dealt with on this pass,
                          # so needs not to be in the sorting list next time
                          deletelist.append( inverse )
                      # just in case a loop comes through
                      inversedependencies[object] = []
                  except KeyError:
                      # dealing with a recursion-breaking run...
                      pass
              del sortinglist [0]
          # if no elements could be deleted, then
          # there is something which depends upon itself
          if not deletelist:
              if noRecursion:
                  raise RecursionError( sortinglist )
              else:
                  # hack so that something gets deleted...
  ##                import pdb
  ##                pdb.set_trace()
                  dependencies[sortinglist[0][1]] = (0,sortinglist[0][1])
          # delete the items that were dealt with
          for item in deletelist:
              try:
                  del dependencies [ item ]
              except KeyError:
                  pass
          # need to recreate the sortinglist
          sortinglist = dependencies.values()
          if not generation:
              output.remove( generation )
          sortinglist.sort ()
      return output
  
  
  
  
  
  if __name__ == "__main__":
  
      nodes = ['a', 'b', 'c', 'd', 'e', 'f']
      route = [('a', 'b'), ('b', 'c'), ('b', 'd'), ('e','f')]
  
      for x in  toposort( nodes, route):
          for a in x:
              print a
  
      raise SystemExit
  
  
  
      import pprint, traceback
      nodes= [ 0,1,2,3,4,5 ]
      testingValues = [
          [ (0,1),(1,2),(2,3),(3,4),(4,5)],
          [ (0,1),(0,2),(1,2),(3,4),(4,5)],
          [
          (0,1),
          (0,2),
          (0,2),
                      (2,4),
                      (2,5),
                  (3,2),
          (0,3)],
          [
          (0,1), # 3-element cycle test, no orphan nodes
          (1,2),
          (2,0),
                      (2,4),
                      (2,5),
                  (3,2),
          (0,3)],
          [
          (0,1),
          (1,1),
          (1,1),
                  (1,4),
                  (1,5),
                  (1,2),
          (3,1),
          (2,1),
          (2,0)],
          [
              (0,1),
              (1,0),
              (0,2),
              (0,3),
          ],
          [
              (0,1),
              (1,0),
              (0,2),
              (3,1),
          ],
      ]
      print 'sort, no recursion allowed'
      for index in range(len(testingValues)):
  ##        print '    %s -- %s'%( index, testingValues[index])
          try:
              print '        ', sort( nodes, testingValues[index] )
          except:
              print 'exception raised'
      print 'toposort, no recursion allowed'
      for index in range(len(testingValues)):
  ##        print '    %s -- %s'%( index, testingValues[index])
          try:
              print '        ', toposort( nodes, testingValues[index] )
          except:
              print 'exception raised'
      print 'sort, recursion allowed'
      for index in range(len(testingValues)):
  ##        print '    %s -- %s'%( index, testingValues[index])
          try:
              print '        ', sort( nodes, testingValues[index],0 )
          except:
              print 'exception raised'
      print 'toposort, recursion allowed'
      for index in range(len(testingValues)):
  ##        print '    %s -- %s'%( index, testingValues[index])
          try:
              print '        ', toposort( nodes, testingValues[index],0 )
          except:
              print 'exception raised'
          
          
      
  
  
  


More information about the Metacat-cvs mailing list