docs: function initRepeater () {
  		// simulate network latency
  		var loadDelays = ['300', '600', '900', '1200'];
  		var sort = function (data, sortProperty, sortDirection) {
  			var sortedData = _.sortBy(data, function (item) {
  				return item[sortProperty];
  			});
  
  			// sort direction
  			if (sortDirection === 'desc') {
  				sortedData = sortedData.reverse();
  			}
  
  			return sortedData;
  		};
  
  		// list view setup
  		var list = function (options, callback) {
  			// build dataSource based with options
  			var resp = {
  				count: data.repeater.listData.length,
  				items: [],
  				page: options.pageIndex
  			};
  
  			// get start and end limits for JSON
  			var i, l;
  			resp.pages = Math.ceil(resp.count / (options.pageSize || 50));
  
  			i = options.pageIndex * (options.pageSize || 50);
  			l = i + (options.pageSize || 50);
  			l = (l <= resp.count) ? l : resp.count;
  			resp.start = i + 1;
  			resp.end = l;
  
  			// setup columns for list view
  			resp.columns = [
  				{
  					label: 'Common Name',
  					property: 'commonName',
  					sortable: true,
  					width: 600
  				},
  				{
  					label: 'Latin Name',
  					property: 'latinName',
  					sortable: true,
  					width: 600
  				},
  				{
  					label: 'Appearance',
  					property: 'appearance',
  					sortable: true
  				},
  				{
  					label: 'Sound',
  					property: 'sound',
  					sortable: true
  				}
  			];
  
  			// add sample items to datasource
  			for (i; i < l; i++) {
  				// from data.js
  				resp.items.push(data.repeater.listData[i]);
  			}
  
  			resp.items = sort(resp.items, options.sortProperty, options.sortDirection);
  
  			// call and simulate latency
  			setTimeout(function () {
  				callback(resp);
  			}, loadDelays[Math.floor(Math.random() * 4)]);
  		};
  
  
  		// thumbnail view setup
  		var thumbnail = function (options, callback) {
  			var sampleImageCategories = ['abstract', 'animals', 'business', 'cats', 'city', 'food', 'nature', 'technics', 'transport'];
  			var numItems = 200;
  
  			// build dataSource based with options
  			var resp = {
  				count: numItems,
  				items: [],
  				pages: (Math.ceil(numItems / (options.pageSize || 30))),
  				page: options.pageIndex
  			};
  
  			// get start and end limits for JSON
  			var i, l;
  			i = options.pageIndex * (options.pageSize || 30);
  			l = i + (options.pageSize || 30);
  			resp.start = i + 1;
  			resp.end = l;
  
  			// add sample items to datasource
  			for (i; i < l; i++) {
  				resp.items.push({
  					name: ('Thumbnail ' + (i + 1)),
  					src: 'http://lorempixel.com/65/65/' + sampleImageCategories[Math.floor(Math.random() * 9)] + '/?_=' + i
  				});
  			}
  
  			// call and simulate latency
  			setTimeout(function () {
  				callback(resp);
  			}, loadDelays[Math.floor(Math.random() * 4)]);
  		};
  
  		// initialize repater
  		$('#myRepeater').repeater({
  			searchOnKeyPress: true,
  			dataSource: function (options, callback) {
  				if (options.view === 'list') {
  					list(options, callback);
  				} else if (options.view === 'thumbnail') {
  					thumbnail(options, callback);
  				}
  			},
  			list_noItemsHTML: 'no items found',
  			thumbnail_noItemsHTML: 'no items found',
  			views: {
  				'list.list': {
  					dataSource: function (options, callback) {
  						list(options, callback);
  					},
  				},
  				'thumbnail': {
  					dataSource: function (options, callback) {
  						thumbnail(options, callback);
  					},
  					thumbnail_infiniteScroll: {
  						hybrid: true
  					}
  				},
  				'list.frozen': {
  					dataSource: function (options, callback) {
  						list(options, callback);
  					},
  					list_selectable: false, // (single | multi)
  					list_frozenColumns: 1
  				}
  			}
  		});
  	}