From 36cdc059be7604459ac3cd38a23866deec66c54e Mon Sep 17 00:00:00 2001 From: Alan Pippin Date: Wed, 27 Oct 2010 17:23:42 -0600 Subject: [PATCH] Moved jquery into a subdirectory to keep it better organized with other jquery plugins --- inc/class.tc.inc.php | 2 +- inc/{ => jquery}/jquery-1.4.3.js | 0 inc/{ => jquery}/jquery.js | 0 inc/jquery/tablesorter/jquery.metadata.js | 122 ++ inc/jquery/tablesorter/jquery.tablesorter.js | 1031 +++++++++++++++++ inc/jquery/tablesorter/themes/blue/asc.gif | Bin 0 -> 54 bytes inc/jquery/tablesorter/themes/blue/bg.gif | Bin 0 -> 64 bytes inc/jquery/tablesorter/themes/blue/blue.zip | Bin 0 -> 885 bytes inc/jquery/tablesorter/themes/blue/desc.gif | Bin 0 -> 54 bytes inc/jquery/tablesorter/themes/blue/style.css | 39 + inc/jquery/tablesorter/themes/green/asc.png | Bin 0 -> 2665 bytes inc/jquery/tablesorter/themes/green/bg.png | Bin 0 -> 2655 bytes inc/jquery/tablesorter/themes/green/desc.png | Bin 0 -> 2662 bytes inc/jquery/tablesorter/themes/green/green.zip | Bin 0 -> 8464 bytes inc/jquery/tablesorter/themes/green/style.css | 39 + 15 files changed, 1232 insertions(+), 1 deletion(-) rename inc/{ => jquery}/jquery-1.4.3.js (100%) rename inc/{ => jquery}/jquery.js (100%) create mode 100644 inc/jquery/tablesorter/jquery.metadata.js create mode 100644 inc/jquery/tablesorter/jquery.tablesorter.js create mode 100644 inc/jquery/tablesorter/themes/blue/asc.gif create mode 100644 inc/jquery/tablesorter/themes/blue/bg.gif create mode 100644 inc/jquery/tablesorter/themes/blue/blue.zip create mode 100644 inc/jquery/tablesorter/themes/blue/desc.gif create mode 100644 inc/jquery/tablesorter/themes/blue/style.css create mode 100644 inc/jquery/tablesorter/themes/green/asc.png create mode 100644 inc/jquery/tablesorter/themes/green/bg.png create mode 100644 inc/jquery/tablesorter/themes/green/desc.png create mode 100644 inc/jquery/tablesorter/themes/green/green.zip create mode 100644 inc/jquery/tablesorter/themes/green/style.css diff --git a/inc/class.tc.inc.php b/inc/class.tc.inc.php index ac36a1e..0346ade 100644 --- a/inc/class.tc.inc.php +++ b/inc/class.tc.inc.php @@ -412,7 +412,7 @@ class tc $this->t->set_block('ht_sandbox_t','companionship_table_list','ct_list'); $this->t->set_var('submit_action',$GLOBALS['phpgw']->link('/tc/index.php','menuaction=tc.tc.ht_sandbox&action=add')); - $this->t->set_var('jquery_url',$GLOBALS['phpgw']->link('inc/jquery.js')); + $this->t->set_var('jquery_url',$GLOBALS['phpgw']->link('inc/jquery/jquery.js')); $action = get_var('action',array('GET','POST')); diff --git a/inc/jquery-1.4.3.js b/inc/jquery/jquery-1.4.3.js similarity index 100% rename from inc/jquery-1.4.3.js rename to inc/jquery/jquery-1.4.3.js diff --git a/inc/jquery.js b/inc/jquery/jquery.js similarity index 100% rename from inc/jquery.js rename to inc/jquery/jquery.js diff --git a/inc/jquery/tablesorter/jquery.metadata.js b/inc/jquery/tablesorter/jquery.metadata.js new file mode 100644 index 0000000..6a984db --- /dev/null +++ b/inc/jquery/tablesorter/jquery.metadata.js @@ -0,0 +1,122 @@ +/* + * Metadata - jQuery plugin for parsing metadata from elements + * + * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id$ + * + */ + +/** + * Sets the type of metadata to use. Metadata is encoded in JSON, and each property + * in the JSON will become a property of the element itself. + * + * There are three supported types of metadata storage: + * + * attr: Inside an attribute. The name parameter indicates *which* attribute. + * + * class: Inside the class attribute, wrapped in curly braces: { } + * + * elem: Inside a child element (e.g. a script tag). The + * name parameter indicates *which* element. + * + * The metadata for an element is loaded the first time the element is accessed via jQuery. + * + * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements + * matched by expr, then redefine the metadata type and run another $(expr) for other elements. + * + * @name $.metadata.setType + * + * @example

This is a p

+ * @before $.metadata.setType("class") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from the class attribute + * + * @example

This is a p

+ * @before $.metadata.setType("attr", "data") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a "data" attribute + * + * @example

This is a p

+ * @before $.metadata.setType("elem", "script") + * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" + * @desc Reads metadata from a nested script element + * + * @param String type The encoding type + * @param String name The name of the attribute to be used to get metadata (optional) + * @cat Plugins/Metadata + * @descr Sets the type of encoding to be used when loading metadata for the first time + * @type undefined + * @see metadata() + */ + +(function($) { + +$.extend({ + metadata : { + defaults : { + type: 'class', + name: 'metadata', + cre: /({.*})/, + single: 'metadata' + }, + setType: function( type, name ){ + this.defaults.type = type; + this.defaults.name = name; + }, + get: function( elem, opts ){ + var settings = $.extend({},this.defaults,opts); + // check for empty string in single property + if ( !settings.single.length ) settings.single = 'metadata'; + + var data = $.data(elem, settings.single); + // returned cached data if it already exists + if ( data ) return data; + + data = "{}"; + + if ( settings.type == "class" ) { + var m = settings.cre.exec( elem.className ); + if ( m ) + data = m[1]; + } else if ( settings.type == "elem" ) { + if( !elem.getElementsByTagName ) + return undefined; + var e = elem.getElementsByTagName(settings.name); + if ( e.length ) + data = $.trim(e[0].innerHTML); + } else if ( elem.getAttribute != undefined ) { + var attr = elem.getAttribute( settings.name ); + if ( attr ) + data = attr; + } + + if ( data.indexOf( '{' ) <0 ) + data = "{" + data + "}"; + + data = eval("(" + data + ")"); + + $.data( elem, settings.single, data ); + return data; + } + } +}); + +/** + * Returns the metadata object for the first member of the jQuery object. + * + * @name metadata + * @descr Returns element's metadata object + * @param Object opts An object contianing settings to override the defaults + * @type jQuery + * @cat Plugins/Metadata + */ +$.fn.metadata = function( opts ){ + return $.metadata.get( this[0], opts ); +}; + +})(jQuery); \ No newline at end of file diff --git a/inc/jquery/tablesorter/jquery.tablesorter.js b/inc/jquery/tablesorter/jquery.tablesorter.js new file mode 100644 index 0000000..9b58731 --- /dev/null +++ b/inc/jquery/tablesorter/jquery.tablesorter.js @@ -0,0 +1,1031 @@ +/* + * + * TableSorter 2.0 - Client-side table sorting with ease! + * Version 2.0.5b + * @requires jQuery v1.2.3 + * + * Copyright (c) 2007 Christian Bach + * Examples and docs at: http://tablesorter.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ +/** + * + * @description Create a sortable table with multi-column sorting capabilitys + * + * @example $('table').tablesorter(); + * @desc Create a simple tablesorter interface. + * + * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] }); + * @desc Create a tablesorter interface and sort on the first and secound column column headers. + * + * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } }); + * + * @desc Create a tablesorter interface and disableing the first and second column headers. + * + * + * @example $('table').tablesorter({ headers: { 0: {sorter:"integer"}, 1: {sorter:"currency"} } }); + * + * @desc Create a tablesorter interface and set a column parser for the first + * and second column. + * + * + * @param Object + * settings An object literal containing key/value pairs to provide + * optional settings. + * + * + * @option String cssHeader (optional) A string of the class name to be appended + * to sortable tr elements in the thead of the table. Default value: + * "header" + * + * @option String cssAsc (optional) A string of the class name to be appended to + * sortable tr elements in the thead on a ascending sort. Default value: + * "headerSortUp" + * + * @option String cssDesc (optional) A string of the class name to be appended + * to sortable tr elements in the thead on a descending sort. Default + * value: "headerSortDown" + * + * @option String sortInitialOrder (optional) A string of the inital sorting + * order can be asc or desc. Default value: "asc" + * + * @option String sortMultisortKey (optional) A string of the multi-column sort + * key. Default value: "shiftKey" + * + * @option String textExtraction (optional) A string of the text-extraction + * method to use. For complex html structures inside td cell set this + * option to "complex", on large tables the complex option can be slow. + * Default value: "simple" + * + * @option Object headers (optional) An array containing the forces sorting + * rules. This option let's you specify a default sorting rule. Default + * value: null + * + * @option Array sortList (optional) An array containing the forces sorting + * rules. This option let's you specify a default sorting rule. Default + * value: null + * + * @option Array sortForce (optional) An array containing forced sorting rules. + * This option let's you specify a default sorting rule, which is + * prepended to user-selected rules. Default value: null + * + * @option Boolean sortLocaleCompare (optional) Boolean flag indicating whatever + * to use String.localeCampare method or not. Default set to true. + * + * + * @option Array sortAppend (optional) An array containing forced sorting rules. + * This option let's you specify a default sorting rule, which is + * appended to user-selected rules. Default value: null + * + * @option Boolean widthFixed (optional) Boolean flag indicating if tablesorter + * should apply fixed widths to the table columns. This is usefull when + * using the pager companion plugin. This options requires the dimension + * jquery plugin. Default value: false + * + * @option Boolean cancelSelection (optional) Boolean flag indicating if + * tablesorter should cancel selection of the table headers text. + * Default value: true + * + * @option Boolean debug (optional) Boolean flag indicating if tablesorter + * should display debuging information usefull for development. + * + * @type jQuery + * + * @name tablesorter + * + * @cat Plugins/Tablesorter + * + * @author Christian Bach/christian.bach@polyester.se + */ + +(function ($) { + $.extend({ + tablesorter: new + function () { + + var parsers = [], + widgets = []; + + this.defaults = { + cssHeader: "header", + cssAsc: "headerSortUp", + cssDesc: "headerSortDown", + cssChildRow: "expand-child", + sortInitialOrder: "asc", + sortMultiSortKey: "shiftKey", + sortForce: null, + sortAppend: null, + sortLocaleCompare: true, + textExtraction: "simple", + parsers: {}, widgets: [], + widgetZebra: { + css: ["even", "odd"] + }, headers: {}, widthFixed: false, + cancelSelection: true, + sortList: [], + headerList: [], + dateFormat: "us", + decimal: '/\.|\,/g', + onRenderHeader: null, + selectorHeaders: 'thead th', + debug: false + }; + + /* debuging utils */ + + function benchmark(s, d) { + log(s + "," + (new Date().getTime() - d.getTime()) + "ms"); + } + + this.benchmark = benchmark; + + function log(s) { + if (typeof console != "undefined" && typeof console.debug != "undefined") { + console.log(s); + } else { + alert(s); + } + } + + /* parsers utils */ + + function buildParserCache(table, $headers) { + + if (table.config.debug) { + var parsersDebug = ""; + } + + if (table.tBodies.length == 0) return; // In the case of empty tables + var rows = table.tBodies[0].rows; + + if (rows[0]) { + + var list = [], + cells = rows[0].cells, + l = cells.length; + + for (var i = 0; i < l; i++) { + + var p = false; + + if ($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)) { + + p = getParserById($($headers[i]).metadata().sorter); + + } else if ((table.config.headers[i] && table.config.headers[i].sorter)) { + + p = getParserById(table.config.headers[i].sorter); + } + if (!p) { + + p = detectParserForColumn(table, rows, -1, i); + } + + if (table.config.debug) { + parsersDebug += "column:" + i + " parser:" + p.id + "\n"; + } + + list.push(p); + } + } + + if (table.config.debug) { + log(parsersDebug); + } + + return list; + }; + + function detectParserForColumn(table, rows, rowIndex, cellIndex) { + var l = parsers.length, + node = false, + nodeValue = false, + keepLooking = true; + while (nodeValue == '' && keepLooking) { + rowIndex++; + if (rows[rowIndex]) { + node = getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex); + nodeValue = trimAndGetNodeText(table.config, node); + if (table.config.debug) { + log('Checking if value was empty on row:' + rowIndex); + } + } else { + keepLooking = false; + } + } + for (var i = 1; i < l; i++) { + if (parsers[i].is(nodeValue, table, node)) { + return parsers[i]; + } + } + // 0 is always the generic parser (text) + return parsers[0]; + } + + function getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex) { + return rows[rowIndex].cells[cellIndex]; + } + + function trimAndGetNodeText(config, node) { + return $.trim(getElementText(config, node)); + } + + function getParserById(name) { + var l = parsers.length; + for (var i = 0; i < l; i++) { + if (parsers[i].id.toLowerCase() == name.toLowerCase()) { + return parsers[i]; + } + } + return false; + } + + /* utils */ + + function buildCache(table) { + + if (table.config.debug) { + var cacheTime = new Date(); + } + + var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0, + totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0, + parsers = table.config.parsers, + cache = { + row: [], + normalized: [] + }; + + for (var i = 0; i < totalRows; ++i) { + + /** Add the table data to main data array */ + var c = $(table.tBodies[0].rows[i]), + cols = []; + + // if this is a child row, add it to the last row's children and + // continue to the next row + if (c.hasClass(table.config.cssChildRow)) { + cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add(c); + // go to the next for loop + continue; + } + + cache.row.push(c); + + for (var j = 0; j < totalCells; ++j) { + cols.push(parsers[j].format(getElementText(table.config, c[0].cells[j]), table, c[0].cells[j])); + } + + cols.push(cache.normalized.length); // add position for rowCache + cache.normalized.push(cols); + cols = null; + }; + + if (table.config.debug) { + benchmark("Building cache for " + totalRows + " rows:", cacheTime); + } + + return cache; + }; + + function getElementText(config, node) { + + var text = ""; + + if (!node) return ""; + + if (!config.supportsTextContent) config.supportsTextContent = node.textContent || false; + + if (config.textExtraction == "simple") { + if (config.supportsTextContent) { + text = node.textContent; + } else { + if (node.childNodes[0] && node.childNodes[0].hasChildNodes()) { + text = node.childNodes[0].innerHTML; + } else { + text = node.innerHTML; + } + } + } else { + if (typeof(config.textExtraction) == "function") { + text = config.textExtraction(node); + } else { + text = $(node).text(); + } + } + return text; + } + + function appendToTable(table, cache) { + + if (table.config.debug) { + var appendTime = new Date() + } + + var c = cache, + r = c.row, + n = c.normalized, + totalRows = n.length, + checkCell = (n[0].length - 1), + tableBody = $(table.tBodies[0]), + rows = []; + + + for (var i = 0; i < totalRows; i++) { + var pos = n[i][checkCell]; + + rows.push(r[pos]); + + if (!table.config.appender) { + + //var o = ; + var l = r[pos].length; + for (var j = 0; j < l; j++) { + tableBody[0].appendChild(r[pos][j]); + } + + // + } + } + + + + if (table.config.appender) { + + table.config.appender(table, rows); + } + + rows = null; + + if (table.config.debug) { + benchmark("Rebuilt table:", appendTime); + } + + // apply table widgets + applyWidget(table); + + // trigger sortend + setTimeout(function () { + $(table).trigger("sortEnd"); + }, 0); + + }; + + function buildHeaders(table) { + + if (table.config.debug) { + var time = new Date(); + } + + var meta = ($.metadata) ? true : false; + + var header_index = computeTableHeaderCellIndexes(table); + + $tableHeaders = $(table.config.selectorHeaders, table).each(function (index) { + + this.column = header_index[this.parentNode.rowIndex + "-" + this.cellIndex]; + // this.column = index; + this.order = formatSortingOrder(table.config.sortInitialOrder); + + + this.count = this.order; + + if (checkHeaderMetadata(this) || checkHeaderOptions(table, index)) this.sortDisabled = true; + if (checkHeaderOptionsSortingLocked(table, index)) this.order = this.lockedOrder = checkHeaderOptionsSortingLocked(table, index); + + if (!this.sortDisabled) { + var $th = $(this).addClass(table.config.cssHeader); + if (table.config.onRenderHeader) table.config.onRenderHeader.apply($th); + } + + // add cell to headerList + table.config.headerList[index] = this; + }); + + if (table.config.debug) { + benchmark("Built headers:", time); + log($tableHeaders); + } + + return $tableHeaders; + + }; + + // from: + // http://www.javascripttoolbox.com/lib/table/examples.php + // http://www.javascripttoolbox.com/temp/table_cellindex.html + + + function computeTableHeaderCellIndexes(t) { + var matrix = []; + var lookup = {}; + var thead = t.getElementsByTagName('THEAD')[0]; + var trs = thead.getElementsByTagName('TR'); + + for (var i = 0; i < trs.length; i++) { + var cells = trs[i].cells; + for (var j = 0; j < cells.length; j++) { + var c = cells[j]; + + var rowIndex = c.parentNode.rowIndex; + var cellId = rowIndex + "-" + c.cellIndex; + var rowSpan = c.rowSpan || 1; + var colSpan = c.colSpan || 1 + var firstAvailCol; + if (typeof(matrix[rowIndex]) == "undefined") { + matrix[rowIndex] = []; + } + // Find first available column in the first row + for (var k = 0; k < matrix[rowIndex].length + 1; k++) { + if (typeof(matrix[rowIndex][k]) == "undefined") { + firstAvailCol = k; + break; + } + } + lookup[cellId] = firstAvailCol; + for (var k = rowIndex; k < rowIndex + rowSpan; k++) { + if (typeof(matrix[k]) == "undefined") { + matrix[k] = []; + } + var matrixrow = matrix[k]; + for (var l = firstAvailCol; l < firstAvailCol + colSpan; l++) { + matrixrow[l] = "x"; + } + } + } + } + return lookup; + } + + function checkCellColSpan(table, rows, row) { + var arr = [], + r = table.tHead.rows, + c = r[row].cells; + + for (var i = 0; i < c.length; i++) { + var cell = c[i]; + + if (cell.colSpan > 1) { + arr = arr.concat(checkCellColSpan(table, headerArr, row++)); + } else { + if (table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row + 1])) { + arr.push(cell); + } + // headerArr[row] = (i+row); + } + } + return arr; + }; + + function checkHeaderMetadata(cell) { + if (($.metadata) && ($(cell).metadata().sorter === false)) { + return true; + }; + return false; + } + + function checkHeaderOptions(table, i) { + if ((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { + return true; + }; + return false; + } + + function checkHeaderOptionsSortingLocked(table, i) { + if ((table.config.headers[i]) && (table.config.headers[i].lockedOrder)) return table.config.headers[i].lockedOrder; + return false; + } + + function applyWidget(table) { + var c = table.config.widgets; + var l = c.length; + for (var i = 0; i < l; i++) { + + getWidgetById(c[i]).format(table); + } + + } + + function getWidgetById(name) { + var l = widgets.length; + for (var i = 0; i < l; i++) { + if (widgets[i].id.toLowerCase() == name.toLowerCase()) { + return widgets[i]; + } + } + }; + + function formatSortingOrder(v) { + if (typeof(v) != "Number") { + return (v.toLowerCase() == "desc") ? 1 : 0; + } else { + return (v == 1) ? 1 : 0; + } + } + + function isValueInArray(v, a) { + var l = a.length; + for (var i = 0; i < l; i++) { + if (a[i][0] == v) { + return true; + } + } + return false; + } + + function setHeadersCss(table, $headers, list, css) { + // remove all header information + $headers.removeClass(css[0]).removeClass(css[1]); + + var h = []; + $headers.each(function (offset) { + if (!this.sortDisabled) { + h[this.column] = $(this); + } + }); + + var l = list.length; + for (var i = 0; i < l; i++) { + h[list[i][0]].addClass(css[list[i][1]]); + } + } + + function fixColumnWidth(table, $headers) { + var c = table.config; + if (c.widthFixed) { + var colgroup = $(''); + $("tr:first td", table.tBodies[0]).each(function () { + colgroup.append($('').css('width', $(this).width())); + }); + $(table).prepend(colgroup); + }; + } + + function updateHeaderSortCount(table, sortList) { + var c = table.config, + l = sortList.length; + for (var i = 0; i < l; i++) { + var s = sortList[i], + o = c.headerList[s[0]]; + o.count = s[1]; + o.count++; + } + } + + /* sorting methods */ + + function multisort(table, sortList, cache) { + + if (table.config.debug) { + var sortTime = new Date(); + } + + var dynamicExp = "var sortWrapper = function(a,b) {", + l = sortList.length; + + // TODO: inline functions. + for (var i = 0; i < l; i++) { + + var c = sortList[i][0]; + var order = sortList[i][1]; + // var s = (getCachedSortType(table.config.parsers,c) == "text") ? + // ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? + // "sortNumeric" : "sortNumericDesc"); + // var s = (table.config.parsers[c].type == "text") ? ((order == 0) + // ? makeSortText(c) : makeSortTextDesc(c)) : ((order == 0) ? + // makeSortNumeric(c) : makeSortNumericDesc(c)); + var s = (table.config.parsers[c].type == "text") ? ((order == 0) ? makeSortFunction("text", "asc", c) : makeSortFunction("text", "desc", c)) : ((order == 0) ? makeSortFunction("numeric", "asc", c) : makeSortFunction("numeric", "desc", c)); + var e = "e" + i; + + dynamicExp += "var " + e + " = " + s; // + "(a[" + c + "],b[" + c + // + "]); "; + dynamicExp += "if(" + e + ") { return " + e + "; } "; + dynamicExp += "else { "; + + } + + // if value is the same keep orignal order + var orgOrderCol = cache.normalized[0].length - 1; + dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];"; + + for (var i = 0; i < l; i++) { + dynamicExp += "}; "; + } + + dynamicExp += "return 0; "; + dynamicExp += "}; "; + + if (table.config.debug) { + benchmark("Evaling expression:" + dynamicExp, new Date()); + } + + eval(dynamicExp); + + cache.normalized.sort(sortWrapper); + + if (table.config.debug) { + benchmark("Sorting on " + sortList.toString() + " and dir " + order + " time:", sortTime); + } + + return cache; + }; + + function makeSortFunction(type, direction, index) { + var a = "a[" + index + "]", + b = "b[" + index + "]"; + if (type == 'text' && direction == 'asc') { + return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + a + " < " + b + ") ? -1 : 1 )));"; + } else if (type == 'text' && direction == 'desc') { + return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + b + " < " + a + ") ? -1 : 1 )));"; + } else if (type == 'numeric' && direction == 'asc') { + return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + a + " - " + b + "));"; + } else if (type == 'numeric' && direction == 'desc') { + return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + b + " - " + a + "));"; + } + }; + + function makeSortText(i) { + return "((a[" + i + "] < b[" + i + "]) ? -1 : ((a[" + i + "] > b[" + i + "]) ? 1 : 0));"; + }; + + function makeSortTextDesc(i) { + return "((b[" + i + "] < a[" + i + "]) ? -1 : ((b[" + i + "] > a[" + i + "]) ? 1 : 0));"; + }; + + function makeSortNumeric(i) { + return "a[" + i + "]-b[" + i + "];"; + }; + + function makeSortNumericDesc(i) { + return "b[" + i + "]-a[" + i + "];"; + }; + + function sortText(a, b) { + if (table.config.sortLocaleCompare) return a.localeCompare(b); + return ((a < b) ? -1 : ((a > b) ? 1 : 0)); + }; + + function sortTextDesc(a, b) { + if (table.config.sortLocaleCompare) return b.localeCompare(a); + return ((b < a) ? -1 : ((b > a) ? 1 : 0)); + }; + + function sortNumeric(a, b) { + return a - b; + }; + + function sortNumericDesc(a, b) { + return b - a; + }; + + function getCachedSortType(parsers, i) { + return parsers[i].type; + }; /* public methods */ + this.construct = function (settings) { + return this.each(function () { + // if no thead or tbody quit. + if (!this.tHead || !this.tBodies) return; + // declare + var $this, $document, $headers, cache, config, shiftDown = 0, + sortOrder; + // new blank config object + this.config = {}; + // merge and extend. + config = $.extend(this.config, $.tablesorter.defaults, settings); + // store common expression for speed + $this = $(this); + // save the settings where they read + $.data(this, "tablesorter", config); + // build headers + $headers = buildHeaders(this); + // try to auto detect column type, and store in tables config + this.config.parsers = buildParserCache(this, $headers); + // build the cache for the tbody cells + cache = buildCache(this); + // get the css class names, could be done else where. + var sortCSS = [config.cssDesc, config.cssAsc]; + // fixate columns if the users supplies the fixedWidth option + fixColumnWidth(this); + // apply event handling to headers + // this is to big, perhaps break it out? + $headers.click( + + function (e) { + var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0; + if (!this.sortDisabled && totalRows > 0) { + // Only call sortStart if sorting is + // enabled. + $this.trigger("sortStart"); + // store exp, for speed + var $cell = $(this); + // get current column index + var i = this.column; + // get current column sort order + this.order = this.count++ % 2; + // always sort on the locked order. + if(this.lockedOrder) this.order = this.lockedOrder; + + // user only whants to sort on one + // column + if (!e[config.sortMultiSortKey]) { + // flush the sort list + config.sortList = []; + if (config.sortForce != null) { + var a = config.sortForce; + for (var j = 0; j < a.length; j++) { + if (a[j][0] != i) { + config.sortList.push(a[j]); + } + } + } + // add column to sort list + config.sortList.push([i, this.order]); + // multi column sorting + } else { + // the user has clicked on an all + // ready sortet column. + if (isValueInArray(i, config.sortList)) { + // revers the sorting direction + // for all tables. + for (var j = 0; j < config.sortList.length; j++) { + var s = config.sortList[j], + o = config.headerList[s[0]]; + if (s[0] == i) { + o.count = s[1]; + o.count++; + s[1] = o.count % 2; + } + } + } else { + // add column to sort list array + config.sortList.push([i, this.order]); + } + }; + setTimeout(function () { + // set css for headers + setHeadersCss($this[0], $headers, config.sortList, sortCSS); + appendToTable( + $this[0], multisort( + $this[0], config.sortList, cache) + ); + }, 1); + // stop normal event by returning false + return false; + } + // cancel selection + }).mousedown(function () { + if (config.cancelSelection) { + this.onselectstart = function () { + return false + }; + return false; + } + }); + // apply easy methods that trigger binded events + $this.bind("update", function () { + var me = this; + setTimeout(function () { + // rebuild parsers. + me.config.parsers = buildParserCache( + me, $headers); + // rebuild the cache map + cache = buildCache(me); + }, 1); + }).bind("updateCell", function (e, cell) { + var config = this.config; + // get position from the dom. + var pos = [(cell.parentNode.rowIndex - 1), cell.cellIndex]; + // update cache + cache.normalized[pos[0]][pos[1]] = config.parsers[pos[1]].format( + getElementText(config, cell), cell); + }).bind("sorton", function (e, list) { + $(this).trigger("sortStart"); + config.sortList = list; + // update and store the sortlist + var sortList = config.sortList; + // update header count index + updateHeaderSortCount(this, sortList); + // set css for headers + setHeadersCss(this, $headers, sortList, sortCSS); + // sort the table and append it to the dom + appendToTable(this, multisort(this, sortList, cache)); + }).bind("appendCache", function () { + appendToTable(this, cache); + }).bind("applyWidgetId", function (e, id) { + getWidgetById(id).format(this); + }).bind("applyWidgets", function () { + // apply widgets + applyWidget(this); + }); + if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) { + config.sortList = $(this).metadata().sortlist; + } + // if user has supplied a sort list to constructor. + if (config.sortList.length > 0) { + $this.trigger("sorton", [config.sortList]); + } + // apply widgets + applyWidget(this); + }); + }; + this.addParser = function (parser) { + var l = parsers.length, + a = true; + for (var i = 0; i < l; i++) { + if (parsers[i].id.toLowerCase() == parser.id.toLowerCase()) { + a = false; + } + } + if (a) { + parsers.push(parser); + }; + }; + this.addWidget = function (widget) { + widgets.push(widget); + }; + this.formatFloat = function (s) { + var i = parseFloat(s); + return (isNaN(i)) ? 0 : i; + }; + this.formatInt = function (s) { + var i = parseInt(s); + return (isNaN(i)) ? 0 : i; + }; + this.isDigit = function (s, config) { + // replace all an wanted chars and match. + return /^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g, ''))); + }; + this.clearTableBody = function (table) { + if ($.browser.msie) { + function empty() { + while (this.firstChild) + this.removeChild(this.firstChild); + } + empty.apply(table.tBodies[0]); + } else { + table.tBodies[0].innerHTML = ""; + } + }; + } + }); + + // extend plugin scope + $.fn.extend({ + tablesorter: $.tablesorter.construct + }); + + // make shortcut + var ts = $.tablesorter; + + // add default parsers + ts.addParser({ + id: "text", + is: function (s) { + return true; + }, format: function (s) { + return $.trim(s.toLocaleLowerCase()); + }, type: "text" + }); + + ts.addParser({ + id: "digit", + is: function (s, table) { + var c = table.config; + return $.tablesorter.isDigit(s, c); + }, format: function (s) { + return $.tablesorter.formatFloat(s); + }, type: "numeric" + }); + + ts.addParser({ + id: "currency", + is: function (s) { + return /^[£$€?.]/.test(s); + }, format: function (s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g), "")); + }, type: "numeric" + }); + + ts.addParser({ + id: "ipAddress", + is: function (s) { + return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s); + }, format: function (s) { + var a = s.split("."), + r = "", + l = a.length; + for (var i = 0; i < l; i++) { + var item = a[i]; + if (item.length == 2) { + r += "0" + item; + } else { + r += item; + } + } + return $.tablesorter.formatFloat(r); + }, type: "numeric" + }); + + ts.addParser({ + id: "url", + is: function (s) { + return /^(https?|ftp|file):\/\/$/.test(s); + }, format: function (s) { + return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//), '')); + }, type: "text" + }); + + ts.addParser({ + id: "isoDate", + is: function (s) { + return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s); + }, format: function (s) { + return $.tablesorter.formatFloat((s != "") ? new Date(s.replace( + new RegExp(/-/g), "/")).getTime() : "0"); + }, type: "numeric" + }); + + ts.addParser({ + id: "percent", + is: function (s) { + return /\%$/.test($.trim(s)); + }, format: function (s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g), "")); + }, type: "numeric" + }); + + ts.addParser({ + id: "usLongDate", + is: function (s) { + return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); + }, format: function (s) { + return $.tablesorter.formatFloat(new Date(s).getTime()); + }, type: "numeric" + }); + + ts.addParser({ + id: "shortDate", + is: function (s) { + return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s); + }, format: function (s, table) { + var c = table.config; + s = s.replace(/\-/g, "/"); + if (c.dateFormat == "us") { + // reformat the string in ISO format + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2"); + } else if (c.dateFormat == "uk") { + // reformat the string in ISO format + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1"); + } else if (c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") { + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3"); + } + return $.tablesorter.formatFloat(new Date(s).getTime()); + }, type: "numeric" + }); + ts.addParser({ + id: "time", + is: function (s) { + return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s); + }, format: function (s) { + return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime()); + }, type: "numeric" + }); + ts.addParser({ + id: "metadata", + is: function (s) { + return false; + }, format: function (s, table, cell) { + var c = table.config, + p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName; + return $(cell).metadata()[p]; + }, type: "numeric" + }); + // add default widgets + ts.addWidget({ + id: "zebra", + format: function (table) { + if (table.config.debug) { + var time = new Date(); + } + var $tr, row = -1, + odd; + // loop through the visible rows + $("tr:visible", table.tBodies[0]).each(function (i) { + $tr = $(this); + // style children rows the same way the parent + // row was styled + if (!$tr.hasClass(table.config.cssChildRow)) row++; + odd = (row % 2 == 0); + $tr.removeClass( + table.config.widgetZebra.css[odd ? 0 : 1]).addClass( + table.config.widgetZebra.css[odd ? 1 : 0]) + }); + if (table.config.debug) { + $.tablesorter.benchmark("Applying Zebra widget", time); + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/inc/jquery/tablesorter/themes/blue/asc.gif b/inc/jquery/tablesorter/themes/blue/asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..74157867f25acbc146704d43399d6c3605ba7724 GIT binary patch literal 54 zcmZ?wbhEHb6lGvxXkcJa);0M5|G(l-7DfgJMg|=QAOOiQF!A=tFW`Q0{?_dDi`go= G4AuZ#-wosd literal 0 HcmV?d00001 diff --git a/inc/jquery/tablesorter/themes/blue/bg.gif b/inc/jquery/tablesorter/themes/blue/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..fac668fcf42af844a3af0a239fa638ddbc08443c GIT binary patch literal 64 zcmZ?wbhEHb6lLIKXkcJa);0M5|G(l-7DfgJMg|=QAOOiQFp2l{H=O3Yl~fU8)V1~= QTew|n!uOuePzDBT00piR0RR91 literal 0 HcmV?d00001 diff --git a/inc/jquery/tablesorter/themes/blue/blue.zip b/inc/jquery/tablesorter/themes/blue/blue.zip new file mode 100644 index 0000000000000000000000000000000000000000..9945a92aa7db393ac3a25aa1e585300d9a65c651 GIT binary patch literal 885 zcmWIWW@Zs#U|`^2SX#|zZp7BzX$s_-0WmueCl)8`rDvuUe=pg*!AB%DAu%H%A>f+n zkN^MoKk^rIV`Fn;lVww2IB8(;@!JXg2X%%2uD$uveN$@}&ozbs6qE0z8a%fLn&<$; zY(Sipj%@IQ6r2Wke*a=V=h>dAA%aO)wtka~-VvL1==;2L0c>p9XjW`{V8{V;JO|K< zlvEO2|HXJ-%*w>zTBx11xRraanQh*Mhe-M*Ojv+nQD zvrARsS}bKYx4(Y(65GYp?fHJ*&qGXq0+e7LLJ zo~5d?_{N>h^GaJi-dbtB4_qmx|FE0yg14wzWWdb@j3?D9=Y4-!;^ehq*5>0c9xqy@ zVwRg#zavq(#Nl>Tar6rp=hE_73&Q<4ADv0MK5w0@nL~r(^q`v_&mFIS^xOH>*W{_d zqZ)_k#!m-4+ch+6k{mHcF z{+)sai!^t;tapume2(w2=U4p$_vRO#@bW+79qF;NXO4Y1MZ{<40Rw-0F&^9 ziLMDfl|fX4G(`b1B+a4gK~FXaJ$r#nSRz8!g)K#ZbTNXRCjm?+@bnSj%?e8G3@ku+ K4M=w~fp`FM94`t0 literal 0 HcmV?d00001 diff --git a/inc/jquery/tablesorter/themes/blue/desc.gif b/inc/jquery/tablesorter/themes/blue/desc.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b30b3c58eabdb47a1c420ad03c8e30b966cc858 GIT binary patch literal 54 zcmZ?wbhEHb6lGvxXkcJa);0M5|G(l-7DfgJMg|=QAOOiQF!A>EGoD<#VNP?1QCB1* GgEatI(+xQQ literal 0 HcmV?d00001 diff --git a/inc/jquery/tablesorter/themes/blue/style.css b/inc/jquery/tablesorter/themes/blue/style.css new file mode 100644 index 0000000..eb41f70 --- /dev/null +++ b/inc/jquery/tablesorter/themes/blue/style.css @@ -0,0 +1,39 @@ +/* tables */ +table.tablesorter { + font-family:arial; + background-color: #CDCDCD; + margin:10px 0pt 15px; + font-size: 8pt; + width: 100%; + text-align: left; +} +table.tablesorter thead tr th, table.tablesorter tfoot tr th { + background-color: #e6EEEE; + border: 1px solid #FFF; + font-size: 8pt; + padding: 4px; +} +table.tablesorter thead tr .header { + background-image: url(bg.gif); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; +} +table.tablesorter tbody td { + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + vertical-align: top; +} +table.tablesorter tbody tr.odd td { + background-color:#F0F0F6; +} +table.tablesorter thead tr .headerSortUp { + background-image: url(asc.gif); +} +table.tablesorter thead tr .headerSortDown { + background-image: url(desc.gif); +} +table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { +background-color: #8dbdd8; +} diff --git a/inc/jquery/tablesorter/themes/green/asc.png b/inc/jquery/tablesorter/themes/green/asc.png new file mode 100644 index 0000000000000000000000000000000000000000..66e39cad0118035e24e5ccb2cc9795ac936746d3 GIT binary patch literal 2665 zcmZ8j4LFl)A7A=XQQ{Ppuku}@P9dR=HEPr3D@Ej+N{HjD93mm2P9r27M;zq%EF6`j zu@&3c)@HNWW}C6u?9--BFYnWN&--52d4KnHJ@@lG*M0x5|Nr;9@85kFdU>AK+`M}; z2n5oEo`Lv)Kx?dl_r2(oxjXQ!hd0_c z^Q~XtApF<9(tOnAM~!zAI^7}~oLrDUK)bY+O6Ahhl0u=7%jJANe`siEd3iZLK7L_g zK_n9KcswSPNvG4XSS**zRVr0dnUu+5PEAeWa5yfP!{-Z>Dy38^WieSe9F|NbvpH-M znJf{11B=C!%j6t3hf1MhuviL}%4D%bi$D_z_>fEpjc9HIUJ!#M8FgH0s%0ILZwI~5@0f& zPMhWN#1e^2CKri>Du5Z~5{JXa6Yu~*1OkE0;Q)g~LLr$%7Ks+w-|C{MR7w&F_(7sg z(SXV*6bgw%QYeEdEDvQOE z$z(#INFWf%WKs+UWAo11{R5m%qXA(8#;-V!oD>2O39(q*?Cfm7c!&e?pv^mD$6+VT z%pjjXKR7s;&L%TaOdXc$Hp+xxb$dZI=pLZG~veF{Ja;&H((@W9Ebb#i8v2{ zKM(JNGroa|8N)D`49}OQ4oJsYE;j-d9ZgJ&_z>Za1iOC#2lm2;hTg+kcf#6tx(|XU z0PXP;fv=!MBC+we-yDYzMG}6D#^3Np`bH8`qVZ{g-7wEi)6=c$W1~PDdk|L^00M0g zLm{qy=~Ke0w2QtM^iT;s{&BH(A9_S~rWNbda!l8O!_TNez}X;kja}WY>w>IZ*T?Lr zZtL~G)YDGBR?tiGcY4{Ak}MujF*3%*ru{Ab`VY{n^6Bb~aa9JhqQG_=7y8E`-GZW5 zm7QMRx;lpY1>vatqE~v*=H@Lf0f*m;zT0Gk^hh@Z*?x#)95FJP3C@am+MsFk;hnGh zILox~qUI^9Un{H0zM8pNnhO;V+qSLTe7bhyr=;ZPznI(`%WTaO`gXqA@Z1s))t2rq z_W>W4s$L=wT`)Jtd7eF>aqg~e=gartWT*yHeeONDF7GNMOL<*O2dOg<9GJd0dFBOi zz8+!$9ge*S+q6;Z_BkgFqEFe+fejw;nnofPW@!t{t|Ae9E`LH)Re800Obn?_Ap&db zPI-nN4}M?jHrsOCAh>Mav@l)M1ISa|MRe%wVRWKzSWi6>u1iG3z%5Ih>P9NI9%1eQls_ z5_f*MSUm*$N9JO2|K#3V83)6Aa;~(E`);|`HoiyS%&~BvJJRRcvFwSTbaTQg*XQ$! z_7~t;%ZW_!xvy{5kQlEkGZS`exJSs5d$DJ1L{^rCeo77b>-E@} ztgO`3hzsti?#9c2gGeDU>2quj&8V-9V5=kbY?Ck$P7+LEu$HQ5%0?EIyjR6qMrt!VO2ZF@;b zL-22!4}c|@sHJ)O?@fh4@JB!1G#g#Ic{*~N{tB;PyzwGg-KA~TA!Bd zJ~nGkm3FVI9_9b=_$C|_V+v(L4xA1vrhQr$!2mTJyt)7n!eXa1#>7`~p2inWkTJu$g=86pv zqkGSnj6>Qc7D%Z&#@=Pze{BAjK{gL@h!{5q=P3p1;I`Uj{%~#|q)i1Gi>p(7bj?P@ z*wqDxB!`fD^H1D-`PDJOT1ymrB|F%^{HLdyGj)I47y-O}lcEgyZsS$^^(Rh&2Qnw* z$&_GymJ8=2wLLcUqD)%6>npT(2YH0_B_UHiO&qLxo?G87ae59z0U_Q7G`m7%;; z(Q$O?H-P7Zpwrw<2HaF2@`1y!+W9?8%dPdToFfd2#ygj_)G#UADfCc~fVwojcl4 zjHm|8Mzg%`4q#Pf$V1u{2ckDWjL)>LX3H4pM`wZp3Ib7U)+-%<6eW~WKm^2!SP$;190Do`NP>wVDVIjYa0p7`0f?gFA|fba0b#8a zWJ;>=?Nx9#kF7PV!Vm!2ny*9z0rY) z>V#F|i?Vx87Sv>6>ito_dwLTNLK=*(kv|J8Xp-?aw3<`zJxz;GIsCK8Lsm}9_9xm-Rz&X&pL z(?X$AsnP*hv>J(Ip3mn|X;c6ZjYi|~`I7m0_V_r1&fxL*5{Xo&(=x}#mY0|5bfAyU zX0gY{#^`kVmnBN2YPCkd7w~yJsZ`2lkCQ26B@mNJDHe$-08kQ1Dh0x33#Wx#E>|oT zE0xOmd5Kb~AdyJGym2-=pbthSQ|1Aa%tsEMjT}5RJw5G4aPaCra1y_5W@bhtnmzwK zFc7DYqMSpJBOtGhAM~EZU?K2ETlP3Ryuq3@)d?ep&xysIot>kjqX?YE(b^3N^6BR0 z=7xp_JRV>B;zbDQL~b_fCBg78-V}gZE0@VNY7LXg zB9TcmGqZ7&w2_fvjaCb5FbpPzMs}a_>fRGayD$rwXck6^wqI{+Aw81p{KB$K=a1k#&^ z`1v5xSo2S=M1+Q$_q=XQr0X>|wPy#Vh&5OktrFJH9$0ZnP2S!|aP3BBJdZBIPDe8?YpB%-$V zzW%qSDK166{>VIA#K@hS5iT8)Wc|&ApfqccQ{St}-J7>gA#b9vznePty$cN(-*KT_MyP{&&j6~_-ksLNV{c}^7OT4#zF%)*}MbxfWcgjW#v0<`CsA=k*5p?+2$`HXLn{H{R zo<9U$m}UV!{MX8ktQz5IF5B1`q+>STJmgeoncdks`VVIs<1i^#PXEpO{)~Nx9@RS~ zhrYThW&hDlwJG~C7aj?0?*Xu1Od0vAkgKwzOEx~S!)^+=%`Ym=NS7=vO51fEiy19* z0`j1RK>$ki)1jK`H!SYiRC9yk9E6*v6*13n&FR}NM#$LnIM*=Cu%9i!0ljY$LjcGB zLp{&l!^0yyY-eIpPXrcBvq+qQ^-;QjQDKJwpLcAvcZ)R3 zxt4&wgv+qB`g$aH{OEhs)8KndKe18Z-`)GI<$<_X-QKy|4^LiC|5Sgj+CD@P68xqu z$RQ-;YJFqc(VPMMz;%9nzQaEQlKP60a_|xFjJ`PICG4^Kx}D%(VPWUsaG$OND9qwC z-Wzp>hcmuTI&P8?pgcD|2Q$S@O{&clhfC+!(u+z@&xG~-;>|@~{ z?&^pJUo5h)!wa2qq9yEp$$@n{;OnooxT2d=|K;iqO)h*teAfNzbqb?|!HG^kpDf5Y zm@0Vox+7!RR@J+~ZBxOf;9Wt*c9yDQXl(VRZRQrmHCzNmua1N{e;y$`y56sNfcc=N zrv9ln*nWV!g9O&YMk7Um{g(e_qkOVKU$4Em3&Ie__+V-+fP9ldm{<< z^<89Y({(I(s^YHzX};g-s~-{Gtx0fQz5kGJdkaw&GgH!uPu}O%dNO)q{>8TBo#!un zs75ocfL(_@8*D-V;ab?NZ!OLvI9px$U_l|l$`XZodfFQc`LHE*2W%9EOyAP`>*$ko z2JmyK=#0D|+*?oL{#5EQ25&d&I%vX(+TE*pobLX&W=t9JWPpy<*=*fCKtyfbeFn7^ z<&^1Y>{?31p25})IMwaa@stL?P@57_^TG$yeFZCATD}7Qi^l3Z9hNzFqL*M1VP^ZB z`gR!{=T2mqn#JAm)@z+VumZiOC;PVGnThr#NGb}h~lL+ka)zDJXTFJO}|M6dM(DCGmZ%I}G*>Ebw56Z%kiYbXV-az(61#gY8V{p*CW=0?>oO zKX-*-x{)Ps@-haF=ak>NQ12W4!p#G>58hy^)9I$Cr?pzGMxzmn#XUVeGcz;s@$pir zR4$i`L?RA{!(y=j01yZSI-OpnR&lr-27>{Dpg_PEizPa}PNhGbJookSw$3j{nM`M79$y^cbGK2VqpCKMTs zMx#(DTJ5xeFW~cd@~L?+nJfSV)G9Ry08>*?>=FQvXEK>;janoW&CShmxm>kcEtAP5 z5{X)^!sGEy?;QPxkSrz>Iwp*8+P&XX20<kl73 z9I9L!0z|g8wY_=srlFw$UT2D^UsG9Cg~o?x_D6g4?~4Y{@Wy!@HV5JYIf7Iwl+)U2 zI-N1C)8PR;pD&o0m>e0wW5HA`IThKk97{@=n4Ap62Z!~aAb{Z57duCYmLJbRifMGq4*ZqHnvM=dHFgEx6ARm z&o8}SERJ!q8{VpIxmoHnvA)a54;O^7+vElLfNQj;dThSkxvBpOzvd3XO(o6LEazM; z%e&NQZ~K^sdgOwWA8CmErG{Cxu#EY>af|(to&5Yt@}nf<>ZB(7f?#v&z3@%PaX|<> zoB8v$r}6p%xW5e6MlbP{dS2z8o_n_82j)&X7n#S$CaTX@h&dNt^xr*}wq&q&>c**ZlfeNvs`M_gKHqHlrX3vL$aUC;lB&|-s2#hnw+rvv-Vl4Y zC}0;yjv3q}(wb?3^?k+Mn@Ls&>Fmn0e$uismTBMOrsM+IJ|2mveu-fk?vEdKI zylem9d~*N_1?EtOV!Rb^`O~wyDNeV(>(_DbDRcWg>xnU|4@0fPNioXQTAK=kh?29B zO;O&cMn{ur(i4ICoa^qt=?Xk}t2kwy4Ve4*-23dTd*AO(5yYp0j8-{+8++!gY*bq2 zh)zTYHnK(>(df4Nrqn}shaLTw`S5v;g}yZ-1vU4Yj=nRQuZMrqc4@uwk#i|2*S~g` zS^Oz)-8QKBe(q!3#7}!AF%c;@TWV`TMh-DPZisN#4tGd`a17>AL7ZCM41i^^iz2N6E`^r(3EY77P@=te8_y14~YP{ByPgclp_@9$0&= z`*kw<%o%a%OnE(NZU11|U}G#sUaBouRrAO#nC36&eJac-xkVMwQr+BxF3qzl_QRq7 zs^6w-FOv|*Gu6XyXJfznsFB})w%z;dXHoH;7`;P*^{_De3ZlFb-DYl-J#3m_e`?`j z(N0%ad(F#5r3fK@AlH;ec(QO!Y{K6{9k=8u&fJMwb+)C7VRg8AL)}%?xC`H6X5!bx zXp67!X1YGU2n~@^Z1UK(u3Nai565b0c8iY~*LfVATzvN@lf%;e?8;FoC1s^0I$!XA z+HVebx)0`_^8MgRoe?4Ln}7N=w0W0rggEmdbDucpCd``f>Oe>FWbtdMBuzk6Pjoiy zYp&?BNC^v5OV1lF@%@X?k(j5nz7aHXpPTt7y$<4Nd z1AYUwcbrUJj}6;LJ2;F`LmysAq{loUwk8G39wK9hT-KjVp3fU^-kJZZQ?u;aE|YJ2 zzdWwTA51PT3^Q>hbS!nS8!}2;m_oSPjoA@4^-64V${+83>!Z#U){Ie&z^1Yb#( zM!yd!)c^FG4^PcDOxzmQJLs6x+=>!L)VOcJb)>?Ll3koE#Mc}m@?}<8sm9)ab>EWN zj8hjm&f29JO*5}?{UxPNqIBrexrnZ;lzJ{Ofcb>3?^>}s_C55Y2!s2gd}_TS)Bg=` Cpy)LK literal 0 HcmV?d00001 diff --git a/inc/jquery/tablesorter/themes/green/green.zip b/inc/jquery/tablesorter/themes/green/green.zip new file mode 100644 index 0000000000000000000000000000000000000000..6a14d240a1af85a6b11d71a6a59257a39f04a776 GIT binary patch literal 8464 zcmZ{qbx<7Ly038=2r^i3CqQtQ1b5d#gS!oZ;E;jfIst+^1eYMeU4py2yZaFI^6gW1 z?{iO`ySm<9)m{CoRrUVS^{l6snj#_+J{%kz8eBq{4WDGGBq9|64$kVe&|cqKSh||C zIXhWvgU~-r+frsN#_8)H)Pb03=;|f|v@3?El~CyMq?1)7;wEP+6ejG45|s0o>0lEy zJq>2hFPz*~sii5LM6M}QQIoq*K5Hvu&1bN`zL`f?WbJD(m~YmeJWQ6H$H=M<6D5$i z`>6%dq!JlR%`b0*UyUND!znOA+8T=ryTimyvYE&_Ea&!KDr+k|AgMB3hZdM?iki!o z5mOh`CzT$K6&4fLMED}I_y*+xWfvmQ|E`3cq58eIiAe_~w9~!!Mvav7Q|NeLfT#zu zX;Z8;*kuw$#VTQ?QR@s(@9;2Y2^-8YbMR$qYD&Kxls6IfXEQT1GbJTueqOg&i#cgX zng%zt+q6pewJk^p87jXtN(BtD0z2Wv)u`4Z{{Su6LfeivLuJdk0gl3iQ%{OUUbvj#{4ZByx)fbFJ;owhnRRt??0Rsveoc5d`qAi{{#cV@DVM4)_J+=`a>%=qfx~UmBWy|$vSLG0 zq@eoR+E%Ztf}9+9BkPDFV@*Bn;NH*zm~0d542m>%(d$LVhq{R%_)UxX$JC;&PzGoD z)CT;AEcWE&WHRDT^G*vELE?o=pnd!%V{MZ_H$Q!oE+qROKr*<5km+UT(qQv%| zeQjwEU%DxZzBlJ{fcnq(x|`Zcv(}0p1my>$!naW#(_g z%pX7Zr)xBm`5jkj;Z3WT=7<2e@AD(Mmv-E{Phv+r_0u%Rbzd@?iBHhk>qAiaz9DEeYdc{3vD#Z|+_A!MeN>(GgWh(kN{ot+oJTQfVw8KC5riOlLs< zj5(m;a>yEkR-gUn*h{do4mw%;z97l)Wp+J*71ybR%ZF_Jplp(VEB#w}y?=lAt&HsH z{4_tzo1rUOAds2xG3as%dP; zC_gff%rUgy*1(C#N44yX>+%n>i37iv1m8NzNzrNAnY+_rd+)DCS!ZqeDc&K$IYpNW zp2dX^J2{yGTibmkU65i^5G#vm8+h5y!+}V&KJJmOvq30lfQ@~8*_+aLO5PBz%YEq4 zTUf)>FSMZ@b5@4!;=8xuUS@_*)duP=o0+pS`rq7v6g}?3vHWYcjqc4`5$PPqkOS9J z0ykWPa-DLPk~`}14MX?a(LKUmOjftYV^uGJxKwC&7^HU= zd^LK)!`|%b9Zv|j2E2faO?v&_fdtbqBQ zSUi;a@ZVOcFP@e=P#?hXn-)T_P=uj~XA@GrKcUk$xx?-COnXehPWf%CvcnxBCwNg* zV9ggT7@>wyQr#$`{_#L>1;5Z>?dGUq?nmRNn46yDnb4fsjUYx#my<+5U}f&rhBB^E zkqm0Q?Id@=-}Ir(_Jd1N-$D-C6+(`OgJ4(+F?QQp5?z=w3URs1v-|C^*Fw?n9(Z!- zE!ZMjAbY~`MtMN?6kGU?^=kKu?9$Ip=F*OWha6(f1)+GBUrM;??PH^(UwK^oWOh;5 z;`Wfe`OpaE#1lPqghj&6H~I$;Ic+xXxais1{v=f|A`>1C9~n@dxc>b(hFPHAOd9>?VP}l5wKY=g6S~ z(jD}$_=CfZ`kIL~zv+I;w)u^lo0_6?qaUjxW8S*SUT@TA!<@MJ2g&%NYlLggi)@l2 zBQpwo)j1`?DEs;HaWh#B@yKEIYJIF;5w0*APzJczOqaZTRn6lQ@9A)Ta>^aA$mHfx zb4mp?zf)XeFpvkIYj%e*=V7urVuGvLPL0;cBe3alZ>o!f2 zobua(wXcY$nzdAa=x&zC8^_fXJO&lW@G|>o)0-NG7NL1{0lhnYW_etk8N7@)4{7h4 zSmGokrY9pq6n&q~T$MxCh5)XJb;eVm{NUnkuTWCzi(DTA45t=l5=mqLXXf8ll)n_f z<1xxEk1rL!`B!$-+^yL{4UkSbyZ-FWeZDBu5a4r1I2Pbts^6Kt!(VU8FJMiAw)iETmxF6jep@3DXte+QV1zFau??{n zMyC8p1#?MyaS5sxNNF5dDEpD7jsa6EzW<00}Vk)SbS{#{!=NRSY!k>U@THtfN< zm+Lfs)e*j^HNr{Z{qHl&5x|g{2FDIJy6$LT203dF|8cjAC5U*S*9an=ZNqmmY#9^p zZmT~vY;OorugYU2@czP<_x^o81qPeGwNG~n<03Q7TuGI`;t3=NVY8nV=AC2q*0Fvdw2OZ)8>lPMwamrkb zTI54(aZLkAK6TALOzSKOGl^RY6N6z-EJE-nJ-vKo66Ht+eV={N+7MI2)DLdZNC1tX zNjjzOSbgA7u$m0Rv8nva#ljpy`T6fHi$qJjUO_D+N|O)HGLA|2`W-nq7?t*-#0eeJ zly}4$t*#5ZM#6qcL;WOP5Zko?WEFI70YeBLw%-?`Dp+r5g=Y2715httPDUqI&YS7x z27}(adGXAqLZG+15uTCT!{pc2Ma!`kW+(0^s7yp*d+7&FT<4l$?EiG`AO2=nXn7ER zWpCTpLVfL=>3`w(C(s*#_#;x|`*Boy6?OC-+Js*!)H&5Mj;WWiG?&VMS^9JYr6i;> zWHdGeHmUloMPdN9QS$|kj(lm3bqfxB55J42HeTGH_Y7Z-9wB3HAI}~{=B}3K{9aD? zo>#z~UeKvjQV%Dj0I}3@ZX9+Tn*`+ZHtQ!lliL7keFP}4I-4^QPLbR6S4V2fyVclj zZ>9lZYAz;TI!=UbU?vWUDN-~>c*J=G8hX3emShkf+HaCC&t*{iJ2gXH2ofMz2zm=W zZWfU{JU{b*kzI`L!!9WOUnVu~+iYxG(8`e=;c6Vq;@t#s@SSj_zHd zqM{}xCT?zR?d|Qo0&>!jCC6JHk~e{!&H`ll8uSVB#7e!>)A)puJI?dIZDPe53i%og zf#HA5T8PjT|~c7$N0JmdTC- z7ut_sEky&5HDxoc$EL#)+i&3#D_4Y&tj<=wz(PiWiWAhgrRTs`DNlzV7e*Ir6L7=I zR;`dv2Mj=_af<**$uPu+OXW&b^_#lRvn1MVkQQl?phU*XTk2w3nZk#C@)yr5)+$kA z+ZuJz0fCa03X~Y|0MZBnVhr)Q6E>wDgid+RBng1zi?oJA9$yJGF}fa;%9@&*uXy6O za*CxMGFXx^`zi1u5GNB8svLCh0!zt@er?KOdgf@7kmw8Bg@LULr3cK7EuuZ-Z}a!u zL`!edL!h25T#b|FLV|)`72Pus33M0X19^~ zNafovC>_YYWNf&KgancJgVVVh;l0@l4p>lrevz1%o&ss$ep^@ zJl*3$)gVE*M?p{Q^yfF2*8-`d**;%V=V{5U1k*XREa<3t9e9S{pu3YIKX`PbqONtP z)^+RGHNWu}MQH5vyN0}>$3b&ze?H`}z>9gI270XE9gxSU#`NUhdvttQR8rwDr=&#e zy$fv65XG^{cnkP^A)f{mQEc7zQ^!si-ytP37ha^V=Jl$UVO_F#BXAu>f|QQTH8nr6 zQO(fNW$8Fw7qRQKHuQ=0=l-Kp?k{s|9hbNURcX~MoV07c+e6W}daz%XPm-csw+StItXT_!F&SE$bgYSLIQ5|jOw~sxFjIUQvB!Bv(!uNag#C)9}_hjJU zKK3dvnAsNw*P|E6chZk&K0ug$QF+<#TG)+>dd;_3{@uNrIm`ma8$CPtf<9=NW39}g)PZmEv(4@fcSuFk~0FwzmB&ip96 zw)y;7%@MF+tnD{Qd#Ahp0GwOsHE%{#+*1Nf@~ps%&Iw04j8c#^ZjeuEOZp#8YE@%? zS{&zF39_c;4?)CI&`nrPVqeR$g{JV>D+|C~cxumrT44$#r-rDn#suq*csOi9iNzoJXr(0fn_hVzmR+;QS;HBR&k4=~UBS#96d%QVB zXcRE0_Gy-bu*ur?4#%;crdd~YZBaAneNt;TEjGj`?-U=xqi3l4QC3yuv3tDo(5-)I zmeBc0leVmjPZ$1UI;YdV-GjJ;$)}=Ew$-(~7VQTfLhaLMqxS6~Vq__N4a+3*Y>?`X zJDQw5*tm}F4)qwtxP1~oQJ#W`^4R&GO{a*d8q|yPfP12NIy)tmVtPovDdi82ZsUEu zGA6!IdTJ{0)uF<#z`9iuj0t<+ED@b|U$f`ZIE{T9h3jCwEtjzu7g;85R?#AfP`_A; ziN8dt+F#vB*ZlK*umCk9c&1PZZE-HQ*% zeN+UD!)8)gJvIW9d6*X2_~GorqJnc*2R_zMvPw2r|Kd~i1V=b!&gX*<)hg%S91!^N z9Bo0H7N~dZuNs0;FFz0GlVV;p{sQaZ9)JhAf$nwfYJ8eb8=0?gBQ}ga)eY5Hi z%?YcU^>j&nKN}aZ9`G9KT?pC4QtJVI58eg)tgydG_L+|FY|NFD$IKjHA${rzx{GX@RR7+ zW>(`~E6k_@vaBe~sLpYDIXLlycy8)_A9%w>cK`NC{r1tZ$KVsColojI>6C&}GgjS? zV&0u%%whZ^st}kF8woNmB>i2%{#&m^muKzA40sTBRT!g=PazZXpo`)R5W-l9I$8ED zs!#j9NP`7+u0tteVB9yk6|X+9`&T!)%5mTy!x6wW>%&FkuF}mKR|qP2C7V&YO|#vq z{`QW^*|=BMYmyFD_o*Z>UWoRKem}qRBBjsMRivjzNdb9hmEW&-IMb8iZ&1F`{EYs3 zXwA+-Vni{lj7zSGCUYz@baf&{;FwcDtID2On8ZX7aR}djwA{qUbM>%?WdT)0?vx=l zcgd;-=VZK(dH$vJqA}SAr8tO!29umg<}9nRE`S!@<1LBQ+S)8fq6u9ivi^_gelc zPcI#=7zmozN{0c&9C(IG&fxfK@NM&+woSHsLobL430R2zwkJ~H?khgBHl~Rr?a?$f z!`dC0cZ2f}^ocACazdit;~6c>YDvJAbG`fmrOu>8{WhahD4$q7~La#g8 z5Ttu@!~oDd;uEXA4gxO%$sQa}>878F2-WzJNc{{9Q~8Y1Pw$iVhj;W}UUyDH|c z(lPe;pZj<7=2a7%I_$T7-T`9o#XDtjo{M7UUmdN9hL+(&Fk5e0QB3yt)p1htup$** z`ZmVqJqvMV!h%)Go906P4XU4=x}`IAJS4UH9OH0nA!b6s5sB+;2^Y4LJ&5;@}>_yLOmvFw>cdcW=j06CZ=s^oEUXpTM zmQ4&KEoSY)nb-k3KuVWcjg3}`919Ro==FhOy-6Ye$G~=+7kb)=S=9oj(5D==!JX7{ zCoq%yOP9vV?f&(pNRUB>o3P=b$YM{)vW7yr_c1A;?6GogLaeS14qjdD) zR92ppn0VHvwi2b=M8n1c#`Np-NeiKMW6S zua&;ZSw^GauBm}XTJslK+t}Ess1V%>nc58bC01qS+XffGP5M&}LC7!Ezqt@gx>hU< zu_x7f?8B;0?>JkZI(ra~gt-mV=jr$A;OuknrSAD!M1S0H&a-$Wt^orvs#e>uENq%+ z-j{6!DVqkbv7=t8CL>o(pStYx^+jV4G75>96S-lU_V?BuPkF1+K?0G|W^$Zzk1Az? zUmD%<47%Y>17Gx-NA-`;#or0tUP=#9j{mq#`QuI;JO0o*dE2u!6#5t|OJiq$b_B6c z-PG7Vf)3Y6M=duJZ%k6l&#ozY7DXL@rl4W@hopIkSB1@ms8QD-~uB5OZZ zj!#`Kc2kPJ^Q6@o@D>y#h+7jPEb}K;Sw}3{o{lpfzcT&V8Cr6NrwAhQdIG>id*w`|+ekIA8oVZw@Qoc|3R=O4r zCqWoLBdtmw>m*mRBK;3N9!40JqeGhZk`B!~Ej8Y^97+-!Gy6+?BKL&6-RiJ?VrpJs zVVwKZ*aoT4YVWv7+KnK;Yg6ww+^W6{&Km9%M^6y6Z>1ka>1je+QN(l185l-<)O3C0 zalZ8EM?^%~LHy*_p3%NXJXG07c{XY|5%jf<4ZAhtu8i;7GuLkbg{T-rP^?0-gIy%G zc0?Hw75=zwKX%bQL}*pt_9TVfpoxtgoZ$3$-I#Iq*FhXp`D=B^o|~Oz$JEEbJ5}ni zHyC(1U#YdF>snfGdG)Lvrorf=6_w_}V_`*tGMRHqv;mGEeYSXfm@}&{q`zUZ^+sjh ze50b@QB;h{-#$blR?Zl;Q%+5Geq%w%w$cu2kkyE3_F9fkxZ=-mmPr^Zuf}k%UHSO; z!kkV48@gS&aFCVOWVqRS5}8wJ&YtVu+N8;67WO8dS3+6yEGoOZ4-|q%vG7Gv_~w!N zyo(3pe4|~(-C_n!)pen_mx{dRVwbv5Xy|x!b^;Pm1(lDRbQ+)(jB%*!TXNN ziix0Bl7%&+)o%KEtRR&Xe~)VULwT52h`q|1JEuf%W?y57UdWRJJl4Kn{96RH7wnr4 zKG@jM^U88*lQEu6??UXI*qQcKhMpGOC{bKpjuD#AD6_H$2r|Ls2)?UTGpnqVEPMJ0 z_dvGp$wPa&)4K^+QDG-6`Kwu8M|(5OUn4c(ox!FNfy z{+avU-+6+Fw*g0wcfO$z6uKJ%`ki&!RboHfE&AiCd+&^OV^h<;b?2-KM8@Gwo~;dc z*2nno7v#^KdxNZF4|mA-UFL1AJ(k~s32v*-u|3?R z0@(@m<~M>>1Sf#*?b{tqB2HIyR^~%U;-#m~Bmh?&@a;j#M>QW5w=bUlzTZMqTk6uCN``+!F@VkMjsrQAe zCJ*qZSj;`Trs^)oW2|R_-628bwBb3wsN76Zak6|!Na_vz(n$yHeCH{A{N5_pC{EK6 zigRq_Gh9*z0=rcm49M$@cKs{}(`(lD_XM-BY<3tyms_1BO)Fgli%3VFF7(a!bJ1KuVI(!QCT`~wONluAV@x2uJH5)&Hcg0>ufA#^gA<3Ki z8TnY~c))L)VTBq{PS0lbIdMFh=~JVTtuL_lwJ0XqOiVaq>l!y09B!=}jCdOKL$e^S z%AN_=2gQJYU8`QPPm|PEvaIMR#{O+~}KhP|Atx;gY3u zx^S$e9ic~`!7sOhlWRa)o7qeB(g%M=n3PpTbCNK=ogCVS03Vi1y9pk;dYmbK%DP5R zg7_QR@GYJaBoepBMgS4$*%`24RXS(ZwqfcbTSdz=GvChIe5rmOTXs3!C&`aClq5KM zID#_t7^VE<#e#(D?0W?Ww7~^R3tR?jCplhLx^`gWB3*<&Z1}2LKa;8{!Xx0r{r^u1 zyn^KGp!(PSKW7I1d+L9)!vA~@|F4wHD~3$sgn2g7kle{wL@D cC$vuRf2mhZ5&0hkhC_P2W?yGIs(+sT4=&FrG5`Po literal 0 HcmV?d00001 diff --git a/inc/jquery/tablesorter/themes/green/style.css b/inc/jquery/tablesorter/themes/green/style.css new file mode 100644 index 0000000..4a54589 --- /dev/null +++ b/inc/jquery/tablesorter/themes/green/style.css @@ -0,0 +1,39 @@ +table.tablesorter { + font-size: 12px; + background-color: #4D4D4D; + width: 1024px; + border: 1px solid #000; +} +table.tablesorter th { + text-align: left; + padding: 5px; + background-color: #6E6E6E; +} +table.tablesorter td { + color: #FFF; + padding: 5px; +} +table.tablesorter .even { + background-color: #3D3D3D; +} +table.tablesorter .odd { + background-color: #6E6E6E; +} +table.tablesorter .header { + background-image: url(bg.png); + background-repeat: no-repeat; + border-left: 1px solid #FFF; + border-right: 1px solid #000; + border-top: 1px solid #FFF; + padding-left: 30px; + padding-top: 8px; + height: auto; +} +table.tablesorter .headerSortUp { + background-image: url(asc.png); + background-repeat: no-repeat; +} +table.tablesorter .headerSortDown { + background-image: url(desc.png); + background-repeat: no-repeat; +} \ No newline at end of file -- 2.34.1