<!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" xml:lang="EN" lang="EN">
 <head>
  <meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
  <title>ZOO WPS Client example</title>
  <style>
  #map{width:600px;height:600px;}
  </style>
  <link rel="stylesheet" href="/openlayers/theme/default/style.css" type="text/css" />
  <script type="text/javascript" src="/openlayers/lib/OpenLayers.js"></script>
  <script type="text/javascript">
var map, layer, select, hover, multi, control;
function init(){
  OpenLayers.ProxyHost= "../cgi-bin/proxy.cgi?url=";
  map = new OpenLayers.Map('map', {
     controls: [
       new OpenLayers.Control.PanZoom(),
       new OpenLayers.Control.Permalink(),
       new OpenLayers.Control.Navigation(),
       new OpenLayers.Control.LayerSwitcher()
     ]
  });
  layer = new OpenLayers.Layer.WMS(
     "States WMS/WFS",
     "http://localhost:8082/geoserver/ows",
     {layers: 'topp:states', format: 'image/png'},
     {buffer:1, singleTile:true}
  );

select = new OpenLayers.Layer.Vector("Selection", {styleMap:
                new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"])
            });
hover = new OpenLayers.Layer.Vector("Hover");
multi = new OpenLayers.Layer.Vector("Multi", {styleMap:
                new OpenLayers.Style({
                   fillColor:"red",
                   fillOpacity:0.4,
                   strokeColor:"red",
                   strokeOpacity:1,
                   strokeWidth:2
                })
            });
map.addLayers([layer, select, hover, multi]);

control = new OpenLayers.Control.GetFeature({
                protocol: OpenLayers.Protocol.WFS.fromWMSLayer(layer)
            });
control.events.register("featureselected", this, function(e) {
                select.addFeatures([e.feature]);
            });
control.events.register("featureunselected", this, function(e) {
                select.removeFeatures([e.feature]);
            });
control.events.register("hoverfeature", this, function(e) {
                hover.addFeatures([e.feature]);
            });
control.events.register("outfeature", this, function(e) {
                hover.removeFeatures([e.feature]);
            });
map.addControl(control);
control.activate();

  map.zoomToExtent(new OpenLayers.Bounds(-140.444336,25.115234,-44.438477,50.580078));
}
function simpleProcessing(aProcess) {
   if (select.features.length == 0)
    return alert("No feature selected!");
  var url = '/zoo/?request=Execute&service=WPS&version=1.0.0&';
  if (aProcess == 'Buffer') {
    var dist = document.getElementById('bufferDist').value;
    if (isNaN(dist))
      return alert("Distance is not a Number!");
    url+='Identifier=Buffer&DataInputs=BufferDistance='+dist+'@datatype=interger;InputPolygon=Reference@xlink:href=';
  } else
      url += 'Identifier='+aProcess+'&DataInputs=InputPolygon=Reference@xlink:href=';
  var xlink = control.protocol.url +"?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.0.0";
  xlink += '&typename='+control.protocol.featurePrefix;
  xlink += ':'+control.protocol.featureType;
  xlink += '&SRS='+control.protocol.srsName;
  xlink += '&FeatureID='+select.features[0].fid;
  url += encodeURIComponent(xlink);
  url += '&RawDataOutput=Result@mimeType=application/json';
  var request = new OpenLayers.Request.XMLHttpRequest();
  request.open('GET',url,true);
  request.onreadystatechange = function() {
    if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) {
       var GeoJSON = new OpenLayers.Format.GeoJSON();
       var features = GeoJSON.read(request.responseText);
       hover.removeFeatures(hover.features);
       hover.addFeatures(features);
     }
  }
  request.send();
}
function multiProcessing(aProcess) {
  if (select.features.length == 0 || hover.features.length == 0)
    return alert("No feature created!");
  var url = '/zoo/';
  var xlink = control.protocol.url +"?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.0.0";
  xlink += '&typename='+control.protocol.featurePrefix;
  xlink += ':'+control.protocol.featureType;
  xlink += '&SRS='+control.protocol.srsName;
  xlink += '&FeatureID='+select.features[0].fid;
  var GeoJSON = new OpenLayers.Format.GeoJSON();
  try {
      var params = '<wps:Execute service="WPS" version="1.0.0" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0/../wpsExecute_request.xsd">';
      params += ' <ows:Identifier>'+aProcess+'</ows:Identifier>';
      params += ' <wps:DataInputs>';
      params += ' <wps:Input>';
      params += ' <ows:Identifier>InputEntity1</ows:Identifier>';
      params += ' <wps:Reference mimeType="text/xml" xlink:href="'+xlink.replace(/&/gi,'&')+'"/>';
      params += ' </wps:Input>';
      params += ' <wps:Input>';
      params += ' <ows:Identifier>InputEntity2</ows:Identifier>';
      params += ' <wps:Data>';
      params += ' <wps:ComplexData mimeType="application/json"> '+GeoJSON.write(hover.features[0].geometry)+' </wps:ComplexData>';
      params += ' </wps:Data>';
      params += ' </wps:Input>';
      params += ' </wps:DataInputs>';
      params += ' <wps:RawDataOutput>';
      params += ' <wps:Output mimeType="application/json">';
      params += ' <ows:Identifier>Result</ows:Identifier>';
      params += ' </wps:Output>';
      params += ' </wps:RawDataOutput>';
      params += ' </wps:Execute>';
  } catch(e) {
      alert(e);
      return false;
  }
  var request = new OpenLayers.Request.XMLHttpRequest();
  request.open('POST',url,true);
  request.setRequestHeader('Content-Type','text/xml');
  request.onreadystatechange = function() {
    if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) {
       var GeoJSON = new OpenLayers.Format.GeoJSON();
       var features = GeoJSON.read(request.responseText);
       multi.removeFeatures(multi.features);
       multi.addFeatures(features);
    }
  }
  request.send(params);
}

  </script>
 </head>
 <body onload="init()">
<h3>Single  geometry processing</h3>
<ul>
  <li>
     <input type="button" onclick="simpleProcessing(this.value);" value="Buffer" />
     <input id="bufferDist" value="1" />
  </li>
  <li>
     <input type="button" onclick="simpleProcessing(this.value);" value="ConvexHull" />
  </li>
  <li>
     <input type="button" onclick="simpleProcessing(this.value);" value="Boundary" />
  </li>
  <li>
     <input type="button" onclick="simpleProcessing(this.value);" value="Centroid" />
  </li>
</ul>
<h3>Multiple geometries processing</h3>
<ul>
  <li>
     <input type="button" onclick="multiProcessing(this.value);" value="Union"/>
  </li>
  <li>
     <input type="button" onclick="multiProcessing(this.name);" value="Difference"/>
  </li>
  <li>
     <input type="button" onclick="multiProcessing(this.value);" value="SymDifference"/>
  </li>
  <li>
     <input type="button" onclick="multiProcessing(this.name);" value="Intersection"/>
  </li>
</ul>

  <div id="map"></div>
 </body>
</html>