1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474 |
- ;(function(){
- /**
- * Require the given path.
- *
- * @param {String} path
- * @return {Object} exports
- * @api public
- */
- function require(path, parent, orig) {
- var resolved = require.resolve(path);
- // lookup failed
- if (null == resolved) {
- orig = orig || path;
- parent = parent || 'root';
- var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
- err.path = orig;
- err.parent = parent;
- err.require = true;
- throw err;
- }
- var module = require.modules[resolved];
- // perform real require()
- // by invoking the module's
- // registered function
- if (!module._resolving && !module.exports) {
- var mod = {};
- mod.exports = {};
- mod.client = mod.component = true;
- module._resolving = true;
- module.call(this, mod.exports, require.relative(resolved), mod);
- delete module._resolving;
- module.exports = mod.exports;
- }
- return module.exports;
- }
- /**
- * Registered modules.
- */
- require.modules = {};
- /**
- * Registered aliases.
- */
- require.aliases = {};
- /**
- * Resolve `path`.
- *
- * Lookup:
- *
- * - PATH/index.js
- * - PATH.js
- * - PATH
- *
- * @param {String} path
- * @return {String} path or null
- * @api private
- */
- require.resolve = function(path) {
- if (path.charAt(0) === '/') path = path.slice(1);
- var paths = [
- path,
- path + '.js',
- path + '.json',
- path + '/index.js',
- path + '/index.json'
- ];
- for (var i = 0; i < paths.length; i++) {
- var path = paths[i];
- if (require.modules.hasOwnProperty(path)) return path;
- if (require.aliases.hasOwnProperty(path)) return require.aliases[path];
- }
- };
- /**
- * Normalize `path` relative to the current path.
- *
- * @param {String} curr
- * @param {String} path
- * @return {String}
- * @api private
- */
- require.normalize = function(curr, path) {
- var segs = [];
- if ('.' != path.charAt(0)) return path;
- curr = curr.split('/');
- path = path.split('/');
- for (var i = 0; i < path.length; ++i) {
- if ('..' == path[i]) {
- curr.pop();
- } else if ('.' != path[i] && '' != path[i]) {
- segs.push(path[i]);
- }
- }
- return curr.concat(segs).join('/');
- };
- /**
- * Register module at `path` with callback `definition`.
- *
- * @param {String} path
- * @param {Function} definition
- * @api private
- */
- require.register = function(path, definition) {
- require.modules[path] = definition;
- };
- /**
- * Alias a module definition.
- *
- * @param {String} from
- * @param {String} to
- * @api private
- */
- require.alias = function(from, to) {
- if (!require.modules.hasOwnProperty(from)) {
- throw new Error('Failed to alias "' + from + '", it does not exist');
- }
- require.aliases[to] = from;
- };
- /**
- * Return a require function relative to the `parent` path.
- *
- * @param {String} parent
- * @return {Function}
- * @api private
- */
- require.relative = function(parent) {
- var p = require.normalize(parent, '..');
- /**
- * lastIndexOf helper.
- */
- function lastIndexOf(arr, obj) {
- var i = arr.length;
- while (i--) {
- if (arr[i] === obj) return i;
- }
- return -1;
- }
- /**
- * The relative require() itself.
- */
- function localRequire(path) {
- var resolved = localRequire.resolve(path);
- return require(resolved, parent, path);
- }
- /**
- * Resolve relative to the parent.
- */
- localRequire.resolve = function(path) {
- var c = path.charAt(0);
- if ('/' == c) return path.slice(1);
- if ('.' == c) return require.normalize(p, path);
- // resolve deps by returning
- // the dep in the nearest "deps"
- // directory
- var segs = parent.split('/');
- var i = lastIndexOf(segs, 'deps') + 1;
- if (!i) i = 0;
- path = segs.slice(0, i + 1).join('/') + '/deps/' + path;
- return path;
- };
- /**
- * Check if module is defined at `path`.
- */
- localRequire.exists = function(path) {
- return require.modules.hasOwnProperty(localRequire.resolve(path));
- };
- return localRequire;
- };
- require.register("component-classes/index.js", function(exports, require, module){
- /**
- * Module dependencies.
- */
- var index = require('indexof');
- /**
- * Whitespace regexp.
- */
- var re = /\s+/;
- /**
- * toString reference.
- */
- var toString = Object.prototype.toString;
- /**
- * Wrap `el` in a `ClassList`.
- *
- * @param {Element} el
- * @return {ClassList}
- * @api public
- */
- module.exports = function(el){
- return new ClassList(el);
- };
- /**
- * Initialize a new ClassList for `el`.
- *
- * @param {Element} el
- * @api private
- */
- function ClassList(el) {
- if (!el) throw new Error('A DOM element reference is required');
- this.el = el;
- this.list = el.classList;
- }
- /**
- * Add class `name` if not already present.
- *
- * @param {String} name
- * @return {ClassList}
- * @api public
- */
- ClassList.prototype.add = function(name){
- // classList
- if (this.list) {
- this.list.add(name);
- return this;
- }
- // fallback
- var arr = this.array();
- var i = index(arr, name);
- if (!~i) arr.push(name);
- this.el.className = arr.join(' ');
- return this;
- };
- /**
- * Remove class `name` when present, or
- * pass a regular expression to remove
- * any which match.
- *
- * @param {String|RegExp} name
- * @return {ClassList}
- * @api public
- */
- ClassList.prototype.remove = function(name){
- if ('[object RegExp]' == toString.call(name)) {
- return this.removeMatching(name);
- }
- // classList
- if (this.list) {
- this.list.remove(name);
- return this;
- }
- // fallback
- var arr = this.array();
- var i = index(arr, name);
- if (~i) arr.splice(i, 1);
- this.el.className = arr.join(' ');
- return this;
- };
- /**
- * Remove all classes matching `re`.
- *
- * @param {RegExp} re
- * @return {ClassList}
- * @api private
- */
- ClassList.prototype.removeMatching = function(re){
- var arr = this.array();
- for (var i = 0; i < arr.length; i++) {
- if (re.test(arr[i])) {
- this.remove(arr[i]);
- }
- }
- return this;
- };
- /**
- * Toggle class `name`, can force state via `force`.
- *
- * For browsers that support classList, but do not support `force` yet,
- * the mistake will be detected and corrected.
- *
- * @param {String} name
- * @param {Boolean} force
- * @return {ClassList}
- * @api public
- */
- ClassList.prototype.toggle = function(name, force){
- // classList
- if (this.list) {
- if ("undefined" !== typeof force) {
- if (force !== this.list.toggle(name, force)) {
- this.list.toggle(name); // toggle again to correct
- }
- } else {
- this.list.toggle(name);
- }
- return this;
- }
- // fallback
- if ("undefined" !== typeof force) {
- if (!force) {
- this.remove(name);
- } else {
- this.add(name);
- }
- } else {
- if (this.has(name)) {
- this.remove(name);
- } else {
- this.add(name);
- }
- }
- return this;
- };
- /**
- * Return an array of classes.
- *
- * @return {Array}
- * @api public
- */
- ClassList.prototype.array = function(){
- var str = this.el.className.replace(/^\s+|\s+$/g, '');
- var arr = str.split(re);
- if ('' === arr[0]) arr.shift();
- return arr;
- };
- /**
- * Check if class `name` is present.
- *
- * @param {String} name
- * @return {ClassList}
- * @api public
- */
- ClassList.prototype.has =
- ClassList.prototype.contains = function(name){
- return this.list
- ? this.list.contains(name)
- : !! ~index(this.array(), name);
- };
- });
- require.register("segmentio-extend/index.js", function(exports, require, module){
- module.exports = function extend (object) {
- // Takes an unlimited number of extenders.
- var args = Array.prototype.slice.call(arguments, 1);
- // For each extender, copy their properties on our object.
- for (var i = 0, source; source = args[i]; i++) {
- if (!source) continue;
- for (var property in source) {
- object[property] = source[property];
- }
- }
- return object;
- };
- });
- require.register("component-indexof/index.js", function(exports, require, module){
- module.exports = function(arr, obj){
- if (arr.indexOf) return arr.indexOf(obj);
- for (var i = 0; i < arr.length; ++i) {
- if (arr[i] === obj) return i;
- }
- return -1;
- };
- });
- require.register("component-event/index.js", function(exports, require, module){
- var bind = window.addEventListener ? 'addEventListener' : 'attachEvent',
- unbind = window.removeEventListener ? 'removeEventListener' : 'detachEvent',
- prefix = bind !== 'addEventListener' ? 'on' : '';
- /**
- * Bind `el` event `type` to `fn`.
- *
- * @param {Element} el
- * @param {String} type
- * @param {Function} fn
- * @param {Boolean} capture
- * @return {Function}
- * @api public
- */
- exports.bind = function(el, type, fn, capture){
- el[bind](prefix + type, fn, capture || false);
- return fn;
- };
- /**
- * Unbind `el` event `type`'s callback `fn`.
- *
- * @param {Element} el
- * @param {String} type
- * @param {Function} fn
- * @param {Boolean} capture
- * @return {Function}
- * @api public
- */
- exports.unbind = function(el, type, fn, capture){
- el[unbind](prefix + type, fn, capture || false);
- return fn;
- };
- });
- require.register("timoxley-to-array/index.js", function(exports, require, module){
- /**
- * Convert an array-like object into an `Array`.
- * If `collection` is already an `Array`, then will return a clone of `collection`.
- *
- * @param {Array | Mixed} collection An `Array` or array-like object to convert e.g. `arguments` or `NodeList`
- * @return {Array} Naive conversion of `collection` to a new `Array`.
- * @api public
- */
- module.exports = function toArray(collection) {
- if (typeof collection === 'undefined') return []
- if (collection === null) return [null]
- if (collection === window) return [window]
- if (typeof collection === 'string') return [collection]
- if (isArray(collection)) return collection
- if (typeof collection.length != 'number') return [collection]
- if (typeof collection === 'function' && collection instanceof Function) return [collection]
- var arr = []
- for (var i = 0; i < collection.length; i++) {
- if (Object.prototype.hasOwnProperty.call(collection, i) || i in collection) {
- arr.push(collection[i])
- }
- }
- if (!arr.length) return []
- return arr
- }
- function isArray(arr) {
- return Object.prototype.toString.call(arr) === "[object Array]";
- }
- });
- require.register("javve-events/index.js", function(exports, require, module){
- var events = require('event'),
- toArray = require('to-array');
- /**
- * Bind `el` event `type` to `fn`.
- *
- * @param {Element} el, NodeList, HTMLCollection or Array
- * @param {String} type
- * @param {Function} fn
- * @param {Boolean} capture
- * @api public
- */
- exports.bind = function(el, type, fn, capture){
- el = toArray(el);
- for ( var i = 0; i < el.length; i++ ) {
- events.bind(el[i], type, fn, capture);
- }
- };
- /**
- * Unbind `el` event `type`'s callback `fn`.
- *
- * @param {Element} el, NodeList, HTMLCollection or Array
- * @param {String} type
- * @param {Function} fn
- * @param {Boolean} capture
- * @api public
- */
- exports.unbind = function(el, type, fn, capture){
- el = toArray(el);
- for ( var i = 0; i < el.length; i++ ) {
- events.unbind(el[i], type, fn, capture);
- }
- };
- });
- require.register("javve-get-by-class/index.js", function(exports, require, module){
- /**
- * Find all elements with class `className` inside `container`.
- * Use `single = true` to increase performance in older browsers
- * when only one element is needed.
- *
- * @param {String} className
- * @param {Element} container
- * @param {Boolean} single
- * @api public
- */
- module.exports = (function() {
- if (document.getElementsByClassName) {
- return function(container, className, single) {
- if (single) {
- return container.getElementsByClassName(className)[0];
- } else {
- return container.getElementsByClassName(className);
- }
- };
- } else if (document.querySelector) {
- return function(container, className, single) {
- className = '.' + className;
- if (single) {
- return container.querySelector(className);
- } else {
- return container.querySelectorAll(className);
- }
- };
- } else {
- return function(container, className, single) {
- var classElements = [],
- tag = '*';
- if (container == null) {
- container = document;
- }
- var els = container.getElementsByTagName(tag);
- var elsLen = els.length;
- var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)");
- for (var i = 0, j = 0; i < elsLen; i++) {
- if ( pattern.test(els[i].className) ) {
- if (single) {
- return els[i];
- } else {
- classElements[j] = els[i];
- j++;
- }
- }
- }
- return classElements;
- };
- }
- })();
- });
- require.register("javve-get-attribute/index.js", function(exports, require, module){
- /**
- * Return the value for `attr` at `element`.
- *
- * @param {Element} el
- * @param {String} attr
- * @api public
- */
- module.exports = function(el, attr) {
- var result = (el.getAttribute && el.getAttribute(attr)) || null;
- if( !result ) {
- var attrs = el.attributes;
- var length = attrs.length;
- for(var i = 0; i < length; i++) {
- if (attr[i] !== undefined) {
- if(attr[i].nodeName === attr) {
- result = attr[i].nodeValue;
- }
- }
- }
- }
- return result;
- }
- });
- require.register("javve-natural-sort/index.js", function(exports, require, module){
- /*
- * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
- * Author: Jim Palmer (based on chunking idea from Dave Koelle)
- */
- module.exports = function(a, b, options) {
- var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
- sre = /(^[ ]*|[ ]*$)/g,
- dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
- hre = /^0x[0-9a-f]+$/i,
- ore = /^0/,
- options = options || {},
- i = function(s) { return options.insensitive && (''+s).toLowerCase() || ''+s },
- // convert all to strings strip whitespace
- x = i(a).replace(sre, '') || '',
- y = i(b).replace(sre, '') || '',
- // chunk/tokenize
- xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
- yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
- // numeric, hex or date detection
- xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
- yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null,
- oFxNcL, oFyNcL,
- mult = options.desc ? -1 : 1;
- // first try and sort Hex codes or Dates
- if (yD)
- if ( xD < yD ) return -1 * mult;
- else if ( xD > yD ) return 1 * mult;
- // natural sorting through split numeric strings and default strings
- for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
- // find floats not starting with '0', string or 0 if not defined (Clint Priest)
- oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
- oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
- // handle numeric vs string comparison - number < string - (Kyle Adams)
- if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; }
- // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
- else if (typeof oFxNcL !== typeof oFyNcL) {
- oFxNcL += '';
- oFyNcL += '';
- }
- if (oFxNcL < oFyNcL) return -1 * mult;
- if (oFxNcL > oFyNcL) return 1 * mult;
- }
- return 0;
- };
- /*
- var defaultSort = getSortFunction();
- module.exports = function(a, b, options) {
- if (arguments.length == 1) {
- options = a;
- return getSortFunction(options);
- } else {
- return defaultSort(a,b);
- }
- }
- */
- });
- require.register("javve-to-string/index.js", function(exports, require, module){
- module.exports = function(s) {
- s = (s === undefined) ? "" : s;
- s = (s === null) ? "" : s;
- s = s.toString();
- return s;
- };
- });
- require.register("component-type/index.js", function(exports, require, module){
- /**
- * toString ref.
- */
- var toString = Object.prototype.toString;
- /**
- * Return the type of `val`.
- *
- * @param {Mixed} val
- * @return {String}
- * @api public
- */
- module.exports = function(val){
- switch (toString.call(val)) {
- case '[object Date]': return 'date';
- case '[object RegExp]': return 'regexp';
- case '[object Arguments]': return 'arguments';
- case '[object Array]': return 'array';
- case '[object Error]': return 'error';
- }
- if (val === null) return 'null';
- if (val === undefined) return 'undefined';
- if (val !== val) return 'nan';
- if (val && val.nodeType === 1) return 'element';
- return typeof val.valueOf();
- };
- });
- require.register("list.js/index.js", function(exports, require, module){
- /*
- ListJS with beta 1.0.0
- By Jonny Strömberg (www.jonnystromberg.com, www.listjs.com)
- */
- (function( window, undefined ) {
- "use strict";
- var document = window.document,
- getByClass = require('get-by-class'),
- extend = require('extend'),
- indexOf = require('indexof');
- var List = function(id, options, values) {
- var self = this,
- init,
- Item = require('./src/item')(self),
- addAsync = require('./src/add-async')(self),
- parse = require('./src/parse')(self);
- init = {
- start: function() {
- self.listClass = "list";
- self.searchClass = "search";
- self.sortClass = "sort";
- self.page = 1024;
- self.i = 1;
- self.items = [];
- self.visibleItems = [];
- self.matchingItems = [];
- self.searched = false;
- self.filtered = false;
- self.handlers = { 'updated': [] };
- self.plugins = {};
- self.helpers = {
- getByClass: getByClass,
- extend: extend,
- indexOf: indexOf
- };
- extend(self, options);
- self.listContainer = (typeof(id) === 'string') ? document.getElementById(id) : id;
- if (!self.listContainer) { return; }
- self.list = getByClass(self.listContainer, self.listClass, true);
- self.templater = require('./src/templater')(self);
- self.search = require('./src/search')(self);
- self.filter = require('./src/filter')(self);
- self.sort = require('./src/sort')(self);
- this.items();
- self.update();
- this.plugins();
- },
- items: function() {
- parse(self.list);
- if (values !== undefined) {
- self.add(values);
- }
- },
- plugins: function() {
- for (var i = 0; i < self.plugins.length; i++) {
- var plugin = self.plugins[i];
- self[plugin.name] = plugin;
- plugin.init(self);
- }
- }
- };
- /*
- * Add object to list
- */
- this.add = function(values, callback) {
- if (callback) {
- addAsync(values, callback);
- return;
- }
- var added = [],
- notCreate = false;
- if (values[0] === undefined){
- values = [values];
- }
- for (var i = 0, il = values.length; i < il; i++) {
- var item = null;
- if (values[i] instanceof Item) {
- item = values[i];
- item.reload();
- } else {
- notCreate = (self.items.length > self.page) ? true : false;
- item = new Item(values[i], undefined, notCreate);
- }
- self.items.push(item);
- added.push(item);
- }
- self.update();
- return added;
- };
- this.show = function(i, page) {
- this.i = i;
- this.page = page;
- self.update();
- return self;
- };
- /* Removes object from list.
- * Loops through the list and removes objects where
- * property "valuename" === value
- */
- this.remove = function(valueName, value, options) {
- var found = 0;
- for (var i = 0, il = self.items.length; i < il; i++) {
- if (self.items[i].values()[valueName] == value) {
- self.templater.remove(self.items[i], options);
- self.items.splice(i,1);
- il--;
- i--;
- found++;
- }
- }
- self.update();
- return found;
- };
- /* Gets the objects in the list which
- * property "valueName" === value
- */
- this.get = function(valueName, value) {
- var matchedItems = [];
- for (var i = 0, il = self.items.length; i < il; i++) {
- var item = self.items[i];
- if (item.values()[valueName] == value) {
- matchedItems.push(item);
- }
- }
- return matchedItems;
- };
- /*
- * Get size of the list
- */
- this.size = function() {
- return self.items.length;
- };
- /*
- * Removes all items from the list
- */
- this.clear = function() {
- self.templater.clear();
- self.items = [];
- return self;
- };
- this.on = function(event, callback) {
- self.handlers[event].push(callback);
- return self;
- };
- this.off = function(event, callback) {
- var e = self.handlers[event];
- var index = indexOf(e, callback);
- if (index > -1) {
- e.splice(index, 1);
- }
- return self;
- };
- this.trigger = function(event) {
- var i = self.handlers[event].length;
- while(i--) {
- self.handlers[event][i](self);
- }
- return self;
- };
- this.reset = {
- filter: function() {
- var is = self.items,
- il = is.length;
- while (il--) {
- is[il].filtered = false;
- }
- return self;
- },
- search: function() {
- var is = self.items,
- il = is.length;
- while (il--) {
- is[il].found = false;
- }
- return self;
- }
- };
- this.update = function() {
- var is = self.items,
- il = is.length;
- self.visibleItems = [];
- self.matchingItems = [];
- self.templater.clear();
- for (var i = 0; i < il; i++) {
- if (is[i].matching() && ((self.matchingItems.length+1) >= self.i && self.visibleItems.length < self.page)) {
- is[i].show();
- self.visibleItems.push(is[i]);
- self.matchingItems.push(is[i]);
- } else if (is[i].matching()) {
- self.matchingItems.push(is[i]);
- is[i].hide();
- } else {
- is[i].hide();
- }
- }
- self.trigger('updated');
- return self;
- };
- init.start();
- };
- module.exports = List;
- })(window);
- });
- require.register("list.js/src/search.js", function(exports, require, module){
- var events = require('events'),
- getByClass = require('get-by-class'),
- toString = require('to-string');
- module.exports = function(list) {
- var item,
- text,
- columns,
- searchString,
- customSearch;
- var prepare = {
- resetList: function() {
- list.i = 1;
- list.templater.clear();
- customSearch = undefined;
- },
- setOptions: function(args) {
- if (args.length == 2 && args[1] instanceof Array) {
- columns = args[1];
- } else if (args.length == 2 && typeof(args[1]) == "function") {
- customSearch = args[1];
- } else if (args.length == 3) {
- columns = args[1];
- customSearch = args[2];
- }
- },
- setColumns: function() {
- columns = (columns === undefined) ? prepare.toArray(list.items[0].values()) : columns;
- },
- setSearchString: function(s) {
- s = toString(s).toLowerCase();
- s = s.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&"); // Escape regular expression characters
- searchString = s;
- },
- toArray: function(values) {
- var tmpColumn = [];
- for (var name in values) {
- tmpColumn.push(name);
- }
- return tmpColumn;
- }
- };
- var search = {
- list: function() {
- for (var k = 0, kl = list.items.length; k < kl; k++) {
- search.item(list.items[k]);
- }
- },
- item: function(item) {
- item.found = false;
- for (var j = 0, jl = columns.length; j < jl; j++) {
- if (search.values(item.values(), columns[j])) {
- item.found = true;
- return;
- }
- }
- },
- values: function(values, column) {
- if (values.hasOwnProperty(column)) {
- text = toString(values[column]).toLowerCase();
- if ((searchString !== "") && (text.search(searchString) > -1)) {
- return true;
- }
- }
- return false;
- },
- reset: function() {
- list.reset.search();
- list.searched = false;
- }
- };
- var searchMethod = function(str) {
- list.trigger('searchStart');
- prepare.resetList();
- prepare.setSearchString(str);
- prepare.setOptions(arguments); // str, cols|searchFunction, searchFunction
- prepare.setColumns();
- if (searchString === "" ) {
- search.reset();
- } else {
- list.searched = true;
- if (customSearch) {
- customSearch(searchString, columns);
- } else {
- search.list();
- }
- }
- list.update();
- list.trigger('searchComplete');
- return list.visibleItems;
- };
- list.handlers.searchStart = list.handlers.searchStart || [];
- list.handlers.searchComplete = list.handlers.searchComplete || [];
- events.bind(getByClass(list.listContainer, list.searchClass), 'keyup', function(e) {
- var target = e.target || e.srcElement, // IE have srcElement
- alreadyCleared = (target.value === "" && !list.searched);
- if (!alreadyCleared) { // If oninput already have resetted the list, do nothing
- searchMethod(target.value);
- }
- });
- // Used to detect click on HTML5 clear button
- events.bind(getByClass(list.listContainer, list.searchClass), 'input', function(e) {
- var target = e.target || e.srcElement;
- if (target.value === "") {
- searchMethod('');
- }
- });
- list.helpers.toString = toString;
- return searchMethod;
- };
- });
- require.register("list.js/src/sort.js", function(exports, require, module){
- var naturalSort = require('natural-sort'),
- classes = require('classes'),
- events = require('events'),
- getByClass = require('get-by-class'),
- getAttribute = require('get-attribute');
- module.exports = function(list) {
- list.sortFunction = list.sortFunction || function(itemA, itemB, options) {
- options.desc = options.order == "desc" ? true : false; // Natural sort uses this format
- return naturalSort(itemA.values()[options.valueName], itemB.values()[options.valueName], options);
- };
- var buttons = {
- els: undefined,
- clear: function() {
- for (var i = 0, il = buttons.els.length; i < il; i++) {
- classes(buttons.els[i]).remove('asc');
- classes(buttons.els[i]).remove('desc');
- }
- },
- getOrder: function(btn) {
- var predefinedOrder = getAttribute(btn, 'data-order');
- if (predefinedOrder == "asc" || predefinedOrder == "desc") {
- return predefinedOrder;
- } else if (classes(btn).has('desc')) {
- return "asc";
- } else if (classes(btn).has('asc')) {
- return "desc";
- } else {
- return "asc";
- }
- },
- getInSensitive: function(btn, options) {
- var insensitive = getAttribute(btn, 'data-insensitive');
- if (insensitive === "true") {
- options.insensitive = true;
- } else {
- options.insensitive = false;
- }
- },
- setOrder: function(options) {
- for (var i = 0, il = buttons.els.length; i < il; i++) {
- var btn = buttons.els[i];
- if (getAttribute(btn, 'data-sort') !== options.valueName) {
- continue;
- }
- var predefinedOrder = getAttribute(btn, 'data-order');
- if (predefinedOrder == "asc" || predefinedOrder == "desc") {
- if (predefinedOrder == options.order) {
- classes(btn).add(options.order);
- }
- } else {
- classes(btn).add(options.order);
- }
- }
- }
- };
- var sort = function() {
- list.trigger('sortStart');
- options = {};
- var target = arguments[0].currentTarget || arguments[0].srcElement || undefined;
- if (target) {
- options.valueName = getAttribute(target, 'data-sort');
- buttons.getInSensitive(target, options);
- options.order = buttons.getOrder(target);
- } else {
- options = arguments[1] || options;
- options.valueName = arguments[0];
- options.order = options.order || "asc";
- options.insensitive = (typeof options.insensitive == "undefined") ? true : options.insensitive;
- }
- buttons.clear();
- buttons.setOrder(options);
- options.sortFunction = options.sortFunction || list.sortFunction;
- list.items.sort(function(a, b) {
- return options.sortFunction(a, b, options);
- });
- list.update();
- list.trigger('sortComplete');
- };
- // Add handlers
- list.handlers.sortStart = list.handlers.sortStart || [];
- list.handlers.sortComplete = list.handlers.sortComplete || [];
- buttons.els = getByClass(list.listContainer, list.sortClass);
- events.bind(buttons.els, 'click', sort);
- list.on('searchStart', buttons.clear);
- list.on('filterStart', buttons.clear);
- // Helpers
- list.helpers.classes = classes;
- list.helpers.naturalSort = naturalSort;
- list.helpers.events = events;
- list.helpers.getAttribute = getAttribute;
- return sort;
- };
- });
- require.register("list.js/src/item.js", function(exports, require, module){
- module.exports = function(list) {
- return function(initValues, element, notCreate) {
- var item = this;
- this._values = {};
- this.found = false; // Show if list.searched == true and this.found == true
- this.filtered = false;// Show if list.filtered == true and this.filtered == true
- var init = function(initValues, element, notCreate) {
- if (element === undefined) {
- if (notCreate) {
- item.values(initValues, notCreate);
- } else {
- item.values(initValues);
- }
- } else {
- item.elm = element;
- var values = list.templater.get(item, initValues);
- item.values(values);
- }
- };
- this.values = function(newValues, notCreate) {
- if (newValues !== undefined) {
- for(var name in newValues) {
- item._values[name] = newValues[name];
- }
- if (notCreate !== true) {
- list.templater.set(item, item.values());
- }
- } else {
- return item._values;
- }
- };
- this.show = function() {
- list.templater.show(item);
- };
- this.hide = function() {
- list.templater.hide(item);
- };
- this.matching = function() {
- return (
- (list.filtered && list.searched && item.found && item.filtered) ||
- (list.filtered && !list.searched && item.filtered) ||
- (!list.filtered && list.searched && item.found) ||
- (!list.filtered && !list.searched)
- );
- };
- this.visible = function() {
- return (item.elm.parentNode == list.list) ? true : false;
- };
- init(initValues, element, notCreate);
- };
- };
- });
- require.register("list.js/src/templater.js", function(exports, require, module){
- var getByClass = require('get-by-class');
- var Templater = function(list) {
- var itemSource = getItemSource(list.item),
- templater = this;
- function getItemSource(item) {
- if (item === undefined) {
- var nodes = list.list.childNodes,
- items = [];
- for (var i = 0, il = nodes.length; i < il; i++) {
- // Only textnodes have a data attribute
- if (nodes[i].data === undefined) {
- return nodes[i];
- }
- }
- return null;
- } else if (item.indexOf("<") !== -1) { // Try create html element of list, do not work for tables!!
- var div = document.createElement('div');
- div.innerHTML = item;
- return div.firstChild;
- } else {
- return document.getElementById(list.item);
- }
- }
- /* Get values from element */
- this.get = function(item, valueNames) {
- templater.create(item);
- var values = {};
- for(var i = 0, il = valueNames.length; i < il; i++) {
- var elm = getByClass(item.elm, valueNames[i], true);
- values[valueNames[i]] = elm ? elm.innerHTML : "";
- }
- return values;
- };
- /* Sets values at element */
- this.set = function(item, values) {
- if (!templater.create(item)) {
- for(var v in values) {
- if (values.hasOwnProperty(v)) {
- // TODO speed up if possible
- var elm = getByClass(item.elm, v, true);
- if (elm) {
- /* src attribute for image tag & text for other tags */
- if (elm.tagName === "IMG" && values[v] !== "") {
- elm.src = values[v];
- } else {
- elm.innerHTML = values[v];
- }
- }
- }
- }
- }
- };
- this.create = function(item) {
- if (item.elm !== undefined) {
- return false;
- }
- /* If item source does not exists, use the first item in list as
- source for new items */
- var newItem = itemSource.cloneNode(true);
- newItem.removeAttribute('id');
- item.elm = newItem;
- templater.set(item, item.values());
- return true;
- };
- this.remove = function(item) {
- list.list.removeChild(item.elm);
- };
- this.show = function(item) {
- templater.create(item);
- list.list.appendChild(item.elm);
- };
- this.hide = function(item) {
- if (item.elm !== undefined && item.elm.parentNode === list.list) {
- list.list.removeChild(item.elm);
- }
- };
- this.clear = function() {
- /* .innerHTML = ''; fucks up IE */
- if (list.list.hasChildNodes()) {
- while (list.list.childNodes.length >= 1)
- {
- list.list.removeChild(list.list.firstChild);
- }
- }
- };
- };
- module.exports = function(list) {
- return new Templater(list);
- };
- });
- require.register("list.js/src/filter.js", function(exports, require, module){
- module.exports = function(list) {
- // Add handlers
- list.handlers.filterStart = list.handlers.filterStart || [];
- list.handlers.filterComplete = list.handlers.filterComplete || [];
- return function(filterFunction) {
- list.trigger('filterStart');
- list.i = 1; // Reset paging
- list.reset.filter();
- if (filterFunction === undefined) {
- list.filtered = false;
- } else {
- list.filtered = true;
- var is = list.items;
- for (var i = 0, il = is.length; i < il; i++) {
- var item = is[i];
- if (filterFunction(item)) {
- item.filtered = true;
- } else {
- item.filtered = false;
- }
- }
- }
- list.update();
- list.trigger('filterComplete');
- return list.visibleItems;
- };
- };
- });
- require.register("list.js/src/add-async.js", function(exports, require, module){
- module.exports = function(list) {
- return function(values, callback, items) {
- var valuesToAdd = values.splice(0, 100);
- items = items || [];
- items = items.concat(list.add(valuesToAdd));
- if (values.length > 0) {
- setTimeout(function() {
- addAsync(values, callback, items);
- }, 10);
- } else {
- list.update();
- callback(items);
- }
- };
- };
- });
- require.register("list.js/src/parse.js", function(exports, require, module){
- module.exports = function(list) {
- var Item = require('./item')(list);
- var getChildren = function(parent) {
- var nodes = parent.childNodes,
- items = [];
- for (var i = 0, il = nodes.length; i < il; i++) {
- // Only textnodes have a data attribute
- if (nodes[i].data === undefined) {
- items.push(nodes[i]);
- }
- }
- return items;
- };
- var parse = function(itemElements, valueNames) {
- for (var i = 0, il = itemElements.length; i < il; i++) {
- list.items.push(new Item(valueNames, itemElements[i]));
- }
- };
- var parseAsync = function(itemElements, valueNames) {
- var itemsToIndex = itemElements.splice(0, 100); // TODO: If < 100 items, what happens in IE etc?
- parse(itemsToIndex, valueNames);
- if (itemElements.length > 0) {
- setTimeout(function() {
- init.items.indexAsync(itemElements, valueNames);
- }, 10);
- } else {
- list.update();
- // TODO: Add indexed callback
- }
- };
- return function() {
- var itemsToIndex = getChildren(list.list),
- valueNames = list.valueNames;
- if (list.indexAsync) {
- parseAsync(itemsToIndex, valueNames);
- } else {
- parse(itemsToIndex, valueNames);
- }
- };
- };
- });
- require.alias("component-classes/index.js", "list.js/deps/classes/index.js");
- require.alias("component-classes/index.js", "classes/index.js");
- require.alias("component-indexof/index.js", "component-classes/deps/indexof/index.js");
- require.alias("segmentio-extend/index.js", "list.js/deps/extend/index.js");
- require.alias("segmentio-extend/index.js", "extend/index.js");
- require.alias("component-indexof/index.js", "list.js/deps/indexof/index.js");
- require.alias("component-indexof/index.js", "indexof/index.js");
- require.alias("javve-events/index.js", "list.js/deps/events/index.js");
- require.alias("javve-events/index.js", "events/index.js");
- require.alias("component-event/index.js", "javve-events/deps/event/index.js");
- require.alias("timoxley-to-array/index.js", "javve-events/deps/to-array/index.js");
- require.alias("javve-get-by-class/index.js", "list.js/deps/get-by-class/index.js");
- require.alias("javve-get-by-class/index.js", "get-by-class/index.js");
- require.alias("javve-get-attribute/index.js", "list.js/deps/get-attribute/index.js");
- require.alias("javve-get-attribute/index.js", "get-attribute/index.js");
- require.alias("javve-natural-sort/index.js", "list.js/deps/natural-sort/index.js");
- require.alias("javve-natural-sort/index.js", "natural-sort/index.js");
- require.alias("javve-to-string/index.js", "list.js/deps/to-string/index.js");
- require.alias("javve-to-string/index.js", "list.js/deps/to-string/index.js");
- require.alias("javve-to-string/index.js", "to-string/index.js");
- require.alias("javve-to-string/index.js", "javve-to-string/index.js");
- require.alias("component-type/index.js", "list.js/deps/type/index.js");
- require.alias("component-type/index.js", "type/index.js");
- if (typeof exports == "object") {
- module.exports = require("list.js");
- } else if (typeof define == "function" && define.amd) {
- define(function(){ return require("list.js"); });
- } else {
- this["List"] = require("list.js");
- }})();
|