--- /dev/null
+/*
+ * Fuel UX Data components - static data source
+ * https://github.com/ExactTarget/fuelux-data
+ *
+ * Copyright (c) 2012 ExactTarget
+ * Licensed under the MIT license.
+ */
+
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define(['underscore'], factory);
+ } else {
+ root.StaticDataSource = factory();
+ }
+}(this, function () {
+
+ var StaticDataSource = function (options) {
+ this._formatter = options.formatter;
+ this._columns = options.columns;
+ this._delay = options.delay || 0;
+ this._data = options.data;
+ };
+
+ StaticDataSource.prototype = {
+
+ columns: function () {
+ return this._columns;
+ },
+
+ data: function (options, callback) {
+ var self = this;
+
+ setTimeout(function () {
+ var data = $.extend(true, [], self._data);
+
+ // SEARCHING
+ if (options.search) {
+ data = _.filter(data, function (item) {
+ var match = false;
+
+ _.each(item, function (prop) {
+ if (_.isString(prop) || _.isFinite(prop)) {
+ if (prop.toString().toLowerCase().indexOf(options.search.toLowerCase()) !== -1) match = true;
+ }
+ });
+
+ return match;
+ });
+ }
+
+ // FILTERING
+ if (options.filter) {
+ data = _.filter(data, function (item) {
+ switch(options.filter.value) {
+ case 'lt5m':
+ if(item.population < 5000000) return true;
+ break;
+ case 'gte5m':
+ if(item.population >= 5000000) return true;
+ break;
+ default:
+ return true;
+ break;
+ }
+ });
+ }
+
+ var count = data.length;
+
+ // SORTING
+ if (options.sortProperty) {
+ data = _.sortBy(data, options.sortProperty);
+ if (options.sortDirection === 'desc') data.reverse();
+ }
+
+ // PAGING
+ var startIndex = options.pageIndex * options.pageSize;
+ var endIndex = startIndex + options.pageSize;
+ var end = (endIndex > count) ? count : endIndex;
+ var pages = Math.ceil(count / options.pageSize);
+ var page = options.pageIndex + 1;
+ var start = startIndex + 1;
+
+ data = data.slice(startIndex, endIndex);
+
+ if (self._formatter) self._formatter(data);
+
+ callback({ data: data, start: start, end: end, count: count, pages: pages, page: page });
+
+ }, this._delay)
+ }
+ };
+
+ return StaticDataSource;
+}));