<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* map_functions2.php
*
* map functions (utilising WMS and WFS)
*
* PHP versions 4 and 5
*
* LICENSE:
*    ARK - The Archaeological Recording Kit.
*    An open-source framework for displaying and working with
*    archaeological data
*    Copyright (C) 2007  L - P : Partnership Ltd.
*    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 3 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, see <http://www.gnu.org/licenses/>.
*
* @category   map
* @package    ark
* @author     Stuart Eve <stuarteve@lparchaeology.com>
* @copyright  1999-2007 L - P : Partnership Ltd.
* @license    http://ark.lparchaeology.com/license
* @link       http://ark.lparchaeology.com/svn/php/map/map_functions2.php
* @since      File available since Release 0.6
*/

// {{{ mkSingleMap()
        
/**
* makes an embedded map showing the geometry of a single item
*
* generates a stand-alone html <object> that contains an Openlayers map zoomed and filtered to the 
* item. It uses the OGC filter functionality to filter a pre-defined WFS map.
* NOTE: $ark_wms_map and $ark_wfs_map are globaled so need to be set
*
* @param array $wfs_layers  the layer names (in the wfs map) to display and query
* @param array $wms_layers  the layer names (in the wms map) to display and query
* @param string $item_val  the itemval to search for
* @param int $buffer  an optional buffer value (in map units)
* @param boolean $transclude  value representing if the function is being called as part of a transclusion routine
* @return string $var  a fully resolved html string
* @access public
* @since 0.6
*/

