list.js 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474
  1. ;(function(){
  2. /**
  3. * Require the given path.
  4. *
  5. * @param {String} path
  6. * @return {Object} exports
  7. * @api public
  8. */
  9. function require(path, parent, orig) {
  10. var resolved = require.resolve(path);
  11. // lookup failed
  12. if (null == resolved) {
  13. orig = orig || path;
  14. parent = parent || 'root';
  15. var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
  16. err.path = orig;
  17. err.parent = parent;
  18. err.require = true;
  19. throw err;
  20. }
  21. var module = require.modules[resolved];
  22. // perform real require()
  23. // by invoking the module's
  24. // registered function
  25. if (!module._resolving && !module.exports) {
  26. var mod = {};
  27. mod.exports = {};
  28. mod.client = mod.component = true;
  29. module._resolving = true;
  30. module.call(this, mod.exports, require.relative(resolved), mod);
  31. delete module._resolving;
  32. module.exports = mod.exports;
  33. }
  34. return module.exports;
  35. }
  36. /**
  37. * Registered modules.
  38. */
  39. require.modules = {};
  40. /**
  41. * Registered aliases.
  42. */
  43. require.aliases = {};
  44. /**
  45. * Resolve `path`.
  46. *
  47. * Lookup:
  48. *
  49. * - PATH/index.js
  50. * - PATH.js
  51. * - PATH
  52. *
  53. * @param {String} path
  54. * @return {String} path or null
  55. * @api private
  56. */
  57. require.resolve = function(path) {
  58. if (path.charAt(0) === '/') path = path.slice(1);
  59. var paths = [
  60. path,
  61. path + '.js',
  62. path + '.json',
  63. path + '/index.js',
  64. path + '/index.json'
  65. ];
  66. for (var i = 0; i < paths.length; i++) {
  67. var path = paths[i];
  68. if (require.modules.hasOwnProperty(path)) return path;
  69. if (require.aliases.hasOwnProperty(path)) return require.aliases[path];
  70. }
  71. };
  72. /**
  73. * Normalize `path` relative to the current path.
  74. *
  75. * @param {String} curr
  76. * @param {String} path
  77. * @return {String}
  78. * @api private
  79. */
  80. require.normalize = function(curr, path) {
  81. var segs = [];
  82. if ('.' != path.charAt(0)) return path;
  83. curr = curr.split('/');
  84. path = path.split('/');
  85. for (var i = 0; i < path.length; ++i) {
  86. if ('..' == path[i]) {
  87. curr.pop();
  88. } else if ('.' != path[i] && '' != path[i]) {
  89. segs.push(path[i]);
  90. }
  91. }
  92. return curr.concat(segs).join('/');
  93. };
  94. /**
  95. * Register module at `path` with callback `definition`.
  96. *
  97. * @param {String} path
  98. * @param {Function} definition
  99. * @api private
  100. */
  101. require.register = function(path, definition) {
  102. require.modules[path] = definition;
  103. };
  104. /**
  105. * Alias a module definition.
  106. *
  107. * @param {String} from
  108. * @param {String} to
  109. * @api private
  110. */
  111. require.alias = function(from, to) {
  112. if (!require.modules.hasOwnProperty(from)) {
  113. throw new Error('Failed to alias "' + from + '", it does not exist');
  114. }
  115. require.aliases[to] = from;
  116. };
  117. /**
  118. * Return a require function relative to the `parent` path.
  119. *
  120. * @param {String} parent
  121. * @return {Function}
  122. * @api private
  123. */
  124. require.relative = function(parent) {
  125. var p = require.normalize(parent, '..');
  126. /**
  127. * lastIndexOf helper.
  128. */
  129. function lastIndexOf(arr, obj) {
  130. var i = arr.length;
  131. while (i--) {
  132. if (arr[i] === obj) return i;
  133. }
  134. return -1;
  135. }
  136. /**
  137. * The relative require() itself.
  138. */
  139. function localRequire(path) {
  140. var resolved = localRequire.resolve(path);
  141. return require(resolved, parent, path);
  142. }
  143. /**
  144. * Resolve relative to the parent.
  145. */
  146. localRequire.resolve = function(path) {
  147. var c = path.charAt(0);
  148. if ('/' == c) return path.slice(1);
  149. if ('.' == c) return require.normalize(p, path);
  150. // resolve deps by returning
  151. // the dep in the nearest "deps"
  152. // directory
  153. var segs = parent.split('/');
  154. var i = lastIndexOf(segs, 'deps') + 1;
  155. if (!i) i = 0;
  156. path = segs.slice(0, i + 1).join('/') + '/deps/' + path;
  157. return path;
  158. };
  159. /**
  160. * Check if module is defined at `path`.
  161. */
  162. localRequire.exists = function(path) {
  163. return require.modules.hasOwnProperty(localRequire.resolve(path));
  164. };
  165. return localRequire;
  166. };
  167. require.register("component-classes/index.js", function(exports, require, module){
  168. /**
  169. * Module dependencies.
  170. */
  171. var index = require('indexof');
  172. /**
  173. * Whitespace regexp.
  174. */
  175. var re = /\s+/;
  176. /**
  177. * toString reference.
  178. */
  179. var toString = Object.prototype.toString;
  180. /**
  181. * Wrap `el` in a `ClassList`.
  182. *
  183. * @param {Element} el
  184. * @return {ClassList}
  185. * @api public
  186. */
  187. module.exports = function(el){
  188. return new ClassList(el);
  189. };
  190. /**
  191. * Initialize a new ClassList for `el`.
  192. *
  193. * @param {Element} el
  194. * @api private
  195. */
  196. function ClassList(el) {
  197. if (!el) throw new Error('A DOM element reference is required');
  198. this.el = el;
  199. this.list = el.classList;
  200. }
  201. /**
  202. * Add class `name` if not already present.
  203. *
  204. * @param {String} name
  205. * @return {ClassList}
  206. * @api public
  207. */
  208. ClassList.prototype.add = function(name){
  209. // classList
  210. if (this.list) {
  211. this.list.add(name);
  212. return this;
  213. }
  214. // fallback
  215. var arr = this.array();
  216. var i = index(arr, name);
  217. if (!~i) arr.push(name);
  218. this.el.className = arr.join(' ');
  219. return this;
  220. };
  221. /**
  222. * Remove class `name` when present, or
  223. * pass a regular expression to remove
  224. * any which match.
  225. *
  226. * @param {String|RegExp} name
  227. * @return {ClassList}
  228. * @api public
  229. */
  230. ClassList.prototype.remove = function(name){
  231. if ('[object RegExp]' == toString.call(name)) {
  232. return this.removeMatching(name);
  233. }
  234. // classList
  235. if (this.list) {
  236. this.list.remove(name);
  237. return this;
  238. }
  239. // fallback
  240. var arr = this.array();
  241. var i = index(arr, name);
  242. if (~i) arr.splice(i, 1);
  243. this.el.className = arr.join(' ');
  244. return this;
  245. };
  246. /**
  247. * Remove all classes matching `re`.
  248. *
  249. * @param {RegExp} re
  250. * @return {ClassList}
  251. * @api private
  252. */
  253. ClassList.prototype.removeMatching = function(re){
  254. var arr = this.array();
  255. for (var i = 0; i < arr.length; i++) {
  256. if (re.test(arr[i])) {
  257. this.remove(arr[i]);
  258. }
  259. }
  260. return this;
  261. };
  262. /**
  263. * Toggle class `name`, can force state via `force`.
  264. *
  265. * For browsers that support classList, but do not support `force` yet,
  266. * the mistake will be detected and corrected.
  267. *
  268. * @param {String} name
  269. * @param {Boolean} force
  270. * @return {ClassList}
  271. * @api public
  272. */
  273. ClassList.prototype.toggle = function(name, force){
  274. // classList
  275. if (this.list) {
  276. if ("undefined" !== typeof force) {
  277. if (force !== this.list.toggle(name, force)) {
  278. this.list.toggle(name); // toggle again to correct
  279. }
  280. } else {
  281. this.list.toggle(name);
  282. }
  283. return this;
  284. }
  285. // fallback
  286. if ("undefined" !== typeof force) {
  287. if (!force) {
  288. this.remove(name);
  289. } else {
  290. this.add(name);
  291. }
  292. } else {
  293. if (this.has(name)) {
  294. this.remove(name);
  295. } else {
  296. this.add(name);
  297. }
  298. }
  299. return this;
  300. };
  301. /**
  302. * Return an array of classes.
  303. *
  304. * @return {Array}
  305. * @api public
  306. */
  307. ClassList.prototype.array = function(){
  308. var str = this.el.className.replace(/^\s+|\s+$/g, '');
  309. var arr = str.split(re);
  310. if ('' === arr[0]) arr.shift();
  311. return arr;
  312. };
  313. /**
  314. * Check if class `name` is present.
  315. *
  316. * @param {String} name
  317. * @return {ClassList}
  318. * @api public
  319. */
  320. ClassList.prototype.has =
  321. ClassList.prototype.contains = function(name){
  322. return this.list
  323. ? this.list.contains(name)
  324. : !! ~index(this.array(), name);
  325. };
  326. });
  327. require.register("segmentio-extend/index.js", function(exports, require, module){
  328. module.exports = function extend (object) {
  329. // Takes an unlimited number of extenders.
  330. var args = Array.prototype.slice.call(arguments, 1);
  331. // For each extender, copy their properties on our object.
  332. for (var i = 0, source; source = args[i]; i++) {
  333. if (!source) continue;
  334. for (var property in source) {
  335. object[property] = source[property];
  336. }
  337. }
  338. return object;
  339. };
  340. });
  341. require.register("component-indexof/index.js", function(exports, require, module){
  342. module.exports = function(arr, obj){
  343. if (arr.indexOf) return arr.indexOf(obj);
  344. for (var i = 0; i < arr.length; ++i) {
  345. if (arr[i] === obj) return i;
  346. }
  347. return -1;
  348. };
  349. });
  350. require.register("component-event/index.js", function(exports, require, module){
  351. var bind = window.addEventListener ? 'addEventListener' : 'attachEvent',
  352. unbind = window.removeEventListener ? 'removeEventListener' : 'detachEvent',
  353. prefix = bind !== 'addEventListener' ? 'on' : '';
  354. /**
  355. * Bind `el` event `type` to `fn`.
  356. *
  357. * @param {Element} el
  358. * @param {String} type
  359. * @param {Function} fn
  360. * @param {Boolean} capture
  361. * @return {Function}
  362. * @api public
  363. */
  364. exports.bind = function(el, type, fn, capture){
  365. el[bind](prefix + type, fn, capture || false);
  366. return fn;
  367. };
  368. /**
  369. * Unbind `el` event `type`'s callback `fn`.
  370. *
  371. * @param {Element} el
  372. * @param {String} type
  373. * @param {Function} fn
  374. * @param {Boolean} capture
  375. * @return {Function}
  376. * @api public
  377. */
  378. exports.unbind = function(el, type, fn, capture){
  379. el[unbind](prefix + type, fn, capture || false);
  380. return fn;
  381. };
  382. });
  383. require.register("timoxley-to-array/index.js", function(exports, require, module){
  384. /**
  385. * Convert an array-like object into an `Array`.
  386. * If `collection` is already an `Array`, then will return a clone of `collection`.
  387. *
  388. * @param {Array | Mixed} collection An `Array` or array-like object to convert e.g. `arguments` or `NodeList`
  389. * @return {Array} Naive conversion of `collection` to a new `Array`.
  390. * @api public
  391. */
  392. module.exports = function toArray(collection) {
  393. if (typeof collection === 'undefined') return []
  394. if (collection === null) return [null]
  395. if (collection === window) return [window]
  396. if (typeof collection === 'string') return [collection]
  397. if (isArray(collection)) return collection
  398. if (typeof collection.length != 'number') return [collection]
  399. if (typeof collection === 'function' && collection instanceof Function) return [collection]
  400. var arr = []
  401. for (var i = 0; i < collection.length; i++) {
  402. if (Object.prototype.hasOwnProperty.call(collection, i) || i in collection) {
  403. arr.push(collection[i])
  404. }
  405. }
  406. if (!arr.length) return []
  407. return arr
  408. }
  409. function isArray(arr) {
  410. return Object.prototype.toString.call(arr) === "[object Array]";
  411. }
  412. });
  413. require.register("javve-events/index.js", function(exports, require, module){
  414. var events = require('event'),
  415. toArray = require('to-array');
  416. /**
  417. * Bind `el` event `type` to `fn`.
  418. *
  419. * @param {Element} el, NodeList, HTMLCollection or Array
  420. * @param {String} type
  421. * @param {Function} fn
  422. * @param {Boolean} capture
  423. * @api public
  424. */
  425. exports.bind = function(el, type, fn, capture){
  426. el = toArray(el);
  427. for ( var i = 0; i < el.length; i++ ) {
  428. events.bind(el[i], type, fn, capture);
  429. }
  430. };
  431. /**
  432. * Unbind `el` event `type`'s callback `fn`.
  433. *
  434. * @param {Element} el, NodeList, HTMLCollection or Array
  435. * @param {String} type
  436. * @param {Function} fn
  437. * @param {Boolean} capture
  438. * @api public
  439. */
  440. exports.unbind = function(el, type, fn, capture){
  441. el = toArray(el);
  442. for ( var i = 0; i < el.length; i++ ) {
  443. events.unbind(el[i], type, fn, capture);
  444. }
  445. };
  446. });
  447. require.register("javve-get-by-class/index.js", function(exports, require, module){
  448. /**
  449. * Find all elements with class `className` inside `container`.
  450. * Use `single = true` to increase performance in older browsers
  451. * when only one element is needed.
  452. *
  453. * @param {String} className
  454. * @param {Element} container
  455. * @param {Boolean} single
  456. * @api public
  457. */
  458. module.exports = (function() {
  459. if (document.getElementsByClassName) {
  460. return function(container, className, single) {
  461. if (single) {
  462. return container.getElementsByClassName(className)[0];
  463. } else {
  464. return container.getElementsByClassName(className);
  465. }
  466. };
  467. } else if (document.querySelector) {
  468. return function(container, className, single) {
  469. className = '.' + className;
  470. if (single) {
  471. return container.querySelector(className);
  472. } else {
  473. return container.querySelectorAll(className);
  474. }
  475. };
  476. } else {
  477. return function(container, className, single) {
  478. var classElements = [],
  479. tag = '*';
  480. if (container == null) {
  481. container = document;
  482. }
  483. var els = container.getElementsByTagName(tag);
  484. var elsLen = els.length;
  485. var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)");
  486. for (var i = 0, j = 0; i < elsLen; i++) {
  487. if ( pattern.test(els[i].className) ) {
  488. if (single) {
  489. return els[i];
  490. } else {
  491. classElements[j] = els[i];
  492. j++;
  493. }
  494. }
  495. }
  496. return classElements;
  497. };
  498. }
  499. })();
  500. });
  501. require.register("javve-get-attribute/index.js", function(exports, require, module){
  502. /**
  503. * Return the value for `attr` at `element`.
  504. *
  505. * @param {Element} el
  506. * @param {String} attr
  507. * @api public
  508. */
  509. module.exports = function(el, attr) {
  510. var result = (el.getAttribute && el.getAttribute(attr)) || null;
  511. if( !result ) {
  512. var attrs = el.attributes;
  513. var length = attrs.length;
  514. for(var i = 0; i < length; i++) {
  515. if (attr[i] !== undefined) {
  516. if(attr[i].nodeName === attr) {
  517. result = attr[i].nodeValue;
  518. }
  519. }
  520. }
  521. }
  522. return result;
  523. }
  524. });
  525. require.register("javve-natural-sort/index.js", function(exports, require, module){
  526. /*
  527. * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
  528. * Author: Jim Palmer (based on chunking idea from Dave Koelle)
  529. */
  530. module.exports = function(a, b, options) {
  531. var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
  532. sre = /(^[ ]*|[ ]*$)/g,
  533. dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
  534. hre = /^0x[0-9a-f]+$/i,
  535. ore = /^0/,
  536. options = options || {},
  537. i = function(s) { return options.insensitive && (''+s).toLowerCase() || ''+s },
  538. // convert all to strings strip whitespace
  539. x = i(a).replace(sre, '') || '',
  540. y = i(b).replace(sre, '') || '',
  541. // chunk/tokenize
  542. xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
  543. yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
  544. // numeric, hex or date detection
  545. xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
  546. yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null,
  547. oFxNcL, oFyNcL,
  548. mult = options.desc ? -1 : 1;
  549. // first try and sort Hex codes or Dates
  550. if (yD)
  551. if ( xD < yD ) return -1 * mult;
  552. else if ( xD > yD ) return 1 * mult;
  553. // natural sorting through split numeric strings and default strings
  554. for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
  555. // find floats not starting with '0', string or 0 if not defined (Clint Priest)
  556. oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
  557. oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
  558. // handle numeric vs string comparison - number < string - (Kyle Adams)
  559. if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; }
  560. // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
  561. else if (typeof oFxNcL !== typeof oFyNcL) {
  562. oFxNcL += '';
  563. oFyNcL += '';
  564. }
  565. if (oFxNcL < oFyNcL) return -1 * mult;
  566. if (oFxNcL > oFyNcL) return 1 * mult;
  567. }
  568. return 0;
  569. };
  570. /*
  571. var defaultSort = getSortFunction();
  572. module.exports = function(a, b, options) {
  573. if (arguments.length == 1) {
  574. options = a;
  575. return getSortFunction(options);
  576. } else {
  577. return defaultSort(a,b);
  578. }
  579. }
  580. */
  581. });
  582. require.register("javve-to-string/index.js", function(exports, require, module){
  583. module.exports = function(s) {
  584. s = (s === undefined) ? "" : s;
  585. s = (s === null) ? "" : s;
  586. s = s.toString();
  587. return s;
  588. };
  589. });
  590. require.register("component-type/index.js", function(exports, require, module){
  591. /**
  592. * toString ref.
  593. */
  594. var toString = Object.prototype.toString;
  595. /**
  596. * Return the type of `val`.
  597. *
  598. * @param {Mixed} val
  599. * @return {String}
  600. * @api public
  601. */
  602. module.exports = function(val){
  603. switch (toString.call(val)) {
  604. case '[object Date]': return 'date';
  605. case '[object RegExp]': return 'regexp';
  606. case '[object Arguments]': return 'arguments';
  607. case '[object Array]': return 'array';
  608. case '[object Error]': return 'error';
  609. }
  610. if (val === null) return 'null';
  611. if (val === undefined) return 'undefined';
  612. if (val !== val) return 'nan';
  613. if (val && val.nodeType === 1) return 'element';
  614. return typeof val.valueOf();
  615. };
  616. });
  617. require.register("list.js/index.js", function(exports, require, module){
  618. /*
  619. ListJS with beta 1.0.0
  620. By Jonny Strömberg (www.jonnystromberg.com, www.listjs.com)
  621. */
  622. (function( window, undefined ) {
  623. "use strict";
  624. var document = window.document,
  625. getByClass = require('get-by-class'),
  626. extend = require('extend'),
  627. indexOf = require('indexof');
  628. var List = function(id, options, values) {
  629. var self = this,
  630. init,
  631. Item = require('./src/item')(self),
  632. addAsync = require('./src/add-async')(self),
  633. parse = require('./src/parse')(self);
  634. init = {
  635. start: function() {
  636. self.listClass = "list";
  637. self.searchClass = "search";
  638. self.sortClass = "sort";
  639. self.page = 1024;
  640. self.i = 1;
  641. self.items = [];
  642. self.visibleItems = [];
  643. self.matchingItems = [];
  644. self.searched = false;
  645. self.filtered = false;
  646. self.handlers = { 'updated': [] };
  647. self.plugins = {};
  648. self.helpers = {
  649. getByClass: getByClass,
  650. extend: extend,
  651. indexOf: indexOf
  652. };
  653. extend(self, options);
  654. self.listContainer = (typeof(id) === 'string') ? document.getElementById(id) : id;
  655. if (!self.listContainer) { return; }
  656. self.list = getByClass(self.listContainer, self.listClass, true);
  657. self.templater = require('./src/templater')(self);
  658. self.search = require('./src/search')(self);
  659. self.filter = require('./src/filter')(self);
  660. self.sort = require('./src/sort')(self);
  661. this.items();
  662. self.update();
  663. this.plugins();
  664. },
  665. items: function() {
  666. parse(self.list);
  667. if (values !== undefined) {
  668. self.add(values);
  669. }
  670. },
  671. plugins: function() {
  672. for (var i = 0; i < self.plugins.length; i++) {
  673. var plugin = self.plugins[i];
  674. self[plugin.name] = plugin;
  675. plugin.init(self);
  676. }
  677. }
  678. };
  679. /*
  680. * Add object to list
  681. */
  682. this.add = function(values, callback) {
  683. if (callback) {
  684. addAsync(values, callback);
  685. return;
  686. }
  687. var added = [],
  688. notCreate = false;
  689. if (values[0] === undefined){
  690. values = [values];
  691. }
  692. for (var i = 0, il = values.length; i < il; i++) {
  693. var item = null;
  694. if (values[i] instanceof Item) {
  695. item = values[i];
  696. item.reload();
  697. } else {
  698. notCreate = (self.items.length > self.page) ? true : false;
  699. item = new Item(values[i], undefined, notCreate);
  700. }
  701. self.items.push(item);
  702. added.push(item);
  703. }
  704. self.update();
  705. return added;
  706. };
  707. this.show = function(i, page) {
  708. this.i = i;
  709. this.page = page;
  710. self.update();
  711. return self;
  712. };
  713. /* Removes object from list.
  714. * Loops through the list and removes objects where
  715. * property "valuename" === value
  716. */
  717. this.remove = function(valueName, value, options) {
  718. var found = 0;
  719. for (var i = 0, il = self.items.length; i < il; i++) {
  720. if (self.items[i].values()[valueName] == value) {
  721. self.templater.remove(self.items[i], options);
  722. self.items.splice(i,1);
  723. il--;
  724. i--;
  725. found++;
  726. }
  727. }
  728. self.update();
  729. return found;
  730. };
  731. /* Gets the objects in the list which
  732. * property "valueName" === value
  733. */
  734. this.get = function(valueName, value) {
  735. var matchedItems = [];
  736. for (var i = 0, il = self.items.length; i < il; i++) {
  737. var item = self.items[i];
  738. if (item.values()[valueName] == value) {
  739. matchedItems.push(item);
  740. }
  741. }
  742. return matchedItems;
  743. };
  744. /*
  745. * Get size of the list
  746. */
  747. this.size = function() {
  748. return self.items.length;
  749. };
  750. /*
  751. * Removes all items from the list
  752. */
  753. this.clear = function() {
  754. self.templater.clear();
  755. self.items = [];
  756. return self;
  757. };
  758. this.on = function(event, callback) {
  759. self.handlers[event].push(callback);
  760. return self;
  761. };
  762. this.off = function(event, callback) {
  763. var e = self.handlers[event];
  764. var index = indexOf(e, callback);
  765. if (index > -1) {
  766. e.splice(index, 1);
  767. }
  768. return self;
  769. };
  770. this.trigger = function(event) {
  771. var i = self.handlers[event].length;
  772. while(i--) {
  773. self.handlers[event][i](self);
  774. }
  775. return self;
  776. };
  777. this.reset = {
  778. filter: function() {
  779. var is = self.items,
  780. il = is.length;
  781. while (il--) {
  782. is[il].filtered = false;
  783. }
  784. return self;
  785. },
  786. search: function() {
  787. var is = self.items,
  788. il = is.length;
  789. while (il--) {
  790. is[il].found = false;
  791. }
  792. return self;
  793. }
  794. };
  795. this.update = function() {
  796. var is = self.items,
  797. il = is.length;
  798. self.visibleItems = [];
  799. self.matchingItems = [];
  800. self.templater.clear();
  801. for (var i = 0; i < il; i++) {
  802. if (is[i].matching() && ((self.matchingItems.length+1) >= self.i && self.visibleItems.length < self.page)) {
  803. is[i].show();
  804. self.visibleItems.push(is[i]);
  805. self.matchingItems.push(is[i]);
  806. } else if (is[i].matching()) {
  807. self.matchingItems.push(is[i]);
  808. is[i].hide();
  809. } else {
  810. is[i].hide();
  811. }
  812. }
  813. self.trigger('updated');
  814. return self;
  815. };
  816. init.start();
  817. };
  818. module.exports = List;
  819. })(window);
  820. });
  821. require.register("list.js/src/search.js", function(exports, require, module){
  822. var events = require('events'),
  823. getByClass = require('get-by-class'),
  824. toString = require('to-string');
  825. module.exports = function(list) {
  826. var item,
  827. text,
  828. columns,
  829. searchString,
  830. customSearch;
  831. var prepare = {
  832. resetList: function() {
  833. list.i = 1;
  834. list.templater.clear();
  835. customSearch = undefined;
  836. },
  837. setOptions: function(args) {
  838. if (args.length == 2 && args[1] instanceof Array) {
  839. columns = args[1];
  840. } else if (args.length == 2 && typeof(args[1]) == "function") {
  841. customSearch = args[1];
  842. } else if (args.length == 3) {
  843. columns = args[1];
  844. customSearch = args[2];
  845. }
  846. },
  847. setColumns: function() {
  848. columns = (columns === undefined) ? prepare.toArray(list.items[0].values()) : columns;
  849. },
  850. setSearchString: function(s) {
  851. s = toString(s).toLowerCase();
  852. s = s.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&"); // Escape regular expression characters
  853. searchString = s;
  854. },
  855. toArray: function(values) {
  856. var tmpColumn = [];
  857. for (var name in values) {
  858. tmpColumn.push(name);
  859. }
  860. return tmpColumn;
  861. }
  862. };
  863. var search = {
  864. list: function() {
  865. for (var k = 0, kl = list.items.length; k < kl; k++) {
  866. search.item(list.items[k]);
  867. }
  868. },
  869. item: function(item) {
  870. item.found = false;
  871. for (var j = 0, jl = columns.length; j < jl; j++) {
  872. if (search.values(item.values(), columns[j])) {
  873. item.found = true;
  874. return;
  875. }
  876. }
  877. },
  878. values: function(values, column) {
  879. if (values.hasOwnProperty(column)) {
  880. text = toString(values[column]).toLowerCase();
  881. if ((searchString !== "") && (text.search(searchString) > -1)) {
  882. return true;
  883. }
  884. }
  885. return false;
  886. },
  887. reset: function() {
  888. list.reset.search();
  889. list.searched = false;
  890. }
  891. };
  892. var searchMethod = function(str) {
  893. list.trigger('searchStart');
  894. prepare.resetList();
  895. prepare.setSearchString(str);
  896. prepare.setOptions(arguments); // str, cols|searchFunction, searchFunction
  897. prepare.setColumns();
  898. if (searchString === "" ) {
  899. search.reset();
  900. } else {
  901. list.searched = true;
  902. if (customSearch) {
  903. customSearch(searchString, columns);
  904. } else {
  905. search.list();
  906. }
  907. }
  908. list.update();
  909. list.trigger('searchComplete');
  910. return list.visibleItems;
  911. };
  912. list.handlers.searchStart = list.handlers.searchStart || [];
  913. list.handlers.searchComplete = list.handlers.searchComplete || [];
  914. events.bind(getByClass(list.listContainer, list.searchClass), 'keyup', function(e) {
  915. var target = e.target || e.srcElement, // IE have srcElement
  916. alreadyCleared = (target.value === "" && !list.searched);
  917. if (!alreadyCleared) { // If oninput already have resetted the list, do nothing
  918. searchMethod(target.value);
  919. }
  920. });
  921. // Used to detect click on HTML5 clear button
  922. events.bind(getByClass(list.listContainer, list.searchClass), 'input', function(e) {
  923. var target = e.target || e.srcElement;
  924. if (target.value === "") {
  925. searchMethod('');
  926. }
  927. });
  928. list.helpers.toString = toString;
  929. return searchMethod;
  930. };
  931. });
  932. require.register("list.js/src/sort.js", function(exports, require, module){
  933. var naturalSort = require('natural-sort'),
  934. classes = require('classes'),
  935. events = require('events'),
  936. getByClass = require('get-by-class'),
  937. getAttribute = require('get-attribute');
  938. module.exports = function(list) {
  939. list.sortFunction = list.sortFunction || function(itemA, itemB, options) {
  940. options.desc = options.order == "desc" ? true : false; // Natural sort uses this format
  941. return naturalSort(itemA.values()[options.valueName], itemB.values()[options.valueName], options);
  942. };
  943. var buttons = {
  944. els: undefined,
  945. clear: function() {
  946. for (var i = 0, il = buttons.els.length; i < il; i++) {
  947. classes(buttons.els[i]).remove('asc');
  948. classes(buttons.els[i]).remove('desc');
  949. }
  950. },
  951. getOrder: function(btn) {
  952. var predefinedOrder = getAttribute(btn, 'data-order');
  953. if (predefinedOrder == "asc" || predefinedOrder == "desc") {
  954. return predefinedOrder;
  955. } else if (classes(btn).has('desc')) {
  956. return "asc";
  957. } else if (classes(btn).has('asc')) {
  958. return "desc";
  959. } else {
  960. return "asc";
  961. }
  962. },
  963. getInSensitive: function(btn, options) {
  964. var insensitive = getAttribute(btn, 'data-insensitive');
  965. if (insensitive === "true") {
  966. options.insensitive = true;
  967. } else {
  968. options.insensitive = false;
  969. }
  970. },
  971. setOrder: function(options) {
  972. for (var i = 0, il = buttons.els.length; i < il; i++) {
  973. var btn = buttons.els[i];
  974. if (getAttribute(btn, 'data-sort') !== options.valueName) {
  975. continue;
  976. }
  977. var predefinedOrder = getAttribute(btn, 'data-order');
  978. if (predefinedOrder == "asc" || predefinedOrder == "desc") {
  979. if (predefinedOrder == options.order) {
  980. classes(btn).add(options.order);
  981. }
  982. } else {
  983. classes(btn).add(options.order);
  984. }
  985. }
  986. }
  987. };
  988. var sort = function() {
  989. list.trigger('sortStart');
  990. options = {};
  991. var target = arguments[0].currentTarget || arguments[0].srcElement || undefined;
  992. if (target) {
  993. options.valueName = getAttribute(target, 'data-sort');
  994. buttons.getInSensitive(target, options);
  995. options.order = buttons.getOrder(target);
  996. } else {
  997. options = arguments[1] || options;
  998. options.valueName = arguments[0];
  999. options.order = options.order || "asc";
  1000. options.insensitive = (typeof options.insensitive == "undefined") ? true : options.insensitive;
  1001. }
  1002. buttons.clear();
  1003. buttons.setOrder(options);
  1004. options.sortFunction = options.sortFunction || list.sortFunction;
  1005. list.items.sort(function(a, b) {
  1006. return options.sortFunction(a, b, options);
  1007. });
  1008. list.update();
  1009. list.trigger('sortComplete');
  1010. };
  1011. // Add handlers
  1012. list.handlers.sortStart = list.handlers.sortStart || [];
  1013. list.handlers.sortComplete = list.handlers.sortComplete || [];
  1014. buttons.els = getByClass(list.listContainer, list.sortClass);
  1015. events.bind(buttons.els, 'click', sort);
  1016. list.on('searchStart', buttons.clear);
  1017. list.on('filterStart', buttons.clear);
  1018. // Helpers
  1019. list.helpers.classes = classes;
  1020. list.helpers.naturalSort = naturalSort;
  1021. list.helpers.events = events;
  1022. list.helpers.getAttribute = getAttribute;
  1023. return sort;
  1024. };
  1025. });
  1026. require.register("list.js/src/item.js", function(exports, require, module){
  1027. module.exports = function(list) {
  1028. return function(initValues, element, notCreate) {
  1029. var item = this;
  1030. this._values = {};
  1031. this.found = false; // Show if list.searched == true and this.found == true
  1032. this.filtered = false;// Show if list.filtered == true and this.filtered == true
  1033. var init = function(initValues, element, notCreate) {
  1034. if (element === undefined) {
  1035. if (notCreate) {
  1036. item.values(initValues, notCreate);
  1037. } else {
  1038. item.values(initValues);
  1039. }
  1040. } else {
  1041. item.elm = element;
  1042. var values = list.templater.get(item, initValues);
  1043. item.values(values);
  1044. }
  1045. };
  1046. this.values = function(newValues, notCreate) {
  1047. if (newValues !== undefined) {
  1048. for(var name in newValues) {
  1049. item._values[name] = newValues[name];
  1050. }
  1051. if (notCreate !== true) {
  1052. list.templater.set(item, item.values());
  1053. }
  1054. } else {
  1055. return item._values;
  1056. }
  1057. };
  1058. this.show = function() {
  1059. list.templater.show(item);
  1060. };
  1061. this.hide = function() {
  1062. list.templater.hide(item);
  1063. };
  1064. this.matching = function() {
  1065. return (
  1066. (list.filtered && list.searched && item.found && item.filtered) ||
  1067. (list.filtered && !list.searched && item.filtered) ||
  1068. (!list.filtered && list.searched && item.found) ||
  1069. (!list.filtered && !list.searched)
  1070. );
  1071. };
  1072. this.visible = function() {
  1073. return (item.elm.parentNode == list.list) ? true : false;
  1074. };
  1075. init(initValues, element, notCreate);
  1076. };
  1077. };
  1078. });
  1079. require.register("list.js/src/templater.js", function(exports, require, module){
  1080. var getByClass = require('get-by-class');
  1081. var Templater = function(list) {
  1082. var itemSource = getItemSource(list.item),
  1083. templater = this;
  1084. function getItemSource(item) {
  1085. if (item === undefined) {
  1086. var nodes = list.list.childNodes,
  1087. items = [];
  1088. for (var i = 0, il = nodes.length; i < il; i++) {
  1089. // Only textnodes have a data attribute
  1090. if (nodes[i].data === undefined) {
  1091. return nodes[i];
  1092. }
  1093. }
  1094. return null;
  1095. } else if (item.indexOf("<") !== -1) { // Try create html element of list, do not work for tables!!
  1096. var div = document.createElement('div');
  1097. div.innerHTML = item;
  1098. return div.firstChild;
  1099. } else {
  1100. return document.getElementById(list.item);
  1101. }
  1102. }
  1103. /* Get values from element */
  1104. this.get = function(item, valueNames) {
  1105. templater.create(item);
  1106. var values = {};
  1107. for(var i = 0, il = valueNames.length; i < il; i++) {
  1108. var elm = getByClass(item.elm, valueNames[i], true);
  1109. values[valueNames[i]] = elm ? elm.innerHTML : "";
  1110. }
  1111. return values;
  1112. };
  1113. /* Sets values at element */
  1114. this.set = function(item, values) {
  1115. if (!templater.create(item)) {
  1116. for(var v in values) {
  1117. if (values.hasOwnProperty(v)) {
  1118. // TODO speed up if possible
  1119. var elm = getByClass(item.elm, v, true);
  1120. if (elm) {
  1121. /* src attribute for image tag & text for other tags */
  1122. if (elm.tagName === "IMG" && values[v] !== "") {
  1123. elm.src = values[v];
  1124. } else {
  1125. elm.innerHTML = values[v];
  1126. }
  1127. }
  1128. }
  1129. }
  1130. }
  1131. };
  1132. this.create = function(item) {
  1133. if (item.elm !== undefined) {
  1134. return false;
  1135. }
  1136. /* If item source does not exists, use the first item in list as
  1137. source for new items */
  1138. var newItem = itemSource.cloneNode(true);
  1139. newItem.removeAttribute('id');
  1140. item.elm = newItem;
  1141. templater.set(item, item.values());
  1142. return true;
  1143. };
  1144. this.remove = function(item) {
  1145. list.list.removeChild(item.elm);
  1146. };
  1147. this.show = function(item) {
  1148. templater.create(item);
  1149. list.list.appendChild(item.elm);
  1150. };
  1151. this.hide = function(item) {
  1152. if (item.elm !== undefined && item.elm.parentNode === list.list) {
  1153. list.list.removeChild(item.elm);
  1154. }
  1155. };
  1156. this.clear = function() {
  1157. /* .innerHTML = ''; fucks up IE */
  1158. if (list.list.hasChildNodes()) {
  1159. while (list.list.childNodes.length >= 1)
  1160. {
  1161. list.list.removeChild(list.list.firstChild);
  1162. }
  1163. }
  1164. };
  1165. };
  1166. module.exports = function(list) {
  1167. return new Templater(list);
  1168. };
  1169. });
  1170. require.register("list.js/src/filter.js", function(exports, require, module){
  1171. module.exports = function(list) {
  1172. // Add handlers
  1173. list.handlers.filterStart = list.handlers.filterStart || [];
  1174. list.handlers.filterComplete = list.handlers.filterComplete || [];
  1175. return function(filterFunction) {
  1176. list.trigger('filterStart');
  1177. list.i = 1; // Reset paging
  1178. list.reset.filter();
  1179. if (filterFunction === undefined) {
  1180. list.filtered = false;
  1181. } else {
  1182. list.filtered = true;
  1183. var is = list.items;
  1184. for (var i = 0, il = is.length; i < il; i++) {
  1185. var item = is[i];
  1186. if (filterFunction(item)) {
  1187. item.filtered = true;
  1188. } else {
  1189. item.filtered = false;
  1190. }
  1191. }
  1192. }
  1193. list.update();
  1194. list.trigger('filterComplete');
  1195. return list.visibleItems;
  1196. };
  1197. };
  1198. });
  1199. require.register("list.js/src/add-async.js", function(exports, require, module){
  1200. module.exports = function(list) {
  1201. return function(values, callback, items) {
  1202. var valuesToAdd = values.splice(0, 100);
  1203. items = items || [];
  1204. items = items.concat(list.add(valuesToAdd));
  1205. if (values.length > 0) {
  1206. setTimeout(function() {
  1207. addAsync(values, callback, items);
  1208. }, 10);
  1209. } else {
  1210. list.update();
  1211. callback(items);
  1212. }
  1213. };
  1214. };
  1215. });
  1216. require.register("list.js/src/parse.js", function(exports, require, module){
  1217. module.exports = function(list) {
  1218. var Item = require('./item')(list);
  1219. var getChildren = function(parent) {
  1220. var nodes = parent.childNodes,
  1221. items = [];
  1222. for (var i = 0, il = nodes.length; i < il; i++) {
  1223. // Only textnodes have a data attribute
  1224. if (nodes[i].data === undefined) {
  1225. items.push(nodes[i]);
  1226. }
  1227. }
  1228. return items;
  1229. };
  1230. var parse = function(itemElements, valueNames) {
  1231. for (var i = 0, il = itemElements.length; i < il; i++) {
  1232. list.items.push(new Item(valueNames, itemElements[i]));
  1233. }
  1234. };
  1235. var parseAsync = function(itemElements, valueNames) {
  1236. var itemsToIndex = itemElements.splice(0, 100); // TODO: If < 100 items, what happens in IE etc?
  1237. parse(itemsToIndex, valueNames);
  1238. if (itemElements.length > 0) {
  1239. setTimeout(function() {
  1240. init.items.indexAsync(itemElements, valueNames);
  1241. }, 10);
  1242. } else {
  1243. list.update();
  1244. // TODO: Add indexed callback
  1245. }
  1246. };
  1247. return function() {
  1248. var itemsToIndex = getChildren(list.list),
  1249. valueNames = list.valueNames;
  1250. if (list.indexAsync) {
  1251. parseAsync(itemsToIndex, valueNames);
  1252. } else {
  1253. parse(itemsToIndex, valueNames);
  1254. }
  1255. };
  1256. };
  1257. });
  1258. require.alias("component-classes/index.js", "list.js/deps/classes/index.js");
  1259. require.alias("component-classes/index.js", "classes/index.js");
  1260. require.alias("component-indexof/index.js", "component-classes/deps/indexof/index.js");
  1261. require.alias("segmentio-extend/index.js", "list.js/deps/extend/index.js");
  1262. require.alias("segmentio-extend/index.js", "extend/index.js");
  1263. require.alias("component-indexof/index.js", "list.js/deps/indexof/index.js");
  1264. require.alias("component-indexof/index.js", "indexof/index.js");
  1265. require.alias("javve-events/index.js", "list.js/deps/events/index.js");
  1266. require.alias("javve-events/index.js", "events/index.js");
  1267. require.alias("component-event/index.js", "javve-events/deps/event/index.js");
  1268. require.alias("timoxley-to-array/index.js", "javve-events/deps/to-array/index.js");
  1269. require.alias("javve-get-by-class/index.js", "list.js/deps/get-by-class/index.js");
  1270. require.alias("javve-get-by-class/index.js", "get-by-class/index.js");
  1271. require.alias("javve-get-attribute/index.js", "list.js/deps/get-attribute/index.js");
  1272. require.alias("javve-get-attribute/index.js", "get-attribute/index.js");
  1273. require.alias("javve-natural-sort/index.js", "list.js/deps/natural-sort/index.js");
  1274. require.alias("javve-natural-sort/index.js", "natural-sort/index.js");
  1275. require.alias("javve-to-string/index.js", "list.js/deps/to-string/index.js");
  1276. require.alias("javve-to-string/index.js", "list.js/deps/to-string/index.js");
  1277. require.alias("javve-to-string/index.js", "to-string/index.js");
  1278. require.alias("javve-to-string/index.js", "javve-to-string/index.js");
  1279. require.alias("component-type/index.js", "list.js/deps/type/index.js");
  1280. require.alias("component-type/index.js", "type/index.js");
  1281. if (typeof exports == "object") {
  1282. module.exports = require("list.js");
  1283. } else if (typeof define == "function" && define.amd) {
  1284. define(function(){ return require("list.js"); });
  1285. } else {
  1286. this["List"] = require("list.js");
  1287. }})();