diff --git a/bower.json b/bower.json index a6ab232..42adcac 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "vanilla-datatables", - "version": "1.0.3", + "version": "1.0.4", "ignore": [ ".gitattributes", "README.md" diff --git a/package.json b/package.json index 5733e5c..225df7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vanilla-datatables", - "version": "1.0.3", + "version": "1.0.4", "description": "A lightweight, dependency-free javascript HTML table plugin.", "main": "vanilla-dataTables.min.js", "scripts": { diff --git a/vanilla-dataTables.js b/vanilla-dataTables.js index 8e4a5f4..57e5058 100644 --- a/vanilla-dataTables.js +++ b/vanilla-dataTables.js @@ -4,10 +4,10 @@ * Copyright (c) 2015-2017 Karl Saunders (http://mobiuswebdesign.co.uk) * Licensed under MIT (http://www.opensource.org/licenses/mit-license.php) * - * Version: 1.0.3 + * Version: 1.0.4 * */ -(function (root, factory) { +(function(root, factory) { var plugin = 'DataTable'; if (typeof define === 'function' && define.amd) { @@ -17,7 +17,7 @@ } else { root[plugin] = factory(plugin); } -}(this, function (plugin) { +}(this, function(plugin) { 'use strict'; /* PRIVATE VARS */ @@ -32,7 +32,7 @@ each: function(a, b, c) { if ("[object Object]" === Object.prototype.toString.call(a)) { for (var d in a) { - if ( Object.prototype.hasOwnProperty.call(a, d) ) { + if (Object.prototype.hasOwnProperty.call(a, d)) { b.call(c, d, a[d], a); } } @@ -67,21 +67,34 @@ }, addClass: function(a, b) { if (!util.hasClass(a, b)) { - if (a.classList) { a.classList.add(b); } else { a.className = a.className.trim() + " " + b; } } + if (a.classList) { + a.classList.add(b); + } else { + a.className = a.className.trim() + " " + b; + } + } }, removeClass: function(a, b) { - if (util.hasClass(a, b)) { if (a.classList) { a.classList.remove(b); } else { a.className = a.className.replace(new RegExp("(^|\\s)" + b.split(" ").join("|") + "(\\s|$)", "gi"), " "); }} + if (util.hasClass(a, b)) { + if (a.classList) { + a.classList.remove(b); + } else { + a.className = a.className.replace(new RegExp("(^|\\s)" + b.split(" ").join("|") + "(\\s|$)", "gi"), " "); + } + } }, append: function(p, e) { return p && e && p.appendChild(e); }, listen: function(e, type, callback, scope) { - e.addEventListener(type, function(e) { callback.call(scope||this, e); }, false); + e.addEventListener(type, function(e) { + callback.call(scope || this, e); + }, false); }, getBoundingRect: function(el) { var win = window; - var doc = document; - var body = doc.body; + var doc = document; + var body = doc.body; var rect = el.getBoundingClientRect(); var offsetX = win.pageXOffset !== undefined ? win.pageXOffset : (doc.documentElement || body.parentNode || body).scrollLeft; var offsetY = win.pageYOffset !== undefined ? win.pageYOffset : (doc.documentElement || body.parentNode || body).scrollTop; @@ -89,10 +102,10 @@ return { bottom: rect.bottom + offsetY, height: rect.height, - left : rect.left + offsetX, - right : rect.right + offsetX, - top : rect.top + offsetY, - width : rect.width + left: rect.left + offsetX, + right: rect.right + offsetX, + top: rect.top + offsetY, + width: rect.width }; }, preventDefault: function(e) { @@ -101,43 +114,71 @@ return e.preventDefault(); } }, - includes: function(a,b) { + includes: function(a, b) { return a.indexOf(b) > -1; }, - button: function(c, p, t){ - return util.createElement('li', { class: c, html: ''+t+''}); + button: function(c, p, t) { + return util.createElement('li', { + class: c, + html: '' + t + '' + }); }, flush: function(el, ie) { - if (ie) { while (el.hasChildNodes()) { el.removeChild(el.firstChild); } } else { el.innerHTML = ''; } + if (ie) { + while (el.hasChildNodes()) { + el.removeChild(el.firstChild); + } + } else { + el.innerHTML = ''; + } } }; var build = function() { var _ = this; - if ( _.options.data ) { + if (_.options.data) { dataToTable.call(_); } _.tbody = _.table.tBodies[0]; - var _wrapper = util.createElement('div', { class: 'dataTable-wrapper'}); - _.container = util.createElement('div', { class: 'dataTable-container'}); - _.label = util.createElement('div', { class: 'dataTable-info' }); + var _wrapper = util.createElement('div', { + class: 'dataTable-wrapper' + }); + _.container = util.createElement('div', { + class: 'dataTable-container' + }); + _.label = util.createElement('div', { + class: 'dataTable-info' + }); - var top = util.createElement('div', { class: 'dataTable-top' }); - var bottom = util.createElement('div', { class: 'dataTable-bottom' }); + var top = util.createElement('div', { + class: 'dataTable-top' + }); + var bottom = util.createElement('div', { + class: 'dataTable-bottom' + }); // Per Page Select if (_.options.perPageSelect) { // Build the selector - var wrap = util.createElement('div', { class: 'dataTable-dropdown' }); - var label = util.createElement('label', { class: 'dataTable-selectWrapper' }); - var _ppSelector = util.createElement('select', { class: 'dataTable-selector'}); + var wrap = util.createElement('div', { + class: 'dataTable-dropdown' + }); + var label = util.createElement('label', { + class: 'dataTable-selectWrapper' + }); + var _ppSelector = util.createElement('select', { + class: 'dataTable-selector' + }); util.each(_.options.perPageSelect, function(i, val) { - util.append(_ppSelector, util.createElement('option', { value: val, html: val })); + util.append(_ppSelector, util.createElement('option', { + value: val, + html: val + })); }); _ppSelector.value = _.options.perPage; @@ -152,7 +193,7 @@ _.options.perPage = parseInt(this.value, 10); _.update(); - if ( _.options.fixedHeight ) { + if (_.options.fixedHeight) { fixHeight.call(_); } @@ -163,8 +204,14 @@ // Searchable if (_.options.searchable) { - var form = util.createElement('div', { class: 'dataTable-search' }); - _.input = util.createElement('input', { type: 'text', class: 'dataTable-input', placeholder: 'Search...'}); + var form = util.createElement('div', { + class: 'dataTable-search' + }); + _.input = util.createElement('input', { + type: 'text', + class: 'dataTable-input', + placeholder: 'Search...' + }); util.append(form, _.input); util.append(top, form); @@ -178,7 +225,11 @@ var cols = _.table.tHead.rows[0].cells; util.each(cols, function(i, head) { - var link = util.createElement('a', { href: '#', class: 'dataTable-sorter', html: head.innerHTML }); + var link = util.createElement('a', { + href: '#', + class: 'dataTable-sorter', + html: head.innerHTML + }); head.idx = i; head.innerHTML = ''; util.append(head, link); @@ -210,7 +261,9 @@ util.append(_wrapper, bottom); // Paginator - var w = util.createElement('div', { class: 'dataTable-pagination' }); + var w = util.createElement('div', { + class: 'dataTable-pagination' + }); _.paginator = util.createElement('ul'); util.append(w, _.paginator); util.append(bottom, w); @@ -247,13 +300,51 @@ /* Fixed column widths */ if (_.options.fixedColumns) { - var cells = _.table.tHead.rows[0].cells; + var cells, h = false; - util.each(cells, function(i, cell) { - var rect = util.getBoundingRect(cell); - var w = (rect.width / _.rect.width) * 100; - cell.style.width = w + '%'; - }); + // If we have a headings we need only set the widths on them + // otherwise we need a temp header and the widths need applying to all cells + if (_.table.tHead) { + cells = _.table.tHead.rows[0].cells; + + util.each(cells, function(i, cell) { + var rect = util.getBoundingRect(cell); + var w = (rect.width / _.rect.width) * 100; + cell.style.width = w + '%'; + }); + } else { + + cells = []; + + // Make temperary headings + h = util.createElement("thead"); + var r = util.createElement("tr"); + var c = _.table.tBodies[0].rows[0].cells; + util.each(c, function(i, row) { + var th = util.createElement("th"); + r.appendChild(th); + cells.push(th); + }); + + h.appendChild(r); + _.table.insertBefore(h, _.table.tBodies[0]); + + var widths = []; + util.each(cells, function(i, cell) { + var rect = util.getBoundingRect(cell); + var w = (rect.width / _.rect.width) * 100; + widths.push(w); + }); + + util.each(this.rows, function(idx, row) { + util.each(row.cells, function(i, cell) { + cell.style.width = widths[i] + "%"; + }); + }); + + // Discard the temp header + _.table.removeChild(h); + } util.addClass(_.table, 'fixed-columns'); } @@ -261,7 +352,8 @@ }; var paginate = function() { - var _ = this, perPage = _.options.perPage, + var _ = this, + perPage = _.options.perPage, rows = !!_.searching ? _.searchData : _.rows; _.pages = rows.map(function(tr, i) { @@ -276,16 +368,17 @@ var render = function() { var _ = this; - if ( _.totalPages ) { + if (_.totalPages) { - if ( _.currentPage > _.totalPages ) { + if (_.currentPage > _.totalPages) { _.currentPage = 1; } // Use a fragment to limit touching the DOM - var _index = _.currentPage - 1, frag = util.createFragment(); + var _index = _.currentPage - 1, + frag = util.createFragment(); - util.each(_.pages[_index], function (i, v) { + util.each(_.pages[_index], function(i, v) { util.append(frag, v); }); @@ -305,13 +398,16 @@ } // Update the info - var current = 0, f = 0, t = 0, items; + var current = 0, + f = 0, + t = 0, + items; - if ( _.totalPages ) { - current = _.currentPage-1; + if (_.totalPages) { + current = _.currentPage - 1; f = current * _.options.perPage; t = f + _.pages[current].length; - f = f+1; + f = f + 1; items = !!_.searching ? _.searchData.length : _.rows.length; } @@ -329,23 +425,27 @@ if (_.totalPages <= 1) return; - var c = 'pager', frag = util.createFragment(), + var c = 'pager', + frag = util.createFragment(), prev = _.onFirstPage ? 1 : _.currentPage - 1, next = _.onlastPage ? _.totalPages : _.currentPage + 1; // first button if (_.options.firstLast) { - util.append(frag, util.button(c, 1, _.options.firstText)); } + util.append(frag, util.button(c, 1, _.options.firstText)); + } // prev button if (_.options.nextPrev) { - util.append(frag, util.button(c, prev, _.options.prevText)); } + util.append(frag, util.button(c, prev, _.options.prevText)); + } var pager = _.links; // truncate the links if (_.options.truncatePager) { - pager = _truncate(_.links, _.currentPage, _.pages.length, _.options.pagerDelta); } + pager = _truncate(_.links, _.currentPage, _.pages.length, _.options.pagerDelta); + } // active page link util.addClass(_.links[_.currentPage - 1], 'active'); @@ -360,11 +460,13 @@ // next button if (_.options.nextPrev) { - util.append(frag, util.button(c, next, _.options.nextText)); } + util.append(frag, util.button(c, next, _.options.nextText)); + } // first button if (_.options.firstLast) { - util.append(frag, util.button(c, _.totalPages, _.options.lastText)); } + util.append(frag, util.button(c, _.totalPages, _.options.lastText)); + } // append the fragment util.append(_.paginator, frag); @@ -372,23 +474,27 @@ var sortItems = function(a, b) { var c, d; - if ( 1 === b ) { - c = 0; d = a.length; - } else { - if ( b === -1 ) { - c = a.length - 1; d = -1; - } - } + if (1 === b) { + c = 0; + d = a.length; + } else { + if (b === -1) { + c = a.length - 1; + d = -1; + } + } for (var e = !0; e;) { e = !1; - for (var f = c; f != d; f += b) { + for (var f = c; f != d; f += b) { if (a[f + b] && a[f].value > a[f + b].value) { var g = a[f], h = a[f + b], i = g; - a[f] = h; a[f + b] = i; e = !0; + a[f] = h; + a[f + b] = i; + e = !0; } - } + } } return a; }; @@ -406,11 +512,16 @@ g = b + d, h = [], i = []; - if ( b < 4 - d + e ) {g = 3 + e; } else if ( b > c - (3 - d + e)) { f = c - (2 + e); } + if (b < 4 - d + e) { + g = 3 + e; + } else if (b > c - (3 - d + e)) { + f = c - (2 + e); + } for (var k = 1; k <= c; k++) { if (1 == k || k == c || k >= f && k <= g) { var l = a[k - 1]; - util.removeClass(l, "active"); h.push(l); + util.removeClass(l, "active"); + h.push(l); } } util.each(h, function(b, c) { @@ -419,11 +530,15 @@ var e = j.children[0].getAttribute("data-page"); if (d - e == 2) i.push(a[e]); else if (d - e != 1) { - var f = util.createElement("li", { class: "ellipsis", html: '' }); + var f = util.createElement("li", { + class: "ellipsis", + html: '' + }); i.push(f); } } - i.push(c); j = c; + i.push(c); + j = c; }); return i; @@ -435,10 +550,10 @@ thead = false, tbody = false; - if ( data.headings ) { + if (data.headings) { thead = util.createElement('thead'); var tr = util.createElement('tr'); - util.each(data.headings, function(i,col) { + util.each(data.headings, function(i, col) { var td = util.createElement('th', { html: col }); @@ -448,11 +563,11 @@ thead.appendChild(tr); } - if ( data.rows ) { + if (data.rows) { tbody = util.createElement('tbody'); util.each(data.rows, function(i, rows) { - if ( data.headings ) { - if ( data.headings.length !== rows.length ) { + if (data.headings) { + if (data.headings.length !== rows.length) { throw new Error("The number of rows do not match the number of headings."); } } @@ -467,15 +582,15 @@ }); } - if ( thead ) { - if ( this.table.tHead !== null ) { + if (thead) { + if (this.table.tHead !== null) { this.table.removeChild(this.table.tHead); } util.append(this.table, thead); } - if ( tbody ) { - if ( this.table.tBodies.length ) { + if (tbody) { + if (this.table.tBodies.length) { this.table.removeChild(this.table.tBodies[0]); } util.append(this.table, tbody); @@ -485,31 +600,31 @@ // Emitter var Emitter = function() {}; Emitter.prototype = { - on: function(event, fct){ + on: function(event, fct) { this._events = this._events || {}; - this._events[event] = this._events[event] || []; + this._events[event] = this._events[event] || []; this._events[event].push(fct); }, - off: function(event, fct){ + off: function(event, fct) { this._events = this._events || {}; - if( event in this._events === false ) return; + if (event in this._events === false) return; this._events[event].splice(this._events[event].indexOf(fct), 1); }, - emit: function(event /* , args... */){ + emit: function(event /* , args... */ ) { this._events = this._events || {}; - if( event in this._events === false ) return; - for(var i = 0; i < this._events[event].length; i++){ + if (event in this._events === false) return; + for (var i = 0; i < this._events[event].length; i++) { this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)); } } }; Emitter.mixin = function(obj) { - var props = ['on', 'off', 'emit']; - for(var i = 0; i < props.length; i ++){ - if( typeof obj === 'function' ){ - obj.prototype[props[i]] = Emitter.prototype[props[i]]; - }else{ + var props = ['on', 'off', 'emit']; + for (var i = 0; i < props.length; i++) { + if (typeof obj === 'function') { + obj.prototype[props[i]] = Emitter.prototype[props[i]]; + } else { obj[props[i]] = Emitter.prototype[props[i]]; } } @@ -520,7 +635,7 @@ // DATATABLE // //////////////// - function Plugin(table, options) { + function DataTable(table, options) { var _ = this; @@ -546,33 +661,33 @@ // Checks if (!table) { - throw new Error("The plugin requires a table as the first parameter"); } + throw new Error("The plugin requires a table as the first parameter"); + } if (typeof table === "string") { var selector = table; table = document.querySelector(table); - if ( !table ) { - throw new Error("The element '"+selector+"' can not be found."); + if (!table) { + throw new Error("The element '" + selector + "' can not be found."); } } - if (table.tagName.toLowerCase() != "table") { - throw new Error("The selected element is not a table."); } + if (table.tagName.toLowerCase() !== "table") { + throw new Error("The selected element is not a table."); + } - if (table.tHead === null && _.options.sortable) { - if ( _.options.data ) { - if ( !_.options.data.headings ) { - throw new Error("You seem to be using the data option, but you've not defined any headings."); + if (table.tHead === null ) { + if ( _.options.sortable ) { + if ( !_.options.data || (_.options.data && !_.options.data.headings) ) { + _.options.sortable = false; } - } else { - throw new Error("The sortable option requires table headings."); } } if (!table.tBodies.length) { - if ( _.options.data ) { - if ( !_.options.data.rows ) { + if (_.options.data) { + if (!_.options.data.rows) { throw new Error("You seem to be using the data option, but you've not defined any rows."); } } else { @@ -581,8 +696,8 @@ } if (table.tBodies.length && !table.tBodies[0].rows.length) { - if ( _.options.data ) { - if ( !_.options.data.rows ) { + if (_.options.data) { + if (!_.options.data.rows) { throw new Error("You seem to be using the data option, but you've not defined any rows."); } } else { @@ -605,7 +720,7 @@ }, 10); } - Plugin.prototype.update = function() { + DataTable.prototype.update = function() { var _ = this; paginate.call(_); @@ -614,7 +729,7 @@ _.links = []; var i = _.pages.length; - while(i--) { + while (i--) { var num = i + 1; _.links[i] = util.button((i === 0) ? 'active' : '', num, num); } @@ -624,7 +739,7 @@ _.emit('datatable.update'); }; - Plugin.prototype.search = function(query) { + DataTable.prototype.search = function(query) { var _ = this; query = query.toLowerCase(); @@ -633,7 +748,7 @@ _.searching = true; _.searchData = []; - if ( !query.length ) { + if (!query.length) { _.searching = false; _.update(); _.emit("datatable.search", query, _.searchData); @@ -645,13 +760,14 @@ util.each(_.rows, function(idx, row) { var inArray = util.includes(_.searchData, row); // Cheat and get the row's textContent instead of searching each cell :P - if ( util.includes(row.textContent.toLowerCase(), query) && !inArray) { + if (util.includes(row.textContent.toLowerCase(), query) && !inArray) { _.searchData.push(row); } }); - if ( !_.searchData.length ) { - _.setMessage('No rows found.'); } + if (!_.searchData.length) { + _.setMessage('No rows found.'); + } _.update(); @@ -659,18 +775,21 @@ }; /* Change the page. */ - Plugin.prototype.page = function(page) { + DataTable.prototype.page = function(page) { var _ = this; // We don't want to load the current page again. - if ( page == _.currentPage ) { - return; } + if (page == _.currentPage) { + return; + } - if ( !isNaN(page)) { - _.currentPage = parseInt(page, 10); } + if (!isNaN(page)) { + _.currentPage = parseInt(page, 10); + } - if ( page > _.pages.length || page < 0 ) { - return; } + if (page > _.pages.length || page < 0) { + return; + } render.call(_); renderPager.call(_); @@ -679,7 +798,8 @@ }; /* Perform the sorting */ - Plugin.prototype.sortColumn = function(column, direction) { + /* TODO: Allow method to work in the absence of headings */ + DataTable.prototype.sortColumn = function(column, direction) { var _ = this; var dir; var rows = !!_.searching ? _.searchData : _.rows; @@ -695,9 +815,15 @@ var num = content.replace(/(\$|\,|\s)/g, ""); if (parseFloat(num) == num) { - numeric[n++] = { value: Number(num), row: tr }; + numeric[n++] = { + value: Number(num), + row: tr + }; } else { - alpha[a++] = { value: content, row: tr }; + alpha[a++] = { + value: content, + row: tr + }; } }); @@ -705,11 +831,15 @@ /* Sort according to direction (ascending or descending) */ var top, btm; if (util.hasClass(th, "asc") || direction == "asc") { - top = sortItems(alpha, -1); btm = sortItems(numeric, -1); dir = 'descending'; + top = sortItems(alpha, -1); + btm = sortItems(numeric, -1); + dir = 'descending'; util.removeClass(th, 'asc'); util.addClass(th, 'desc'); } else { - top = sortItems(numeric, 1); btm = sortItems(alpha, 1); dir = 'ascending'; + top = sortItems(numeric, 1); + btm = sortItems(alpha, 1); + dir = 'ascending'; util.removeClass(th, 'desc'); util.addClass(th, 'asc'); } @@ -725,7 +855,7 @@ /* Reorder the table */ rows = top.concat(btm); - if ( !!_.searching ) { + if (!!_.searching) { _.searchData = []; util.each(rows, function(i, v) { @@ -743,12 +873,12 @@ _.emit('datatable.sort', column, dir); }; - Plugin.prototype.addRows = function(data) { - if ( Object.prototype.toString.call(data) !== '[object Object]') { + DataTable.prototype.addRows = function(data) { + if (Object.prototype.toString.call(data) !== '[object Object]') { throw new Error("Function addRows: The method requires an object."); } - if ( !data.rows ) { + if (!data.rows) { throw new Error("Function addRows: Your object is missing the 'rows' property."); } @@ -756,7 +886,9 @@ util.each(data.rows, function(i, row) { var tr = util.createElement("tr"); util.each(row, function(a, val) { - var td = util.createElement("td", { html: val }); + var td = util.createElement("td", { + html: val + }); tr.appendChild(td); }); that.rows.push(tr); @@ -765,7 +897,7 @@ this.update(); }; - Plugin.prototype.refresh = function() { + DataTable.prototype.refresh = function() { this.input.value = ''; this.searching = false; this.update(); @@ -773,25 +905,27 @@ this.emit("datatable.refresh"); }; - Plugin.prototype.clear = function(html) { - if ( this.tbody ) { + DataTable.prototype.clear = function(html) { + if (this.tbody) { util.flush(this.tbody, this.isIE); } var parent = this.tbody; - if ( !this.tbody ) { + if (!this.tbody) { parent = this.table; } - if ( html ) { + if (html) { util.append(parent, html); - } + } }; - Plugin.prototype.setMessage = function(message) { - var colspan = this.table.tHead.rows[0].cells.length; - this.clear(util.createElement('tr', { html: ''+message+'' })); + DataTable.prototype.setMessage = function(message) { + var colspan = this.table.tBodies[0].rows[0].cells.length; + this.clear(util.createElement('tr', { + html: '' + message + '' + })); }; - return Plugin; -})); + return DataTable; +})); \ No newline at end of file diff --git a/vanilla-dataTables.min.js b/vanilla-dataTables.min.js index 62c9ab0..d095cbb 100644 --- a/vanilla-dataTables.min.js +++ b/vanilla-dataTables.min.js @@ -4,7 +4,7 @@ * Copyright (c) 2015-2017 Karl Saunders (http://mobiuswebdesign.co.uk) * Licensed under MIT (http://www.opensource.org/licenses/mit-license.php) * - * Version: 1.0.3 + * Version: 1.0.4 * */ -!function(a,b){var c="DataTable";"function"==typeof define&&define.amd?define([],b(c)):"object"==typeof exports?module.exports=b(c):a[c]=b(c)}(this,function(a){"use strict";function l(a,d){var e=this,f={perPage:10,perPageSelect:[5,10,15,20,25],nextPrev:!0,firstLast:!1,prevText:"‹",nextText:"›",firstText:"«",lastText:"»",sortable:!0,searchable:!0,fixedColumns:!0,fixedHeight:!1,truncatePager:!0,pagerDelta:2};if(e.options=b.extend(f,d),!a)throw new Error("The plugin requires a table as the first parameter");if("string"==typeof a){var g=a;if(a=document.querySelector(a),!a)throw new Error("The element '"+g+"' can not be found.")}if("table"!=a.tagName.toLowerCase())throw new Error("The selected element is not a table.");if(null===a.tHead&&e.options.sortable){if(!e.options.data)throw new Error("The sortable option requires table headings.");if(!e.options.data.headings)throw new Error("You seem to be using the data option, but you've not defined any headings.")}if(!a.tBodies.length){if(!e.options.data)throw new Error("You don't seem to have a tbody in your table.");if(!e.options.data.rows)throw new Error("You seem to be using the data option, but you've not defined any rows.")}if(a.tBodies.length&&!a.tBodies[0].rows.length){if(!e.options.data)throw new Error("You don't seem to have any rows in your table.");if(!e.options.data.rows)throw new Error("You seem to be using the data option, but you've not defined any rows.")}e.table=a,e.isIE=!!/(msie|trident)/i.test(navigator.userAgent),e.currentPage=1,e.onFirstPage=!0,c.call(e),setTimeout(function(){e.emit("datatable.init")},10)}var b={extend:function(a,b){var c;for(c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a},each:function(a,b,c){if("[object Object]"===Object.prototype.toString.call(a))for(var d in a)Object.prototype.hasOwnProperty.call(a,d)&&b.call(c,d,a[d],a);else for(var e=0,f=a.length;e-1},button:function(a,c,d){return b.createElement("li",{class:a,html:''+d+""})},flush:function(a,b){if(b)for(;a.hasChildNodes();)a.removeChild(a.firstChild);else a.innerHTML=""}},c=function(){var a=this;a.options.data&&j.call(a),a.tbody=a.table.tBodies[0];var c=b.createElement("div",{class:"dataTable-wrapper"});a.container=b.createElement("div",{class:"dataTable-container"}),a.label=b.createElement("div",{class:"dataTable-info"});var d=b.createElement("div",{class:"dataTable-top"}),e=b.createElement("div",{class:"dataTable-bottom"});if(a.options.perPageSelect){var f=b.createElement("div",{class:"dataTable-dropdown"}),g=b.createElement("label",{class:"dataTable-selectWrapper"}),i=b.createElement("select",{class:"dataTable-selector"});b.each(a.options.perPageSelect,function(a,c){b.append(i,b.createElement("option",{value:c,html:c}))}),i.value=a.options.perPage,b.append(g,i),g.insertAdjacentHTML("beforeend"," rows per page"),b.append(f,g),b.append(d,f),b.listen(i,"change",function(b){a.options.perPage=parseInt(this.value,10),a.update(),a.options.fixedHeight&&h.call(a),a.emit("datatable.perpage")})}if(a.options.searchable){var l=b.createElement("div",{class:"dataTable-search"});a.input=b.createElement("input",{type:"text",class:"dataTable-input",placeholder:"Search..."}),b.append(l,a.input),b.append(d,l),b.listen(a.input,"keyup",function(b){a.search(this.value)})}if(a.options.sortable){var m=a.table.tHead.rows[0].cells;b.each(m,function(a,c){var d=b.createElement("a",{href:"#",class:"dataTable-sorter",html:c.innerHTML});c.idx=a,c.innerHTML="",b.append(c,d)}),b.listen(a.table.tHead,"click",function(c){c=c||window.event;var d=c.target;"a"===d.nodeName.toLowerCase()&&b.hasClass(d,"dataTable-sorter")&&(a.sortColumn(d.parentNode.idx),b.preventDefault(c))})}b.addClass(a.table,"dataTable-table"),b.append(e,a.label),b.append(c,d),b.append(c,a.container),b.append(c,e);var n=b.createElement("div",{class:"dataTable-pagination"});if(a.paginator=b.createElement("ul"),b.append(n,a.paginator),b.append(e,n),b.listen(a.paginator,"click",function(c){var d=c.target;"a"===d.nodeName.toLowerCase()&&d.hasAttribute("data-page")&&(a.page(d.getAttribute("data-page")),b.preventDefault(c))}),a.table.parentNode.insertBefore(c,a.table),b.append(a.container,a.table),a.rect=b.getBoundingRect(a.table),a.rows=Array.prototype.slice.call(a.tbody.rows),k.mixin(a),a.update(),a.options.fixedHeight&&(h.call(a),b.addClass(a.table,"fixed-height")),a.options.fixedColumns){var o=a.table.tHead.rows[0].cells;b.each(o,function(c,d){var e=b.getBoundingRect(d),f=e.width/a.rect.width*100;d.style.width=f+"%"}),b.addClass(a.table,"fixed-columns")}},d=function(){var a=this,b=a.options.perPage,c=a.searching?a.searchData:a.rows;a.pages=c.map(function(a,d){return d%b===0?c.slice(d,d+b):null}).filter(function(a){return a}),a.totalPages=a.lastPage=a.pages.length},e=function(){var a=this;if(a.totalPages){a.currentPage>a.totalPages&&(a.currentPage=1);var c=a.currentPage-1,d=b.createFragment();switch(b.each(a.pages[c],function(a,c){b.append(d,c)}),a.clear(d),a.onFirstPage=!1,a.onLastPage=!1,a.currentPage){case 1:a.onFirstPage=!0;break;case a.lastPage:a.onLastPage=!0}}var i,e=0,f=0,g=0;a.totalPages&&(e=a.currentPage-1,f=e*a.options.perPage,g=f+a.pages[e].length,f+=1,i=a.searching?a.searchData.length:a.rows.length),a.label.innerHTML=["Showing ",f," to ",g," of ",i," rows"].join(""),a.options.fixedHeight&&1==a.currentPage&&h.call(a)},f=function(){var a=this;if(b.flush(a.paginator,a.isIE),!(a.totalPages<=1)){var c="pager",d=b.createFragment(),e=a.onFirstPage?1:a.currentPage-1,f=a.onlastPage?a.totalPages:a.currentPage+1;a.options.firstLast&&b.append(d,b.button(c,1,a.options.firstText)),a.options.nextPrev&&b.append(d,b.button(c,e,a.options.prevText));var g=a.links;a.options.truncatePager&&(g=i(a.links,a.currentPage,a.pages.length,a.options.pagerDelta)),b.addClass(a.links[a.currentPage-1],"active"),b.each(g,function(a,c){b.removeClass(c,"active"),b.append(d,c)}),b.addClass(a.links[a.currentPage-1],"active"),a.options.nextPrev&&b.append(d,b.button(c,f,a.options.nextText)),a.options.firstLast&&b.append(d,b.button(c,a.totalPages,a.options.lastText)),b.append(a.paginator,d)}},g=function(a,b){var c,d;1===b?(c=0,d=a.length):b===-1&&(c=a.length-1,d=-1);for(var e=!0;e;){e=!1;for(var f=c;f!=d;f+=b)if(a[f+b]&&a[f].value>a[f+b].value){var g=a[f],h=a[f+b],i=g;a[f]=h,a[f+b]=i,e=!0}}return a},h=function(){this.container.style.height=null,this.rect=b.getBoundingRect(this.container),this.container.style.height=this.rect.height+"px"},i=function(a,c,d,e){e=e||2;var f,g=2*e,h=c-e,i=c+e,j=[],k=[];c<4-e+g?i=3+g:c>d-(3-e+g)&&(h=d-(2+g));for(var l=1;l<=d;l++)if(1==l||l==d||l>=h&&l<=i){var m=a[l-1];b.removeClass(m,"active"),j.push(m)}return b.each(j,function(c,d){var e=d.children[0].getAttribute("data-page");if(f){var g=f.children[0].getAttribute("data-page");if(e-g==2)k.push(a[g]);else if(e-g!=1){var h=b.createElement("li",{class:"ellipsis",html:''});k.push(h)}}k.push(d),f=d}),k},j=function(){var a=this.options.data,c=!1,d=!1;if(a.headings){c=b.createElement("thead");var e=b.createElement("tr");b.each(a.headings,function(a,c){var d=b.createElement("th",{html:c});e.appendChild(d)}),c.appendChild(e)}a.rows&&(d=b.createElement("tbody"),b.each(a.rows,function(c,e){if(a.headings&&a.headings.length!==e.length)throw new Error("The number of rows do not match the number of headings.");var f=b.createElement("tr");b.each(e,function(a,c){var d=b.createElement("td",{html:c});f.appendChild(d)}),d.appendChild(f)})),c&&(null!==this.table.tHead&&this.table.removeChild(this.table.tHead),b.append(this.table,c)),d&&(this.table.tBodies.length&&this.table.removeChild(this.table.tBodies[0]),b.append(this.table,d))},k=function(){};return k.prototype={on:function(a,b){this._events=this._events||{},this._events[a]=this._events[a]||[],this._events[a].push(b)},off:function(a,b){this._events=this._events||{},a in this._events!=!1&&this._events[a].splice(this._events[a].indexOf(b),1)},emit:function(a){if(this._events=this._events||{},a in this._events!=!1)for(var b=0;bb.pages.length||a<0||(e.call(b),f.call(b),b.emit("datatable.page",a)))},l.prototype.sortColumn=function(a,c){var e,d=this,f=d.searching?d.searchData:d.rows,h=[],i=[],j=0,k=0,l=d.table.tHead.rows[0].cells[a];b.each(f,function(a,b){var c=b.cells[l.idx],d=c.textContent,e=d.replace(/(\$|\,|\s)/g,"");parseFloat(e)==e?i[k++]={value:Number(e),row:b}:h[j++]={value:d,row:b}});var m,n;b.hasClass(l,"asc")||"asc"==c?(m=g(h,-1),n=g(i,-1),e="descending",b.removeClass(l,"asc"),b.addClass(l,"desc")):(m=g(i,1),n=g(h,1),e="ascending",b.removeClass(l,"desc"),b.addClass(l,"asc")),this.lastTh&&l!=this.lastTh&&(b.removeClass(this.lastTh,"desc"),b.removeClass(this.lastTh,"asc")),this.lastTh=l,f=m.concat(n),d.searching?(d.searchData=[],b.each(f,function(a,b){d.searchData.push(b.row)})):(d.rows=[],b.each(f,function(a,b){d.rows.push(b.row)})),d.update(),d.emit("datatable.sort",a,e)},l.prototype.addRows=function(a){if("[object Object]"!==Object.prototype.toString.call(a))throw new Error("Function addRows: The method requires an object.");if(!a.rows)throw new Error("Function addRows: Your object is missing the 'rows' property.");var c=this;b.each(a.rows,function(a,d){var e=b.createElement("tr");b.each(d,function(a,c){var d=b.createElement("td",{html:c});e.appendChild(d)}),c.rows.push(e)}),this.update()},l.prototype.refresh=function(){this.input.value="",this.searching=!1,this.update(),this.emit("datatable.refresh")},l.prototype.clear=function(a){this.tbody&&b.flush(this.tbody,this.isIE);var c=this.tbody;this.tbody||(c=this.table),a&&b.append(c,a)},l.prototype.setMessage=function(a){var c=this.table.tHead.rows[0].cells.length;this.clear(b.createElement("tr",{html:''+a+""}))},l}); +!function(a,b){var c="DataTable";"function"==typeof define&&define.amd?define([],b(c)):"object"==typeof exports?module.exports=b(c):a[c]=b(c)}(this,function(a){"use strict";function l(a,d){var e=this,f={perPage:10,perPageSelect:[5,10,15,20,25],nextPrev:!0,firstLast:!1,prevText:"‹",nextText:"›",firstText:"«",lastText:"»",sortable:!0,searchable:!0,fixedColumns:!0,fixedHeight:!1,truncatePager:!0,pagerDelta:2};if(e.options=b.extend(f,d),!a)throw new Error("The plugin requires a table as the first parameter");if("string"==typeof a){var g=a;if(a=document.querySelector(a),!a)throw new Error("The element '"+g+"' can not be found.")}if("table"!==a.tagName.toLowerCase())throw new Error("The selected element is not a table.");if(null===a.tHead&&e.options.sortable&&(!e.options.data||e.options.data&&!e.options.data.headings)&&(e.options.sortable=!1),!a.tBodies.length){if(!e.options.data)throw new Error("You don't seem to have a tbody in your table.");if(!e.options.data.rows)throw new Error("You seem to be using the data option, but you've not defined any rows.")}if(a.tBodies.length&&!a.tBodies[0].rows.length){if(!e.options.data)throw new Error("You don't seem to have any rows in your table.");if(!e.options.data.rows)throw new Error("You seem to be using the data option, but you've not defined any rows.")}e.table=a,e.isIE=!!/(msie|trident)/i.test(navigator.userAgent),e.currentPage=1,e.onFirstPage=!0,c.call(e),setTimeout(function(){e.emit("datatable.init")},10)}var b={extend:function(a,b){var c;for(c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a},each:function(a,b,c){if("[object Object]"===Object.prototype.toString.call(a))for(var d in a)Object.prototype.hasOwnProperty.call(a,d)&&b.call(c,d,a[d],a);else for(var e=0,f=a.length;e-1},button:function(a,c,d){return b.createElement("li",{class:a,html:''+d+""})},flush:function(a,b){if(b)for(;a.hasChildNodes();)a.removeChild(a.firstChild);else a.innerHTML=""}},c=function(){var a=this;a.options.data&&j.call(a),a.tbody=a.table.tBodies[0];var c=b.createElement("div",{class:"dataTable-wrapper"});a.container=b.createElement("div",{class:"dataTable-container"}),a.label=b.createElement("div",{class:"dataTable-info"});var d=b.createElement("div",{class:"dataTable-top"}),e=b.createElement("div",{class:"dataTable-bottom"});if(a.options.perPageSelect){var f=b.createElement("div",{class:"dataTable-dropdown"}),g=b.createElement("label",{class:"dataTable-selectWrapper"}),i=b.createElement("select",{class:"dataTable-selector"});b.each(a.options.perPageSelect,function(a,c){b.append(i,b.createElement("option",{value:c,html:c}))}),i.value=a.options.perPage,b.append(g,i),g.insertAdjacentHTML("beforeend"," rows per page"),b.append(f,g),b.append(d,f),b.listen(i,"change",function(b){a.options.perPage=parseInt(this.value,10),a.update(),a.options.fixedHeight&&h.call(a),a.emit("datatable.perpage")})}if(a.options.searchable){var l=b.createElement("div",{class:"dataTable-search"});a.input=b.createElement("input",{type:"text",class:"dataTable-input",placeholder:"Search..."}),b.append(l,a.input),b.append(d,l),b.listen(a.input,"keyup",function(b){a.search(this.value)})}if(a.options.sortable){var m=a.table.tHead.rows[0].cells;b.each(m,function(a,c){var d=b.createElement("a",{href:"#",class:"dataTable-sorter",html:c.innerHTML});c.idx=a,c.innerHTML="",b.append(c,d)}),b.listen(a.table.tHead,"click",function(c){c=c||window.event;var d=c.target;"a"===d.nodeName.toLowerCase()&&b.hasClass(d,"dataTable-sorter")&&(a.sortColumn(d.parentNode.idx),b.preventDefault(c))})}b.addClass(a.table,"dataTable-table"),b.append(e,a.label),b.append(c,d),b.append(c,a.container),b.append(c,e);var n=b.createElement("div",{class:"dataTable-pagination"});if(a.paginator=b.createElement("ul"),b.append(n,a.paginator),b.append(e,n),b.listen(a.paginator,"click",function(c){var d=c.target;"a"===d.nodeName.toLowerCase()&&d.hasAttribute("data-page")&&(a.page(d.getAttribute("data-page")),b.preventDefault(c))}),a.table.parentNode.insertBefore(c,a.table),b.append(a.container,a.table),a.rect=b.getBoundingRect(a.table),a.rows=Array.prototype.slice.call(a.tbody.rows),k.mixin(a),a.update(),a.options.fixedHeight&&(h.call(a),b.addClass(a.table,"fixed-height")),a.options.fixedColumns){var o,p=!1;if(a.table.tHead)o=a.table.tHead.rows[0].cells,b.each(o,function(c,d){var e=b.getBoundingRect(d),f=e.width/a.rect.width*100;d.style.width=f+"%"});else{o=[],p=b.createElement("thead");var q=b.createElement("tr"),r=a.table.tBodies[0].rows[0].cells;b.each(r,function(a,c){var d=b.createElement("th");q.appendChild(d),o.push(d)}),p.appendChild(q),a.table.insertBefore(p,a.table.tBodies[0]);var s=[];b.each(o,function(c,d){var e=b.getBoundingRect(d),f=e.width/a.rect.width*100;s.push(f)}),b.each(this.rows,function(a,c){b.each(c.cells,function(a,b){b.style.width=s[a]+"%"})}),a.table.removeChild(p)}b.addClass(a.table,"fixed-columns")}},d=function(){var a=this,b=a.options.perPage,c=a.searching?a.searchData:a.rows;a.pages=c.map(function(a,d){return d%b===0?c.slice(d,d+b):null}).filter(function(a){return a}),a.totalPages=a.lastPage=a.pages.length},e=function(){var a=this;if(a.totalPages){a.currentPage>a.totalPages&&(a.currentPage=1);var c=a.currentPage-1,d=b.createFragment();switch(b.each(a.pages[c],function(a,c){b.append(d,c)}),a.clear(d),a.onFirstPage=!1,a.onLastPage=!1,a.currentPage){case 1:a.onFirstPage=!0;break;case a.lastPage:a.onLastPage=!0}}var i,e=0,f=0,g=0;a.totalPages&&(e=a.currentPage-1,f=e*a.options.perPage,g=f+a.pages[e].length,f+=1,i=a.searching?a.searchData.length:a.rows.length),a.label.innerHTML=["Showing ",f," to ",g," of ",i," rows"].join(""),a.options.fixedHeight&&1==a.currentPage&&h.call(a)},f=function(){var a=this;if(b.flush(a.paginator,a.isIE),!(a.totalPages<=1)){var c="pager",d=b.createFragment(),e=a.onFirstPage?1:a.currentPage-1,f=a.onlastPage?a.totalPages:a.currentPage+1;a.options.firstLast&&b.append(d,b.button(c,1,a.options.firstText)),a.options.nextPrev&&b.append(d,b.button(c,e,a.options.prevText));var g=a.links;a.options.truncatePager&&(g=i(a.links,a.currentPage,a.pages.length,a.options.pagerDelta)),b.addClass(a.links[a.currentPage-1],"active"),b.each(g,function(a,c){b.removeClass(c,"active"),b.append(d,c)}),b.addClass(a.links[a.currentPage-1],"active"),a.options.nextPrev&&b.append(d,b.button(c,f,a.options.nextText)),a.options.firstLast&&b.append(d,b.button(c,a.totalPages,a.options.lastText)),b.append(a.paginator,d)}},g=function(a,b){var c,d;1===b?(c=0,d=a.length):b===-1&&(c=a.length-1,d=-1);for(var e=!0;e;){e=!1;for(var f=c;f!=d;f+=b)if(a[f+b]&&a[f].value>a[f+b].value){var g=a[f],h=a[f+b],i=g;a[f]=h,a[f+b]=i,e=!0}}return a},h=function(){this.container.style.height=null,this.rect=b.getBoundingRect(this.container),this.container.style.height=this.rect.height+"px"},i=function(a,c,d,e){e=e||2;var f,g=2*e,h=c-e,i=c+e,j=[],k=[];c<4-e+g?i=3+g:c>d-(3-e+g)&&(h=d-(2+g));for(var l=1;l<=d;l++)if(1==l||l==d||l>=h&&l<=i){var m=a[l-1];b.removeClass(m,"active"),j.push(m)}return b.each(j,function(c,d){var e=d.children[0].getAttribute("data-page");if(f){var g=f.children[0].getAttribute("data-page");if(e-g==2)k.push(a[g]);else if(e-g!=1){var h=b.createElement("li",{class:"ellipsis",html:''});k.push(h)}}k.push(d),f=d}),k},j=function(){var a=this.options.data,c=!1,d=!1;if(a.headings){c=b.createElement("thead");var e=b.createElement("tr");b.each(a.headings,function(a,c){var d=b.createElement("th",{html:c});e.appendChild(d)}),c.appendChild(e)}a.rows&&(d=b.createElement("tbody"),b.each(a.rows,function(c,e){if(a.headings&&a.headings.length!==e.length)throw new Error("The number of rows do not match the number of headings.");var f=b.createElement("tr");b.each(e,function(a,c){var d=b.createElement("td",{html:c});f.appendChild(d)}),d.appendChild(f)})),c&&(null!==this.table.tHead&&this.table.removeChild(this.table.tHead),b.append(this.table,c)),d&&(this.table.tBodies.length&&this.table.removeChild(this.table.tBodies[0]),b.append(this.table,d))},k=function(){};return k.prototype={on:function(a,b){this._events=this._events||{},this._events[a]=this._events[a]||[],this._events[a].push(b)},off:function(a,b){this._events=this._events||{},a in this._events!=!1&&this._events[a].splice(this._events[a].indexOf(b),1)},emit:function(a){if(this._events=this._events||{},a in this._events!=!1)for(var b=0;bb.pages.length||a<0||(e.call(b),f.call(b),b.emit("datatable.page",a)))},l.prototype.sortColumn=function(a,c){var e,d=this,f=d.searching?d.searchData:d.rows,h=[],i=[],j=0,k=0,l=d.table.tHead.rows[0].cells[a];b.each(f,function(a,b){var c=b.cells[l.idx],d=c.textContent,e=d.replace(/(\$|\,|\s)/g,"");parseFloat(e)==e?i[k++]={value:Number(e),row:b}:h[j++]={value:d,row:b}});var m,n;b.hasClass(l,"asc")||"asc"==c?(m=g(h,-1),n=g(i,-1),e="descending",b.removeClass(l,"asc"),b.addClass(l,"desc")):(m=g(i,1),n=g(h,1),e="ascending",b.removeClass(l,"desc"),b.addClass(l,"asc")),this.lastTh&&l!=this.lastTh&&(b.removeClass(this.lastTh,"desc"),b.removeClass(this.lastTh,"asc")),this.lastTh=l,f=m.concat(n),d.searching?(d.searchData=[],b.each(f,function(a,b){d.searchData.push(b.row)})):(d.rows=[],b.each(f,function(a,b){d.rows.push(b.row)})),d.update(),d.emit("datatable.sort",a,e)},l.prototype.addRows=function(a){if("[object Object]"!==Object.prototype.toString.call(a))throw new Error("Function addRows: The method requires an object.");if(!a.rows)throw new Error("Function addRows: Your object is missing the 'rows' property.");var c=this;b.each(a.rows,function(a,d){var e=b.createElement("tr");b.each(d,function(a,c){var d=b.createElement("td",{html:c});e.appendChild(d)}),c.rows.push(e)}),this.update()},l.prototype.refresh=function(){this.input.value="",this.searching=!1,this.update(),this.emit("datatable.refresh")},l.prototype.clear=function(a){this.tbody&&b.flush(this.tbody,this.isIE);var c=this.tbody;this.tbody||(c=this.table),a&&b.append(c,a)},l.prototype.setMessage=function(a){var c=this.table.tBodies[0].rows[0].cells.length;this.clear(b.createElement("tr",{html:''+a+""}))},l});