More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Format / WFS.js
blob:a/labs/openlayers/lib/OpenLayers/Format/WFS.js -> blob:b/labs/openlayers/lib/OpenLayers/Format/WFS.js
  /* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for
  * full list of contributors). Published under the Clear BSD license.
  * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
   
  /**
  * @requires OpenLayers/Format/GML.js
  * @requires OpenLayers/Console.js
  */
   
  /**
  * Class: OpenLayers.Format.WFS
  * Read/Write WFS.
  *
  * Inherits from:
  * - <OpenLayers.Format.GML>
  */
  OpenLayers.Format.WFS = OpenLayers.Class(OpenLayers.Format.GML, {
   
  /**
  * Property: layer
  */
  layer: null,
   
  /**
  * APIProperty: wfsns
  */
  wfsns: "http://www.opengis.net/wfs",
   
  /**
  * Property: ogcns
  */
  ogcns: "http://www.opengis.net/ogc",
   
  /*
  * Constructor: OpenLayers.Format.WFS
  * Create a WFS-T formatter. This requires a layer: that layer should
  * have two properties: geometry_column and typename. The parser
  * for this format is subclassed entirely from GML: There is a writer
  * only, which uses most of the code from the GML layer, and wraps
  * it in transactional elements.
  *
  * Parameters:
  * options - {Object}
  * layer - {<OpenLayers.Layer>}
  */
   
  initialize: function(options, layer) {
  OpenLayers.Format.GML.prototype.initialize.apply(this, [options]);
  this.layer = layer;
  if (this.layer.featureNS) {
  this.featureNS = this.layer.featureNS;
  }
  if (this.layer.options.geometry_column) {
  this.geometryName = this.layer.options.geometry_column;
  }
  if (this.layer.options.typename) {
  this.featureName = this.layer.options.typename;
  }
  },
   
  /**
  * Method: write
  * Takes a feature list, and generates a WFS-T Transaction
  *
  * Parameters:
  * features - {Array(<OpenLayers.Feature.Vector>)}
  */
  write: function(features) {
   
  var transaction = this.createElementNS(this.wfsns, 'wfs:Transaction');
  transaction.setAttribute("version","1.0.0");
  transaction.setAttribute("service","WFS");
  for (var i=0; i < features.length; i++) {
  switch (features[i].state) {
  case OpenLayers.State.INSERT:
  transaction.appendChild(this.insert(features[i]));
  break;
  case OpenLayers.State.UPDATE:
  transaction.appendChild(this.update(features[i]));
  break;
  case OpenLayers.State.DELETE:
  transaction.appendChild(this.remove(features[i]));
  break;
  }
  }
   
  return OpenLayers.Format.XML.prototype.write.apply(this,[transaction]);
  },
   
  /**
  * Method: createFeatureXML
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>}
  */
  createFeatureXML: function(feature) {
  var geometryNode = this.buildGeometryNode(feature.geometry);
  var geomContainer = this.createElementNS(this.featureNS, "feature:" + this.geometryName);
  geomContainer.appendChild(geometryNode);
  var featureContainer = this.createElementNS(this.featureNS, "feature:" + this.featureName);
  featureContainer.appendChild(geomContainer);
  for(var attr in feature.attributes) {
  var attrText = this.createTextNode(feature.attributes[attr]);
  var nodename = attr;
  if (attr.search(":") != -1) {
  nodename = attr.split(":")[1];
  }
  var attrContainer = this.createElementNS(this.featureNS, "feature:" + nodename);
  attrContainer.appendChild(attrText);
  featureContainer.appendChild(attrContainer);
  }
  return featureContainer;
  },
   
  /**
  * Method: insert
  * Takes a feature, and generates a WFS-T Transaction "Insert"
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>}
  */
  insert: function(feature) {
  var insertNode = this.createElementNS(this.wfsns, 'wfs:Insert');
  insertNode.appendChild(this.createFeatureXML(feature));
  return insertNode;
  },
   
  /**
  * Method: update
  * Takes a feature, and generates a WFS-T Transaction "Update"
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>}
  */
  update: function(feature) {
  if (!feature.fid) { OpenLayers.Console.userError(OpenLayers.i18n("noFID")); }
  var updateNode = this.createElementNS(this.wfsns, 'wfs:Update');
  updateNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName);
  updateNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
   
  var propertyNode = this.createElementNS(this.wfsns, 'wfs:Property');
  var nameNode = this.createElementNS(this.wfsns, 'wfs:Name');
   
  var txtNode = this.createTextNode(this.geometryName);
  nameNode.appendChild(txtNode);
  propertyNode.appendChild(nameNode);
   
  var valueNode = this.createElementNS(this.wfsns, 'wfs:Value');
   
  var geometryNode = this.buildGeometryNode(feature.geometry);
   
  if(feature.layer){
  geometryNode.setAttribute(
  "srsName", feature.layer.projection.getCode()
  );
  }
   
  valueNode.appendChild(geometryNode);
   
  propertyNode.appendChild(valueNode);
  updateNode.appendChild(propertyNode);
   
  // add in attributes
  for(var propName in feature.attributes) {
  propertyNode = this.createElementNS(this.wfsns, 'wfs:Property');
  nameNode = this.createElementNS(this.wfsns, 'wfs:Name');
  nameNode.appendChild(this.createTextNode(propName));
  propertyNode.appendChild(nameNode);
  valueNode = this.createElementNS(this.wfsns, 'wfs:Value');
  valueNode.appendChild(this.createTextNode(feature.attributes[propName]));
  propertyNode.appendChild(valueNode);
  updateNode.appendChild(propertyNode);
  }
   
   
  var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter');
  var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId');
  filterIdNode.setAttribute("fid", feature.fid);
  filterNode.appendChild(filterIdNode);
  updateNode.appendChild(filterNode);
   
  return updateNode;
  },
   
  /**
  * Method: remove
  * Takes a feature, and generates a WFS-T Transaction "Delete"
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>}
  */
  remove: function(feature) {
  if (!feature.fid) {
  OpenLayers.Console.userError(OpenLayers.i18n("noFID"));
  return false;
  }
  var deleteNode = this.createElementNS(this.wfsns, 'wfs:Delete');
  deleteNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName);
  deleteNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
   
  var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter');
  var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId');
  filterIdNode.setAttribute("fid", feature.fid);
  filterNode.appendChild(filterIdNode);
  deleteNode.appendChild(filterNode);
   
  return deleteNode;
  },
   
  /**
  * APIMethod: destroy
  * Remove ciruclar ref to layer
  */
  destroy: function() {
  this.layer = null;
  },
   
  CLASS_NAME: "OpenLayers.Format.WFS"
  });