More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Strategy / Paging.js
blob:a/labs/openlayers/lib/OpenLayers/Strategy/Paging.js -> blob:b/labs/openlayers/lib/OpenLayers/Strategy/Paging.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/Strategy.js
  */
   
  /**
  * Class: OpenLayers.Strategy.Paging
  * Strategy for vector feature paging
  *
  * Inherits from:
  * - <OpenLayers.Strategy>
  */
  OpenLayers.Strategy.Paging = OpenLayers.Class(OpenLayers.Strategy, {
   
  /**
  * Property: features
  * {Array(<OpenLayers.Feature.Vector>)} Cached features.
  */
  features: null,
   
  /**
  * Property: length
  * {Integer} Number of features per page. Default is 10.
  */
  length: 10,
   
  /**
  * Property: num
  * {Integer} The currently displayed page number.
  */
  num: null,
   
  /**
  * Property: paging
  * {Boolean} The strategy is currently changing pages.
  */
  paging: false,
   
  /**
  * Constructor: OpenLayers.Strategy.Paging
  * Create a new paging strategy.
  *
  * Parameters:
  * options - {Object} Optional object whose properties will be set on the
  * instance.
  */
  initialize: function(options) {
  OpenLayers.Strategy.prototype.initialize.apply(this, [options]);
  },
   
  /**
  * APIMethod: activate
  * Activate the strategy. Register any listeners, do appropriate setup.
  *
  * Returns:
  * {Boolean} The strategy was successfully activated.
  */
  activate: function() {
  var activated = OpenLayers.Strategy.prototype.activate.call(this);
  if(activated) {
  this.layer.events.on({
  "beforefeaturesadded": this.cacheFeatures,
  scope: this
  });
  }
  return activated;
  },
   
  /**
  * APIMethod: deactivate
  * Deactivate the strategy. Unregister any listeners, do appropriate
  * tear-down.
  *
  * Returns:
  * {Boolean} The strategy was successfully deactivated.
  */
  deactivate: function() {
  var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this);
  if(deactivated) {
  this.clearCache();
  this.layer.events.un({
  "beforefeaturesadded": this.cacheFeatures,
  scope: this
  });
  }
  return deactivated;
  },
   
  /**
  * Method: cacheFeatures
  * Cache features before they are added to the layer.
  *
  * Parameters:
  * event - {Object} The event that this was listening for. This will come
  * with a batch of features to be paged.
  */
  cacheFeatures: function(event) {
  if(!this.paging) {
  this.clearCache();
  this.features = event.features;
  this.pageNext(event);
  }
  },
   
  /**
  * Method: clearCache
  * Clear out the cached features. This destroys features, assuming
  * nothing else has a reference.
  */
  clearCache: function() {
  if(this.features) {
  for(var i=0; i<this.features.length; ++i) {
  this.features[i].destroy();
  }
  }
  this.features = null;
  this.num = null;
  },
   
  /**
  * APIMethod: pageCount
  * Get the total count of pages given the current cache of features.
  *
  * Returns:
  * {Integer} The page count.
  */
  pageCount: function() {
  var numFeatures = this.features ? this.features.length : 0;
  return Math.ceil(numFeatures / this.length);
  },
   
  /**
  * APIMethod: pageNum
  * Get the zero based page number.
  *
  * Returns:
  * {Integer} The current page number being displayed.
  */
  pageNum: function() {
  return this.num;
  },
   
  /**
  * APIMethod: pageLength
  * Gets or sets page length.
  *
  * Parameters:
  * newLength: {Integer} Optional length to be set.
  *
  * Returns:
  * {Integer} The length of a page (number of features per page).
  */
  pageLength: function(newLength) {
  if(newLength && newLength > 0) {
  this.length = newLength;
  }
  return this.length;
  },
   
  /**
  * APIMethod: pageNext
  * Display the next page of features.
  *
  * Returns:
  * {Boolean} A new page was displayed.
  */
  pageNext: function(event) {
  var changed = false;
  if(this.features) {
  if(this.num === null) {
  this.num = -1;
  }
  var start = (this.num + 1) * this.length;
  changed = this.page(start, event);
  }
  return changed;
  },
   
  /**
  * APIMethod: pagePrevious
  * Display the previous page of features.
  *
  * Returns:
  * {Boolean} A new page was displayed.
  */
  pagePrevious: function() {
  var changed = false;
  if(this.features) {
  if(this.num === null) {
  this.num = this.pageCount();
  }
  var start = (this.num - 1) * this.length;
  changed = this.page(start);
  }
  return changed;
  },
   
  /**
  * Method: page
  * Display the page starting at the given index from the cache.
  *
  * Returns:
  * {Boolean} A new page was displayed.
  */
  page: function(start, event) {
  var changed = false;
  if(this.features) {
  if(start >= 0 && start < this.features.length) {
  var num = Math.floor(start / this.length);
  if(num != this.num) {
  this.paging = true;
  var features = this.features.slice(start, start + this.length);
  this.layer.removeFeatures(this.layer.features);
  this.num = num;
  // modify the event if any
  if(event && event.features) {
  // this.was called by an event listener
  event.features = features;
  } else {
  // this was called directly on the strategy
  this.layer.addFeatures(features);
  }
  this.paging = false;
  changed = true;
  }
  }
  }
  return changed;
  },
   
  CLASS_NAME: "OpenLayers.Strategy.Paging"
  });