docs: 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;
      }