More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Format / Text.js
blob:a/labs/openlayers/lib/OpenLayers/Format/Text.js -> blob:b/labs/openlayers/lib/OpenLayers/Format/Text.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/Feature/Vector.js
  * @requires OpenLayers/Geometry/Point.js
  */
   
  /**
  * Class: OpenLayers.Format.Text
  * Read Text format. Create a new instance with the <OpenLayers.Format.Text>
  * constructor. This reads text which is formatted like CSV text, using
  * tabs as the seperator by default. It provides parsing of data originally
  * used in the MapViewerService, described on the wiki. This Format is used
  * by the <OpenLayers.Layer.Text> class.
  *
  * Inherits from:
  * - <OpenLayers.Format>
  */
  OpenLayers.Format.Text = OpenLayers.Class(OpenLayers.Format, {
   
  /**
  * APIProperty: defaultStyle
  * defaultStyle allows one to control the default styling of the features.
  * It should be a symbolizer hash. By default, this is set to match the
  * Layer.Text behavior, which is to use the default OpenLayers Icon.
  */
  defaultStyle: null,
   
  /**
  * APIProperty: extractStyles
  * set to true to extract styles from the TSV files, using information
  * from the image or icon, iconSize and iconOffset fields. This will result
  * in features with a symbolizer (style) property set, using the
  * default symbolizer specified in <defaultStyle>. Set to false if you
  * wish to use a styleMap or OpenLayers.Style options to style your
  * layer instead.
  */
  extractStyles: true,
   
  /**
  * Constructor: OpenLayers.Format.Text
  * Create a new parser for TSV Text.
  *
  * Parameters:
  * options - {Object} An optional object whose properties will be set on
  * this instance.
  */
  initialize: function(options) {
  options = options || {};
   
  if(options.extractStyles !== false) {
  options.defaultStyle = {
  'externalGraphic': OpenLayers.Util.getImagesLocation() +
  "marker.png",
  'graphicWidth': 21,
  'graphicHeight': 25,
  'graphicXOffset': -10.5,
  'graphicYOffset': -12.5
  };
  }
   
  OpenLayers.Format.prototype.initialize.apply(this, [options]);
  },
   
  /**
  * APIMethod: read
  * Return a list of features from a Tab Seperated Values text string.
  *
  * Parameters:
  * data - {String}
  *
  * Returns:
  * An Array of <OpenLayers.Feature.Vector>s
  */
  read: function(text) {
  var lines = text.split('\n');
  var columns;
  var features = [];
  // 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 geometry = new OpenLayers.Geometry.Point(0,0);
  var attributes = {};
  var style = this.defaultStyle ?
  OpenLayers.Util.applyDefaults({}, this.defaultStyle) :
  null;
  var icon, iconSize, iconOffset, overflow;
  var set = false;
  for (var valIndex = 0; valIndex < vals.length; valIndex++) {
  if (vals[valIndex]) {
  if (columns[valIndex] == 'point') {
  var coords = vals[valIndex].split(',');
  geometry.y = parseFloat(coords[0]);
  geometry.x = parseFloat(coords[1]);
  set = true;
  } else if (columns[valIndex] == 'lat') {
  geometry.y = parseFloat(vals[valIndex]);
  set = true;
  } else if (columns[valIndex] == 'lon') {
  geometry.x = parseFloat(vals[valIndex]);
  set = true;
  } else if (columns[valIndex] == 'title')
  attributes['title'] = vals[valIndex];
  else if (columns[valIndex] == 'image' ||
  columns[valIndex] == 'icon' && style) {
  style['externalGraphic'] = vals[valIndex];
  } else if (columns[valIndex] == 'iconSize' && style) {
  var size = vals[valIndex].split(',');
  style['graphicWidth'] = parseFloat(size[0]);
  style['graphicHeight'] = parseFloat(size[1]);
  } else if (columns[valIndex] == 'iconOffset' && style) {
  var offset = vals[valIndex].split(',');
  style['graphicXOffset'] = parseFloat(offset[0]);
  style['graphicYOffset'] = parseFloat(offset[1]);
  } else if (columns[valIndex] == 'description') {
  attributes['description'] = vals[valIndex];
  } else if (columns[valIndex] == 'overflow') {
  attributes['overflow'] = vals[valIndex];
  } else {
  // For StyleMap filtering, allow additional
  // columns to be stored as attributes.
  attributes[columns[valIndex]] = vals[valIndex];
  }
  }
  }
  if (set) {
  if (this.internalProjection && this.externalProjection) {
  geometry.transform(this.externalProjection,
  this.internalProjection);
  }
  var feature = new OpenLayers.Feature.Vector(geometry, attributes, style);
  features.push(feature);
  }
  }
  }
  }
  return features;
  },
   
  CLASS_NAME: "OpenLayers.Format.Text"
  });