//////////////////////////////////////////////////////////////////////////////
/**
 * @module geo
 */

/*jslint devel: true, forin: true, newcap: true, plusplus: true, */
/*jslint white: true, indent: 2, continue:true*/

/*global geo, ogs, inherit, $, HTMLCanvasElement, Image*/
/*global vgl, document, gl, vec3*/
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
/**
 * Create a new instance of class featureLayer
 *
 * @class
 * @dec Layer to draw points, lines, and polygons on the map The polydata layer
 *      provide mechanisms to create and draw geometrical shapes such as points,
 *      lines, and polygons.
 * @returns {geo.featureLayer}
 */
//////////////////////////////////////////////////////////////////////////////
geo.featureLayer = function(arg) {
  "use strict";
  if (!(this instanceof geo.featureLayer)) {
    return new geo.featureLayer(arg);
  }
  geo.layer.call(this, arg);

  ////////////////////////////////////////////////////////////////////////////
  /**
   * private
   */
  ////////////////////////////////////////////////////////////////////////////
  var m_this = this,
      m_features = null,
      s_update = this._update;


  ////////////////////////////////////////////////////////////////////////////
  /**
   * Create feature
   */
  ////////////////////////////////////////////////////////////////////////////
  this.create = function(featureName) {
    return this._create(featureName);
  };

  ////////////////////////////////////////////////////////////////////////////
  /**
   * Get/Set drawables
   *
   * @returns {Array}
   */
  ////////////////////////////////////////////////////////////////////////////
  this.features = function(val) {
    return this._features(val);
  };

  ////////////////////////////////////////////////////////////////////////////
  /**
   * Get/Set drawables
   */
  ////////////////////////////////////////////////////////////////////////////
  this._features = function(val) {
    var i = 0;
    if (val === undefined) {
      return m_features;
    } else {
      m_features = val.slice(0);
      this.dataTime().modified();
      this.modified();
    }
  };

  ////////////////////////////////////////////////////////////////////////////
  /**
   * Create feature
   */
  ////////////////////////////////////////////////////////////////////////////
  this._create = function(featureName) {
    var newFeautre = geo.createFeature(
      featureName, m_this, this.renderer());

    // Default is array of fetures
    if (!m_features) {
      m_features = [];
    }

    m_features.push(newFeautre);
    this.features(m_features);
    this.modified();
    return newFeautre;
  };

  ////////////////////////////////////////////////////////////////////////////
  /**
   * Delete feature
   */
  ////////////////////////////////////////////////////////////////////////////
  this._delete = function(feature) {

    var i;

    for(i = 0; i < m_features.length; ++i) {
      if (m_features[i] === feature) {
        m_features[i]._exit();
        m_features.splice(i, 1);
        return this;
      }
    }

    return this;
  };

  ////////////////////////////////////////////////////////////////////////////
  /**
   * Update layer
   */
  ////////////////////////////////////////////////////////////////////////////
  this._update = function(request) {
    var i;

    if (!m_features) {
      return;
    }

    /// Call base class update
    s_update.call(this, request);

    if (!this.source() && m_features && m_features.length === 0) {
      console.log('[info] No valid data source found.');
      return;
    }

    if (this.dataTime().getMTime() > this.updateTime().getMTime()) {
      for (i = 0; i < m_features.length; ++i) {
          m_features[i].renderer(this.renderer());
      }
    }

    for (i = 0; i < m_features.length; ++i) {
      m_features[i]._update();
    }

    this.updateTime().modified();
  };

  ////////////////////////////////////////////////////////////////////////////
  /**
   * Draw
   */
  ////////////////////////////////////////////////////////////////////////////
  this._draw = function() {
    this.renderer()._render();
  };

  return this;
};

inherit(geo.featureLayer, geo.layer);

@@ -2125,16 +2125,22 @@
 features
+ %7C%7C %5B%5D
 ;%0A    %7D 

Make it possible to add a feature layer with no features