function mkSingleMap($wfs_layers, $wms_layers, $item_val, $buffer = FALSE, $transclude = FALSE)
{
        global $ark_dir,$tilecache_path,$map_scales,$map_projection, $map_extents, $openlayers_path;
        if ($transclude){
            $var = '
                <object id="spatial"><html xmlns="http://www.w3.org/1999/xhtml">
                <head>
                <title>ARK Map</title>';
        $var .= "<script src=\"$openlayers_path\"></script> ";
        
    $var .=  '<script type="text/javascript">
                var map, sld, symbolizer
                var format = new OpenLayers.Format.SLD();
                
                        function gup(name,url) //care of http://www.netlobo.com/comments/url_query_string_javascript
                        {
                          name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
                          var regexS = "[\\?&]"+name+"=([^&#]*)";
                          var regex = new RegExp( regexS );
                          var results = regex.exec( url );
                          if( results == null )
                            return "";
                          else
                            return results[1];
                        }
                        function init(){
                               var scales = '. $map_scales . ';
                                var resolutions = "";
                                for (var i = 0; i < scales.length; i++) {
                                    resolutions += OpenLayers.Util.getResolutionFromScale(scales[i], "m") + ",";
                                }
                    map = new OpenLayers.Map("map", {
                                projection: new OpenLayers.Projection("'.$map_projection.'"),
                                maxExtent: new OpenLayers.Bounds('.$map_extents.'),
                                                        scales: ' . $map_scales . ',
                                                        resolutions:resolutions,
                                                        units:"m"
                    });
                    map.addControl(new OpenLayers.Control.MousePosition());
                    OpenLayers.loadURL("../../mapserver/tmp/ark-sld.xml", null, null, complete);';
                        if ($tilecache_path) {
                                $var .=    "wms = new OpenLayers.Layer.WMS( 
                                                    'ARK WMS',
                                                    '$tilecache_path',
                                                    {layers: [";
                        } else {
                                $var .=    'wms = new OpenLayers.Layer.WMS( 
                                                    "ARK WMS",
                                                    "' . $ark_dir . '/php/map/ark_wxs_server.php",
                                                    {layers: [';
                        }

                        foreach ($wms_layers as $key => $layer) {
                                $var .= "'$layer',";
                        }
                
                        $var .= "],format: \"image/png; mode=24bit\"}
                    );
                }
                function getDefaultStyle(sld, layerName) {
                    var styles = sld.namedLayers[layerName].userStyles;
                    var style;
                    for (var i=0; i<styles.length; ++i){
                            style = styles[i];
                           if(style.isDefault) {
                              break;
                            }
                    }

                                var rule = new OpenLayers.Rule({
                                                                 filter: new OpenLayers.Filter.Comparison(
                                                                                {
                                                                                        type: OpenLayers.Filter.Comparison.EQUAL_TO,
                                                                                    property: \"ark_id\",
                                                                                    value: \"$item_val\",}
                                                                                )
                                                        });
                                style.addRules(rule);
                    return style;
                }        
                    function complete(req) {
                        sld = format.read(req.responseXML || req.responseText);
                            ";
            $var .= "map.addLayers([wms]);\n";
            //build up the filters
            foreach ($wfs_layers as $key => $layer){
                         $var .= "var style_$layer = getDefaultStyle(sld,\"$layer\");\n";
                        $var .= "OpenLayers.loadURL(\"$ark_dir/php/map/ark_wxs_server.php?&VERSION=1.0.0&SERVICE=WFS&REQUEST=GetFeature&TYPENAME={$layer}&Filter=<Filter>";
                    $var .= "<PropertyIsEqualTo><PropertyName>ark_id</PropertyName>";
                    $var .= "<Literal>$item_val</Literal></PropertyIsEqualTo></Filter>\", \"\", null, parseData);\n";
            }
    
            $var .= "function parseData(req) {
                        g =  new OpenLayers.Format.GML();
                                       // layer_name = gup('TYPENAME',req.request.url);
                                        layer = new OpenLayers.Layer.Vector(layer_name,{styleMap: new OpenLayers.StyleMap({\"default\":getDefaultStyle(sld,layer_name)})});
                        features = g.read(req.responseText);
                                        if (features.length > 0){
                                var bbox = null;
                                                map.addLayer(layer);
                                for (var i = 0; i < features.length; i++) {
                                      var geometry = features[i].geometry;
                                                          layer.addFeatures(features[i]);
                                      if (bbox == null) {
                                           bbox = geometry.getBounds().clone();
                                       } else {
                                         bbox.extend(geometry.getBounds());
                                      }
                                  }
                                  if(bbox){
                                      map.zoomToExtent(bbox);
                                  }else{
                                      map.destroy();
                                      map_div = document.getElementById(\"map\");
                                      map_div.innerHTML = \"<p>No spatial data available\";
                                      map_div.setAttribute('style','height: 30px; background: none');

                                  }
                                        }
                      }

                ";
             
            $var .= "} </script>";
            $var .= " </head>
                            <body onload=\"init()\">
                                <div id=\"map\" class=\"smallmap\"></div>
                            </body>
                </html>";
  
            $var .= '</object>';
    
            return ($var);
        }else{
                $var = '
                        <div>
                        <div id="map" class="smallmap"></div>
                        <script src="' . $openlayers_path . '"></script>
                <script type="text/javascript">
                var map, sld, symbolizer
                var format = new OpenLayers.Format.SLD();
                
                        function gup(name,url) //care of http://www.netlobo.com/comments/url_query_string_javascript
                        {
                          name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
                          var regexS = "[\\?&]"+name+"=([^&#]*)";
                          var regex = new RegExp( regexS );
                          var results = regex.exec( url );
                          if( results == null )
                            return "";
                          else
                            return results[1];
                        }
                
                function init(){
                                var scales = '. $map_scales . ';
                                var resolutions = "";
                                for (var i = 0; i < scales.length; i++) {
                                    resolutions += OpenLayers.Util.getResolutionFromScale(scales[i], "m") + ",";
                                }
                    map = new OpenLayers.Map("map", {
                                projection: new OpenLayers.Projection("'.$map_projection.'"),
                                maxExtent: new OpenLayers.Bounds('.$map_extents.'),
                                                        scales: ' . $map_scales . ',
                                                        resolutions:resolutions,
                                                        units:"m"
                    });
                    map.addControl(new OpenLayers.Control.MousePosition());
                    OpenLayers.loadURL("mapserver/tmp/ark-sld.xml", null, null, complete);';
                        if ($tilecache_path) {
                                $var .=    "wms = new OpenLayers.Layer.WMS( 
                                                    'ARK WMS',
                                                    '$tilecache_path',
                                                    {layers: [";
                        } else {
                                $var .=    'wms = new OpenLayers.Layer.WMS( 
                                                    "ARK WMS",
                                                    "' . $ark_dir . '/php/map/ark_wxs_server.php",
                                                    {layers: [';
                        }

                        foreach ($wms_layers as $key => $layer) {
                                $var .= "'$layer',";
                        }
                
                        $var .= "],format: \"image/png; mode=24bit\"}
                    );
                }
                function getDefaultStyle(sld, layerName) {
                    var styles = sld.namedLayers[layerName].userStyles;
                    var style;
                    for (var i=0; i<styles.length; ++i){
                            style = styles[i];
                           if(style.isDefault) {
                              break;
                            }
                    }

                                var rule = new OpenLayers.Rule({
                                                                 filter: new OpenLayers.Filter.Comparison(
                                                                                {
                                                                                        type: OpenLayers.Filter.Comparison.EQUAL_TO,
                                                                                    property: \"ark_id\",
                                                                                    value: \"$item_val\",}
                                                                                )
                                                        });
                                style.addRules(rule);
                    return style;
                }        
                    function complete(req) {
                        sld = format.read(req.responseXML || req.responseText);
                            ";
            $var .= "map.addLayers([wms]);\n";
            //build up the filters
            foreach ($wfs_layers as $key => $layer){
                         $var .= "var style_$layer = getDefaultStyle(sld,\"$layer\");\n";
                        $var .= "OpenLayers.loadURL(\"php/map/ark_wxs_server.php?&VERSION=1.0.0&SERVICE=WFS&REQUEST=GetFeature&TYPENAME={$layer}&Filter=<Filter>";
                    $var .= "<PropertyIsEqualTo><PropertyName>ark_id</PropertyName>";
                    $var .= "<Literal>$item_val</Literal></PropertyIsEqualTo></Filter>\", \"\", null, parseData);\n";
            }
    
            $var .= "function parseData(req) {
                        g =  new OpenLayers.Format.GML();
                          response = req.responseText;
                            response = response.split('&amp;TYPENAME=');
                            response = response[1].split('&amp;');
                            layer_name = response[0];
                                     
                                        layer = new OpenLayers.Layer.Vector(layer_name,{styleMap: new OpenLayers.StyleMap({\"default\":getDefaultStyle(sld,layer_name)})});
                        features = g.read(req.responseText);
                                        if (features.length > 0){
                                var bbox = null;
                                                map.addLayer(layer);
                                for (var i = 0; i < features.length; i++) {
                                      var geometry = features[i].geometry;
                                                          layer.addFeatures(features[i]);
                                      if (bbox == null) {
                                           bbox = geometry.getBounds().clone();
                                       } else {
                                         bbox.extend(geometry.getBounds());
                                      }
                                  }
                                  if(bbox){";
                if ($buffer) {
                        $var .=                 "buffer_bounds = bbox.toArray();
                                                         buffer_bounds[0] = buffer_bounds[0] - $buffer;
                                                         buffer_bounds[1] = buffer_bounds[1] - $buffer;
                                                         buffer_bounds[2] = buffer_bounds[2] + $buffer;
                                                         buffer_bounds[3] = buffer_bounds[3] + $buffer;
                                                         bbox = new OpenLayers.Bounds.fromArray(buffer_bounds);
                        ";
                }
        
             $var .=         "map.zoomToExtent(bbox);
                                  }else{
                                      map.destroy();
                                      map_div = document.getElementById(\"map\");
                                      map_div.innerHTML = \"<p>No spatial data available\";
                                      map_div.setAttribute('style','height: 30px; background: none');

                                  }
                                        }
                      }

                ";
             
            $var .= "} init();</script></div>";
            //$var .= "<script>init();</script>";
    
            return ($var);
                
        }
        
}
// }}}
// {{{ mkFilterMap()
        
/**
* makes an embedded map showing the results of a filter (or results_array())
*
* generates a stand-alone html <object> that contains an Openlayers map zoomed and filtered to the 
* the results array. It uses the OGC filter functionality to filter a pre-defined WMS map.
* NOTE: $ark_dir, $tilecache_path and $map_scales are globaled so need to be set
*
* @param array $wfs_layers  the layer names (in the wfs map) to display
* @param array $wms_layers  the layer names (in the wms map) to display
* @param array $wms_qlayers  the layer names (in the wms map) to query
* @param array $results_array  the results array
* @param int $buffer  an optional buffer value (in map units) to buffer the results
* @param boolean $transclude  value representing if the function is being called as part of a transclusion routine
* @param mixed $filter  optional filter name or id - if this is being transcluded then the filter needs to be built from scratch
* @return string $var  a fully resolved html string
* @access public
* @since 0.6
*/
function mkFilterMap($wfs_layers, $wms_layers, $wfs_qlayers, $results_array, $buffer = FALSE, $transclude = FALSE, $filter = FALSE)
{
        global $ark_dir, $lang, $tilecache_path,$map_scales,$map_projection, $map_extents, $openlayers_path;
        $wfs_query_path = $ark_dir . '/php/map/ark_wxs_server.php?';
        
        //before we do anything if filter exists grab the filter and then run it
        
        if ($filter){
        
        //        RUN THE FILTER HERE AND GET THE RESULTS ARRAY
        
        }
        
        //now create the SLD file for the query layers
        if (!empty($results_array)) {
                $active_itemkeys = array();
                $new_wfs_qlayers = array();
                $total_results = count($results_array);
                $layer_num = 1 + round($total_results/10);
                foreach ($results_array as $key => $value) {
                        if (!in_array($value['itemkey'],$active_itemkeys)) {
                                $active_itemkeys[] = $value['itemkey'];
                        }
                }
                if (!empty($active_itemkeys)) {
                        foreach ($active_itemkeys as $key => $itemkey) {
                                foreach ($wfs_qlayers as $key => $wfs_qlayer) {
                                        if (substr($itemkey,0,3) == substr($wfs_qlayer['name'],0,3)) {
                                                $new_wfs_qlayers[] = $wfs_qlayer;
                                        }
                                }
                        }
                }
                if (!empty($new_wfs_qlayers)) {
                        $wfs_qlayers = $new_wfs_qlayers;
                }
                $sld_path = createSLDFile($wfs_qlayers,$results_array);
        } else {
                $sld_path = 'mapserver/templates/ark-query-sld.xml';
        }
        
        if ($transclude && $layer_num > 0){


        }elseif ($layer_num > 0){
                $var = '
                        <div>
                        <div id="map" class="mapview"></div>
                        <div id="nodeList"></div>
                        <script src="' . $openlayers_path . '"></script>
                        <script type="text/javascript">
                        var map, sld, symbolizer, layer_number, layer_name;
                        var format = new OpenLayers.Format.SLD();
                        var gml_layer = new OpenLayers.Layer.Vector("gml_layer");
                        var bbox = null;
                        var paramArray = new Array();
                        function gup(name,url) //care of http://www.netlobo.com/comments/url_query_string_javascript
                        {
                          name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
                          var regexS = "[\\?&]"+name+"=([^&#]*)";
                          var regex = new RegExp( regexS );
                          var results = regex.exec( url );
                          if( results == null )
                            return "";
                          else
                            return results[1];
                        }';
                        
                        $var .= 'function alert_properties(obj){
                                    var str=""; //variable which will hold property values
                                    for(prop in obj)
                                    {
                                    str+=prop + " value :"+ obj[prop]+"\n";//Concate prop and its value from object
                                    }
                                    alert(str); //Show all properties and its value  
                        }';
                        
                         $var .= "function parseData(req) {
 
                                        g =  new OpenLayers.Format.GML();
                                         response = req.responseText;
                                            response = response.split('&amp;TYPENAME=');
                                            response = response[1].split('&amp;');
                                            layer_name = response[0];
                                        
                                                        ";
                                                
                        $var .= "                
                                        features = g.read(req.responseText);
                                        if (features.length > 0){

                                        for (var i = 0; i < features.length; i++) {
                                                      var geometry = features[i].geometry;
                                                      features[i].attributes['layer'] = layer_name;
                                                      gml_layer.addFeatures(features[i]);  

                                                      if (bbox == null) {
                                                         bbox = geometry.getBounds().clone();
                                                       } else {
                                                         bbox.extend(geometry.getBounds());
                                                      }
                                                  }
                                        if(bbox){";
                        if ($buffer) {
                            $var .=                 "buffer_bounds = bbox.toArray();
                                                                     buffer_bounds[0] = buffer_bounds[0] - $buffer;
                                                                     buffer_bounds[1] = buffer_bounds[1] - $buffer;
                                                                     buffer_bounds[2] = buffer_bounds[2] + $buffer;
                                                                     buffer_bounds[3] = buffer_bounds[3] + $buffer;
                                                                     bbox = new OpenLayers.Bounds.fromArray(buffer_bounds);
                            ";
                            }

                             $var .=         "
                                                  }else{
                                                      map_div = document.getElementById(\"map\");
                                                      map_div.innerHTML = \"<p>No spatial data available\";
                                                      map_div.setAttribute('style','height: 30px; background: none');

                                                  }
                                                                
                                            }
                                      }

                            ";

                            $var .= '
                
                                function init(){
                                    var scales = '. $map_scales . ';
                                    var resolutions = "";
                                    for (var i = 0; i < scales.length; i++) {
                                        resolutions += OpenLayers.Util.getResolutionFromScale(scales[i], "m") + ",";
                                        }
                            ';
                    
                            $var .=     
                                'map = new OpenLayers.Map("map", {
                                projection: new OpenLayers.Projection("'.$map_projection.'"),
                                maxExtent: new OpenLayers.Bounds('.$map_extents.'),
                                                        scales: ' . $map_scales . ',
                                                        resolutions:resolutions,
                                                        units:"m"
                                });
                                map.addControl(new OpenLayers.Control.MousePosition());
                                map.addLayer(gml_layer);
                                
                                function onPopupClose(evt) {
                                            selectControl.unselect(selectedFeature);
                                }
                                function onClickedPopupClose(evt) {
                                            gml_layer_click.unselect(clickedFeature);
                                }
                                function onFeatureSelect(feature) {
                                           selectedFeature = feature;
                                           popup = new OpenLayers.Popup.FramedCloud("selected", 
                                                                    feature.geometry.getBounds().getCenterLonLat(),
                                                                    null,
                                                                    feature.attributes["ark_id"],
                                                                    null, false, onPopupClose);
                                           feature.popup = popup;
                                           map.addPopup(popup);
                                }
                                function onFeatureUnselect(feature) {
                                           map.removePopup(feature.popup);
                                           feature.popup.destroy();
                                           feature.popup = null;
                                }
                                
                                function makePopUpText (transport) {
                                    map.popups[window["paramArray"]["popup_num"]].setContentHTML(transport.responseText);
                                }
                                
                                function onFeatureClick(feature) {
                                          
                                          click_popup = new OpenLayers.Popup.FramedCloud(feature.attributes["ark_id"], 
                                                                    feature.geometry.getBounds().getCenterLonLat(),
                                                                    null,
                                                                    "loading...",
                                                                    null, true, null);
                                                                
                                           map.addPopup(click_popup);

                                           for (var i = 0; i < map.popups.length; i++) {
                                                if (map.popups[i]["id"] == feature.attributes["ark_id"]){
                                                    window["paramArray"]["popup_num"] = i;
                                                    new OpenLayers.Ajax.Request(
                                                                 "php/map/query_wrapper.php?layer=" + feature.attributes["layer"] + "&lang='. $lang .'&ark_id=" + map.popups[i]["id"],
                                                                 {
                                                                 onComplete: makePopUpText
                                                       });
                                                }
                                           }

                                           
                                }
                                function onFeatureUnClick(feature) {
                                           map.removePopup(feature.click_popup);
                                           feature.click_popup.destroy();
                                           feature.click_popup = null;
                                }

                                var click_options = {
                                    onSelect: onFeatureClick, 
                                    callbacks:{over:onFeatureSelect,out:onFeatureUnselect}

                                };
                                
                                gml_layer_click = new OpenLayers.Control.SelectFeature(gml_layer, click_options);
                                map.addControl(gml_layer_click);
                                gml_layer_click.activate();
                                complete();';
                
                        $var .= "
                                }
        
                                function complete() {
                        ";
                        if ($tilecache_path) {
                            $var .=    "wms = new OpenLayers.Layer.WMS( 
                                                                    'ARK WMS',
                                                                    '$tilecache_path',
                                                                    {layers: [
                            ";
                        } else {
                            $var .=    'wms = new OpenLayers.Layer.WMS( 
                                                                    "ARK WMS",
                                                                    "' . $ark_dir . '/php/map/ark_wxs_server.php",
                                                                    {layers: [
                            ';
                        }

                        foreach ($wms_layers as $key => $layer) {
                            $var .= "'$layer',";
                        }

                        $var .= "],format: \"image/png; mode=24bit\"}
                                    );
                        ";

                        //now we setup the queryable WFS layer
                        foreach ($wfs_qlayers as $layer) {
                            $result_array_copy = $results_array;
                            $chunk_results = array_chunk ($result_array_copy,10);
                            $layer_number = 1;
                            foreach ($chunk_results as $value) {
                                $filter = createWFSFilterString($layer, $value);
                                $layer_name = $layer['name'];
                                $var .= "layer_name = '{$layer_name}'; layer_number = '{$layer_number}';";
                                $var .= "OpenLayers.loadURL(\"php/map/ark_wxs_server.php?&layer_number=$layer_number&VERSION=1.0.0&SERVICE=WFS&REQUEST=GetFeature&TYPENAME={$layer_name}$filter\", \"\", null, parseData);\n";
                                $layer_number++;
                            }
                        }        
                        $var .= "map.addLayers([wms]);\n";
                        $var .= "map.zoomToMaxExtent();\n";
                        $var .= "}init();</script></div>";
        //    $var .= "<script>init();</script>";

        }else{
                $var = "<div id=\"message\">Sorry, none of these results have queryable spatial data</div>";
        }
                    return ($var);

}
//}
// }}}
// {{{ mkMapView()
        
/**
* displays all of the layers as part of the map_view
*
* generates a stand-alone html <object> that contains an Openlayers map zoomed and filtered to the 
* the results array. It uses the OGC filter functionality to filter a pre-defined WMS map.
* NOTE: $ark_dir, $tilecache_path and $map_scales are globaled so need to be set
*
* @param array $mapview_layers  the layer names (in the wfs map) to display
* @param boolean $transclude  value representing if the function is being called as part of a transclusion routine
* @return string $var  a fully resolved html string
* @access public
* @since 0.6
*/
function mkMapView($mapview_layers, $transclude = FALSE)
{
        global $ark_dir,$tilecache_path,$map_scales,$map_projection, $map_extents, $openlayers_path;
        $wfs_query_path = $ark_dir . '/php/map/ark_wxs_server.php?';
        
        $sld_path = 'mapserver/templates/ark-query-sld.xml';

        
        if ($transclude){


        }
                $var = '
                        <div>
                        <div id="map" class="mapview"></div>
                        <script src="' . $openlayers_path . '"></script>
                <script type="text/javascript">
                var map';

                            $var .= '
                
                function init(){
                                var scales = '. $map_scales . ';
                                var resolutions = "";
                                for (var i = 0; i < scales.length; i++) {
                                    resolutions += OpenLayers.Util.getResolutionFromScale(scales[i], "m") + ",";
                                }';
                    
        
                                $var .=     'map = new OpenLayers.Map("map", {
                                projection: new OpenLayers.Projection("'.$map_projection.'"),
                                maxExtent: new OpenLayers.Bounds('.$map_extents.'),
                                                        scales: ' . $map_scales . ',
                                                        resolutions:resolutions,
                                                        units:"m"
                    });
                    map.addControl(new OpenLayers.Control.MousePosition());
                                 map.addControl(new OpenLayers.Control.LayerSwitcher());
                          complete();';
                
                        $var .= "
                }
        
                    function complete() {
                        ";
                                        if ($tilecache_path) {
                                                //$var .=    "wms = new OpenLayers.Layer.WMS( 
                                                //                    'ARK WMS',
                                                //                    '$tilecache_path',
                                                //                    {layers: [";
                                                                            $i = 0;
                                                foreach ($mapview_layers as $key => $layer) {
                                                        
                                                        if ($i > 0) {
                                                                $var .=    "wms_$layer = new OpenLayers.Layer.WMS( 
                                                                                    \"$layer\",
                                                                                    \"$ark_dir/php/map/ark_wxs_server.php\",
                                                                                    {layers: \"$layer\",format: \"image/png; mode=24bit\", transparent: \"true\"});\n";
                                                                $var .= "wms_$layer.isBaseLayer = false;\n";
                                                        
                                                        } else {
                                                                $var .=    "wms_$layer = new OpenLayers.Layer.WMS( 
                                                                                    \"$layer\",
                                                                                    \"$ark_dir/php/map/ark_wxs_server.php\",
                                                                                    {layers: \"$layer\",format: \"image/png; mode=24bit\"});\n";
                                                        }
                                                        $var .= "map.addLayers([wms_$layer]);\n";
                                                        $i++;
                                                }
                                        } else {
                                                $i = 0;
                                                foreach ($mapview_layers as $key => $layer) {
                                                        
                                                        if ($i > 0) {
                                                                $var .=    "wms_$layer = new OpenLayers.Layer.WMS( 
                                                                                    \"$layer\",
                                                                                    \"$ark_dir/php/map/ark_wxs_server.php\",
                                                                                    {layers: \"$layer\",format: \"image/png; mode=24bit\", transparent: \"true\"});\n";
                                                                $var .= "wms_$layer.isBaseLayer = false;\n";
                                                        
                                                        } else {
                                                                $var .=    "wms_$layer = new OpenLayers.Layer.WMS( 
                                                                                    \"$layer\",
                                                                                    \"$ark_dir/php/map/ark_wxs_server.php\",
                                                                                    {layers: \"$layer\",format: \"image/png; mode=24bit\"});\n";
                                                        }
                                                        $var .= "map.addLayers([wms_$layer]);\n";
                                                        $i++;
                                                }

                                        }

                                         $var .= "map.zoomToMaxExtent();\n"; 
          $var .= "}init();</script></div>";
                    return ($var);

}
// }}}


// {{{ createSLDFile()

/**
* writes an SLD file that styles the query results
*
*
* @param array $wms_qlayers  the layer names (in the wms map) to query
* @param array $results_array  the results array
* @return string $sld_path  the path to the sld file
* @access public
* @since 0.6
*/
//DEV NOTE: This could probably be done better using the PHP XML libraries but I'm not sure about backward compatibility
function createSLDFile($wms_qlayers, $results_array)
{
global $ark_dir, $user_id;
$file = "mapserver/tmp/$user_id". rand() . '_' . rand($user_id, 5000) . '.xml';
$handler = fopen($file, 'w');
$var = '
        <StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">';

foreach ($wms_qlayers as $key => $layer) {
        
        $count = count($results_array);
        
        $var .= "
                <NamedLayer>
                <Name>{$layer['name']}</Name>
                <UserStyle>
                <FeatureTypeStyle>
                <Rule>
                <Filter>";
                
                if ($count > 1) {
                        $var .= "<OR>";
                }
                
                foreach ($results_array as $key => $result) {
                        if (substr($result['itemkey'],0,3) == substr($layer['name'],0,3)) {
                                $var .= "
                                   <PropertyIsEqualTo>
                             <PropertyName>ark_id</PropertyName>
                            <Literal>{$result['itemval']}</Literal>
                           </PropertyIsEqualTo>
                                ";
                                //flag that we have results from this itemkey
                                $flag = TRUE;
                        }
                }
                if (!isset($flag)) {
                                //we have no results so set an impossible filter
                                $var .= "
                                   <PropertyIsEqualTo>
                             <PropertyName>ark_id</PropertyName>
                            <Literal>'NO RESULTS'</Literal>
                           </PropertyIsEqualTo>
                                ";
                }
                if ($count > 1) {
                        $var .= "</OR>";
                }
                
        $var .= "</Filter>";

                if ($layer['geom'] == 'pgn') {
                        $var .= "
                                <PolygonSymbolizer>
                                        <Fill>
                                                <CssParameter name=\"fill\">#ff0000</CssParameter>
                                        </Fill>
                                        <Stroke>
                                                <CssParameter name=\"stroke\">#000000</CssParameter>
                                        </Stroke>
                                </PolygonSymbolizer>";
                }
                if ($layer['geom'] == 'pt') {
                        $var .= "
                                        <PointSymbolizer>
                                                <Graphic>
                                                        <Mark>
                                                                <WellKnownName>circle</WellKnownName>
                                                                <Fill>
                                                                        <CssParameter name=\"fill\">#ff0000</CssParameter>
                                                                </Fill>
                                                        </Mark>
                                                        <Size>10</Size>
                                                </Graphic>
                                        </PointSymbolizer>";
                }
                if ($layer['geom'] == 'pl') {
                        $var .= "
                                        <LineSymbolizer>
                                                <Stroke>
                                                        <CssParameter name=\"stroke\">#000000</CssParameter>
                                                </Stroke>
                                        </LineSymbolizer>";
                }

        $var .= "        
                </Rule>
                </FeatureTypeStyle>
                </UserStyle>
                </NamedLayer>
                ";
}
$var .= '</StyledLayerDescriptor>';
fwrite($handler,$var);
fclose($handler);
return "http://192.168.0.61:8080/" . $ark_dir.'/'.$file;
}
// }}}
// {{{ createWFSFilterString()

/**
* writes a string that can be used to filter a WFS layer
*
*
* @param array $wfs_qlayer  the layer name (in the wfs map) to query
* @param array $results_array  the results array
* @return string $wfs_filter_string  the string to append to the URL
* @access public
* @since 0.6
*/
function createWFSFilterString($wfs_qlayer, $results_array)
{
        $count = count($results_array);
        $var = "&FILTER=<Filter>";
        if ($count > 1) {
                $var .= "<OR>";
        }        
                foreach ($results_array as $key => $result) {
                        if (substr($result['itemkey'],0,3) == substr($wfs_qlayer['name'],0,3)) {
                                $var .= "<PropertyIsEqualTo><PropertyName>ark_id</PropertyName><Literal>{$result['itemval']}</Literal></PropertyIsEqualTo>";
                        }
                }
        if ($count > 1) {
                $var .= "</OR>";
        }
       $var .= "</Filter>";
return $var;
}
// }}}
?>