http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/pivot.js ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/pivot.js b/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/pivot.js new file mode 100644 index 0000000..c4f7eab --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/pivot.js @@ -0,0 +1,1363 @@ +(function() { + var callWithJQuery, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + __slice = [].slice, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __hasProp = {}.hasOwnProperty; + + callWithJQuery = function(pivotModule) { + if (typeof exports === "object" && typeof module === "object") { + return pivotModule(require("jquery")); + } else if (typeof define === "function" && define.amd) { + return define(["jquery"], pivotModule); + } else { + return pivotModule(jQuery); + } + }; + + callWithJQuery(function($) { + + /* + Utilities + */ + var PivotData, addSeparators, aggregatorTemplates, aggregators, dayNamesEn, derivers, locales, mthNamesEn, naturalSort, numberFormat, pivotTableRenderer, renderers, usFmt, usFmtInt, usFmtPct, zeroPad; + addSeparators = function(nStr, thousandsSep, decimalSep) { + var rgx, x, x1, x2; + nStr += ''; + x = nStr.split('.'); + x1 = x[0]; + x2 = x.length > 1 ? decimalSep + x[1] : ''; + rgx = /(\d+)(\d{3})/; + while (rgx.test(x1)) { + x1 = x1.replace(rgx, '$1' + thousandsSep + '$2'); + } + return x1 + x2; + }; + numberFormat = function(opts) { + var defaults; + defaults = { + digitsAfterDecimal: 2, + scaler: 1, + thousandsSep: ",", + decimalSep: ".", + prefix: "", + suffix: "", + showZero: false + }; + opts = $.extend(defaults, opts); + return function(x) { + var result; + if (isNaN(x) || !isFinite(x)) { + return ""; + } + if (x === 0 && !opts.showZero) { + return ""; + } + result = addSeparators((opts.scaler * x).toFixed(opts.digitsAfterDecimal), opts.thousandsSep, opts.decimalSep); + return "" + opts.prefix + result + opts.suffix; + }; + }; + usFmt = numberFormat(); + usFmtInt = numberFormat({ + digitsAfterDecimal: 0 + }); + usFmtPct = numberFormat({ + digitsAfterDecimal: 1, + scaler: 100, + suffix: "%" + }); + aggregatorTemplates = { + count: function(formatter) { + if (formatter == null) { + formatter = usFmtInt; + } + return function() { + return function(data, rowKey, colKey) { + return { + count: 0, + push: function() { + return this.count++; + }, + value: function() { + return this.count; + }, + format: formatter + }; + }; + }; + }, + countUnique: function(formatter) { + if (formatter == null) { + formatter = usFmtInt; + } + return function(_arg) { + var attr; + attr = _arg[0]; + return function(data, rowKey, colKey) { + return { + uniq: [], + push: function(record) { + var _ref; + if (_ref = record[attr], __indexOf.call(this.uniq, _ref) < 0) { + return this.uniq.push(record[attr]); + } + }, + value: function() { + return this.uniq.length; + }, + format: formatter, + numInputs: attr != null ? 0 : 1 + }; + }; + }; + }, + listUnique: function(sep) { + return function(_arg) { + var attr; + attr = _arg[0]; + return function(data, rowKey, colKey) { + return { + uniq: [], + push: function(record) { + var _ref; + if (_ref = record[attr], __indexOf.call(this.uniq, _ref) < 0) { + return this.uniq.push(record[attr]); + } + }, + value: function() { + return this.uniq.join(sep); + }, + format: function(x) { + return x; + }, + numInputs: attr != null ? 0 : 1 + }; + }; + }; + }, + sum: function(formatter) { + if (formatter == null) { + formatter = usFmt; + } + return function(_arg) { + var attr; + attr = _arg[0]; + return function(data, rowKey, colKey) { + return { + sum: 0, + push: function(record) { + if (!isNaN(parseFloat(record[attr]))) { + return this.sum += parseFloat(record[attr]); + } + }, + value: function() { + return this.sum; + }, + format: formatter, + numInputs: attr != null ? 0 : 1 + }; + }; + }; + }, + average: function(formatter) { + if (formatter == null) { + formatter = usFmt; + } + return function(_arg) { + var attr; + attr = _arg[0]; + return function(data, rowKey, colKey) { + return { + sum: 0, + len: 0, + push: function(record) { + if (!isNaN(parseFloat(record[attr]))) { + this.sum += parseFloat(record[attr]); + return this.len++; + } + }, + value: function() { + return this.sum / this.len; + }, + format: formatter, + numInputs: attr != null ? 0 : 1 + }; + }; + }; + }, + sumOverSum: function(formatter) { + if (formatter == null) { + formatter = usFmt; + } + return function(_arg) { + var denom, num; + num = _arg[0], denom = _arg[1]; + return function(data, rowKey, colKey) { + return { + sumNum: 0, + sumDenom: 0, + push: function(record) { + if (!isNaN(parseFloat(record[num]))) { + this.sumNum += parseFloat(record[num]); + } + if (!isNaN(parseFloat(record[denom]))) { + return this.sumDenom += parseFloat(record[denom]); + } + }, + value: function() { + return this.sumNum / this.sumDenom; + }, + format: formatter, + numInputs: (num != null) && (denom != null) ? 0 : 2 + }; + }; + }; + }, + sumOverSumBound80: function(upper, formatter) { + if (upper == null) { + upper = true; + } + if (formatter == null) { + formatter = usFmt; + } + return function(_arg) { + var denom, num; + num = _arg[0], denom = _arg[1]; + return function(data, rowKey, colKey) { + return { + sumNum: 0, + sumDenom: 0, + push: function(record) { + if (!isNaN(parseFloat(record[num]))) { + this.sumNum += parseFloat(record[num]); + } + if (!isNaN(parseFloat(record[denom]))) { + return this.sumDenom += parseFloat(record[denom]); + } + }, + value: function() { + var sign; + sign = upper ? 1 : -1; + return (0.821187207574908 / this.sumDenom + this.sumNum / this.sumDenom + 1.2815515655446004 * sign * Math.sqrt(0.410593603787454 / (this.sumDenom * this.sumDenom) + (this.sumNum * (1 - this.sumNum / this.sumDenom)) / (this.sumDenom * this.sumDenom))) / (1 + 1.642374415149816 / this.sumDenom); + }, + format: formatter, + numInputs: (num != null) && (denom != null) ? 0 : 2 + }; + }; + }; + }, + fractionOf: function(wrapped, type, formatter) { + if (type == null) { + type = "total"; + } + if (formatter == null) { + formatter = usFmtPct; + } + return function() { + var x; + x = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + return function(data, rowKey, colKey) { + return { + selector: { + total: [[], []], + row: [rowKey, []], + col: [[], colKey] + }[type], + inner: wrapped.apply(null, x)(data, rowKey, colKey), + push: function(record) { + return this.inner.push(record); + }, + format: formatter, + value: function() { + return this.inner.value() / data.getAggregator.apply(data, this.selector).inner.value(); + }, + numInputs: wrapped.apply(null, x)().numInputs + }; + }; + }; + } + }; + aggregators = (function(tpl) { + return { + "Count": tpl.count(usFmtInt), + "Count Unique Values": tpl.countUnique(usFmtInt), + "List Unique Values": tpl.listUnique(", "), + "Sum": tpl.sum(usFmt), + "Integer Sum": tpl.sum(usFmtInt), + "Average": tpl.average(usFmt), + "Sum over Sum": tpl.sumOverSum(usFmt), + "80% Upper Bound": tpl.sumOverSumBound80(true, usFmt), + "80% Lower Bound": tpl.sumOverSumBound80(false, usFmt), + "Sum as Fraction of Total": tpl.fractionOf(tpl.sum(), "total", usFmtPct), + "Sum as Fraction of Rows": tpl.fractionOf(tpl.sum(), "row", usFmtPct), + "Sum as Fraction of Columns": tpl.fractionOf(tpl.sum(), "col", usFmtPct), + "Count as Fraction of Total": tpl.fractionOf(tpl.count(), "total", usFmtPct), + "Count as Fraction of Rows": tpl.fractionOf(tpl.count(), "row", usFmtPct), + "Count as Fraction of Columns": tpl.fractionOf(tpl.count(), "col", usFmtPct) + }; + })(aggregatorTemplates); + renderers = { + "Table": function(pvtData, opts) { + return pivotTableRenderer(pvtData, opts); + }, + "Table Barchart": function(pvtData, opts) { + return $(pivotTableRenderer(pvtData, opts)).barchart(); + }, + "Heatmap": function(pvtData, opts) { + return $(pivotTableRenderer(pvtData, opts)).heatmap(); + }, + "Row Heatmap": function(pvtData, opts) { + return $(pivotTableRenderer(pvtData, opts)).heatmap("rowheatmap"); + }, + "Col Heatmap": function(pvtData, opts) { + return $(pivotTableRenderer(pvtData, opts)).heatmap("colheatmap"); + } + }; + locales = { + en: { + aggregators: aggregators, + renderers: renderers, + localeStrings: { + renderError: "An error occurred rendering the PivotTable results.", + computeError: "An error occurred computing the PivotTable results.", + uiRenderError: "An error occurred rendering the PivotTable UI.", + selectAll: "Select All", + selectNone: "Select None", + tooMany: "(too many to list)", + filterResults: "Filter results", + totals: "Totals", + vs: "vs", + by: "by" + } + } + }; + mthNamesEn = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + dayNamesEn = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + zeroPad = function(number) { + return ("0" + number).substr(-2, 2); + }; + derivers = { + bin: function(col, binWidth) { + return function(record) { + return record[col] - record[col] % binWidth; + }; + }, + dateFormat: function(col, formatString, mthNames, dayNames) { + if (mthNames == null) { + mthNames = mthNamesEn; + } + if (dayNames == null) { + dayNames = dayNamesEn; + } + return function(record) { + var date; + date = new Date(Date.parse(record[col])); + if (isNaN(date)) { + return ""; + } + return formatString.replace(/%(.)/g, function(m, p) { + switch (p) { + case "y": + return date.getFullYear(); + case "m": + return zeroPad(date.getMonth() + 1); + case "n": + return mthNames[date.getMonth()]; + case "d": + return zeroPad(date.getDate()); + case "w": + return dayNames[date.getDay()]; + case "x": + return date.getDay(); + case "H": + return zeroPad(date.getHours()); + case "M": + return zeroPad(date.getMinutes()); + case "S": + return zeroPad(date.getSeconds()); + default: + return "%" + p; + } + }); + }; + } + }; + naturalSort = (function(_this) { + return function(as, bs) { + var a, a1, b, b1, rd, rx, rz; + rx = /(\d+)|(\D+)/g; + rd = /\d/; + rz = /^0/; + if (typeof as === "number" || typeof bs === "number") { + if (isNaN(as)) { + return 1; + } + if (isNaN(bs)) { + return -1; + } + return as - bs; + } + a = String(as).toLowerCase(); + b = String(bs).toLowerCase(); + if (a === b) { + return 0; + } + if (!(rd.test(a) && rd.test(b))) { + return (a > b ? 1 : -1); + } + a = a.match(rx); + b = b.match(rx); + while (a.length && b.length) { + a1 = a.shift(); + b1 = b.shift(); + if (a1 !== b1) { + if (rd.test(a1) && rd.test(b1)) { + return a1.replace(rz, ".0") - b1.replace(rz, ".0"); + } else { + return (a1 > b1 ? 1 : -1); + } + } + } + return a.length - b.length; + }; + })(this); + $.pivotUtilities = { + aggregatorTemplates: aggregatorTemplates, + aggregators: aggregators, + renderers: renderers, + derivers: derivers, + locales: locales, + naturalSort: naturalSort, + numberFormat: numberFormat + }; + + /* + Data Model class + */ + PivotData = (function() { + function PivotData(input, opts) { + this.getAggregator = __bind(this.getAggregator, this); + this.getRowKeys = __bind(this.getRowKeys, this); + this.getColKeys = __bind(this.getColKeys, this); + this.sortKeys = __bind(this.sortKeys, this); + this.arrSort = __bind(this.arrSort, this); + this.natSort = __bind(this.natSort, this); + this.aggregator = opts.aggregator; + this.aggregatorName = opts.aggregatorName; + this.colAttrs = opts.cols; + this.rowAttrs = opts.rows; + this.valAttrs = opts.vals; + this.tree = {}; + this.rowKeys = []; + this.colKeys = []; + this.rowTotals = {}; + this.colTotals = {}; + this.allTotal = this.aggregator(this, [], []); + this.sorted = false; + PivotData.forEachRecord(input, opts.derivedAttributes, (function(_this) { + return function(record) { + if (opts.filter(record)) { + return _this.processRecord(record); + } + }; + })(this)); + } + + PivotData.forEachRecord = function(input, derivedAttributes, f) { + var addRecord, compactRecord, i, j, k, record, tblCols, _i, _len, _ref, _results, _results1; + if ($.isEmptyObject(derivedAttributes)) { + addRecord = f; + } else { + addRecord = function(record) { + var k, v, _ref; + for (k in derivedAttributes) { + v = derivedAttributes[k]; + record[k] = (_ref = v(record)) != null ? _ref : record[k]; + } + return f(record); + }; + } + if ($.isFunction(input)) { + return input(addRecord); + } else if ($.isArray(input)) { + if ($.isArray(input[0])) { + _results = []; + for (i in input) { + if (!__hasProp.call(input, i)) continue; + compactRecord = input[i]; + if (!(i > 0)) { + continue; + } + record = {}; + _ref = input[0]; + for (j in _ref) { + if (!__hasProp.call(_ref, j)) continue; + k = _ref[j]; + record[k] = compactRecord[j]; + } + _results.push(addRecord(record)); + } + return _results; + } else { + _results1 = []; + for (_i = 0, _len = input.length; _i < _len; _i++) { + record = input[_i]; + _results1.push(addRecord(record)); + } + return _results1; + } + } else if (input instanceof jQuery) { + tblCols = []; + $("thead > tr > th", input).each(function(i) { + return tblCols.push($(this).text()); + }); + return $("tbody > tr", input).each(function(i) { + record = {}; + $("td", this).each(function(j) { + return record[tblCols[j]] = $(this).text(); + }); + return addRecord(record); + }); + } else { + throw new Error("unknown input format"); + } + }; + + PivotData.convertToArray = function(input) { + var result; + result = []; + PivotData.forEachRecord(input, {}, function(record) { + return result.push(record); + }); + return result; + }; + + PivotData.prototype.natSort = function(as, bs) { + return naturalSort(as, bs); + }; + + PivotData.prototype.arrSort = function(a, b) { + return this.natSort(a.join(), b.join()); + }; + + PivotData.prototype.sortKeys = function() { + if (!this.sorted) { + this.rowKeys.sort(this.arrSort); + this.colKeys.sort(this.arrSort); + } + return this.sorted = true; + }; + + PivotData.prototype.getColKeys = function() { + this.sortKeys(); + return this.colKeys; + }; + + PivotData.prototype.getRowKeys = function() { + this.sortKeys(); + return this.rowKeys; + }; + + PivotData.prototype.processRecord = function(record) { + var colKey, flatColKey, flatRowKey, rowKey, x, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3; + colKey = []; + rowKey = []; + _ref = this.colAttrs; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + x = _ref[_i]; + colKey.push((_ref1 = record[x]) != null ? _ref1 : "null"); + } + _ref2 = this.rowAttrs; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + x = _ref2[_j]; + rowKey.push((_ref3 = record[x]) != null ? _ref3 : "null"); + } + flatRowKey = rowKey.join(String.fromCharCode(0)); + flatColKey = colKey.join(String.fromCharCode(0)); + this.allTotal.push(record); + if (rowKey.length !== 0) { + if (!this.rowTotals[flatRowKey]) { + this.rowKeys.push(rowKey); + this.rowTotals[flatRowKey] = this.aggregator(this, rowKey, []); + } + this.rowTotals[flatRowKey].push(record); + } + if (colKey.length !== 0) { + if (!this.colTotals[flatColKey]) { + this.colKeys.push(colKey); + this.colTotals[flatColKey] = this.aggregator(this, [], colKey); + } + this.colTotals[flatColKey].push(record); + } + if (colKey.length !== 0 && rowKey.length !== 0) { + if (!this.tree[flatRowKey]) { + this.tree[flatRowKey] = {}; + } + if (!this.tree[flatRowKey][flatColKey]) { + this.tree[flatRowKey][flatColKey] = this.aggregator(this, rowKey, colKey); + } + return this.tree[flatRowKey][flatColKey].push(record); + } + }; + + PivotData.prototype.getAggregator = function(rowKey, colKey) { + var agg, flatColKey, flatRowKey; + flatRowKey = rowKey.join(String.fromCharCode(0)); + flatColKey = colKey.join(String.fromCharCode(0)); + if (rowKey.length === 0 && colKey.length === 0) { + agg = this.allTotal; + } else if (rowKey.length === 0) { + agg = this.colTotals[flatColKey]; + } else if (colKey.length === 0) { + agg = this.rowTotals[flatRowKey]; + } else { + agg = this.tree[flatRowKey][flatColKey]; + } + return agg != null ? agg : { + value: (function() { + return null; + }), + format: function() { + return ""; + } + }; + }; + + return PivotData; + + })(); + + /* + Default Renderer for hierarchical table layout + */ + pivotTableRenderer = function(pivotData, opts) { + var aggregator, c, colAttrs, colKey, colKeys, defaults, i, j, r, result, rowAttrs, rowKey, rowKeys, spanSize, td, th, totalAggregator, tr, txt, val, x; + defaults = { + localeStrings: { + totals: "Totals" + } + }; + opts = $.extend(defaults, opts); + colAttrs = pivotData.colAttrs; + rowAttrs = pivotData.rowAttrs; + rowKeys = pivotData.getRowKeys(); + colKeys = pivotData.getColKeys(); + result = document.createElement("table"); + result.className = "pvtTable"; + spanSize = function(arr, i, j) { + var len, noDraw, stop, x, _i, _j; + if (i !== 0) { + noDraw = true; + for (x = _i = 0; 0 <= j ? _i <= j : _i >= j; x = 0 <= j ? ++_i : --_i) { + if (arr[i - 1][x] !== arr[i][x]) { + noDraw = false; + } + } + if (noDraw) { + return -1; + } + } + len = 0; + while (i + len < arr.length) { + stop = false; + for (x = _j = 0; 0 <= j ? _j <= j : _j >= j; x = 0 <= j ? ++_j : --_j) { + if (arr[i][x] !== arr[i + len][x]) { + stop = true; + } + } + if (stop) { + break; + } + len++; + } + return len; + }; + for (j in colAttrs) { + if (!__hasProp.call(colAttrs, j)) continue; + c = colAttrs[j]; + tr = document.createElement("tr"); + if (parseInt(j) === 0 && rowAttrs.length !== 0) { + th = document.createElement("th"); + th.setAttribute("colspan", rowAttrs.length); + th.setAttribute("rowspan", colAttrs.length); + tr.appendChild(th); + } + th = document.createElement("th"); + th.className = "pvtAxisLabel"; + th.textContent = c; + tr.appendChild(th); + for (i in colKeys) { + if (!__hasProp.call(colKeys, i)) continue; + colKey = colKeys[i]; + x = spanSize(colKeys, parseInt(i), parseInt(j)); + if (x !== -1) { + th = document.createElement("th"); + th.className = "pvtColLabel"; + th.textContent = colKey[j]; + th.setAttribute("colspan", x); + if (parseInt(j) === colAttrs.length - 1 && rowAttrs.length !== 0) { + th.setAttribute("rowspan", 2); + } + tr.appendChild(th); + } + } + if (parseInt(j) === 0) { + th = document.createElement("th"); + th.className = "pvtTotalLabel"; + th.innerHTML = opts.localeStrings.totals; + th.setAttribute("rowspan", colAttrs.length + (rowAttrs.length === 0 ? 0 : 1)); + tr.appendChild(th); + } + result.appendChild(tr); + } + if (rowAttrs.length !== 0) { + tr = document.createElement("tr"); + for (i in rowAttrs) { + if (!__hasProp.call(rowAttrs, i)) continue; + r = rowAttrs[i]; + th = document.createElement("th"); + th.className = "pvtAxisLabel"; + th.textContent = r; + tr.appendChild(th); + } + th = document.createElement("th"); + if (colAttrs.length === 0) { + th.className = "pvtTotalLabel"; + th.innerHTML = opts.localeStrings.totals; + } + tr.appendChild(th); + result.appendChild(tr); + } + for (i in rowKeys) { + if (!__hasProp.call(rowKeys, i)) continue; + rowKey = rowKeys[i]; + tr = document.createElement("tr"); + for (j in rowKey) { + if (!__hasProp.call(rowKey, j)) continue; + txt = rowKey[j]; + x = spanSize(rowKeys, parseInt(i), parseInt(j)); + if (x !== -1) { + th = document.createElement("th"); + th.className = "pvtRowLabel"; + th.textContent = txt; + th.setAttribute("rowspan", x); + if (parseInt(j) === rowAttrs.length - 1 && colAttrs.length !== 0) { + th.setAttribute("colspan", 2); + } + tr.appendChild(th); + } + } + for (j in colKeys) { + if (!__hasProp.call(colKeys, j)) continue; + colKey = colKeys[j]; + aggregator = pivotData.getAggregator(rowKey, colKey); + val = aggregator.value(); + td = document.createElement("td"); + td.className = "pvtVal row" + i + " col" + j; + td.innerHTML = aggregator.format(val); + td.setAttribute("data-value", val); + tr.appendChild(td); + } + totalAggregator = pivotData.getAggregator(rowKey, []); + val = totalAggregator.value(); + td = document.createElement("td"); + td.className = "pvtTotal rowTotal"; + td.innerHTML = totalAggregator.format(val); + td.setAttribute("data-value", val); + td.setAttribute("data-for", "row" + i); + tr.appendChild(td); + result.appendChild(tr); + } + tr = document.createElement("tr"); + th = document.createElement("th"); + th.className = "pvtTotalLabel"; + th.innerHTML = opts.localeStrings.totals; + th.setAttribute("colspan", rowAttrs.length + (colAttrs.length === 0 ? 0 : 1)); + tr.appendChild(th); + for (j in colKeys) { + if (!__hasProp.call(colKeys, j)) continue; + colKey = colKeys[j]; + totalAggregator = pivotData.getAggregator([], colKey); + val = totalAggregator.value(); + td = document.createElement("td"); + td.className = "pvtTotal colTotal"; + td.innerHTML = totalAggregator.format(val); + td.setAttribute("data-value", val); + td.setAttribute("data-for", "col" + j); + tr.appendChild(td); + } + totalAggregator = pivotData.getAggregator([], []); + val = totalAggregator.value(); + td = document.createElement("td"); + td.className = "pvtGrandTotal"; + td.innerHTML = totalAggregator.format(val); + td.setAttribute("data-value", val); + tr.appendChild(td); + result.appendChild(tr); + result.setAttribute("data-numrows", rowKeys.length); + result.setAttribute("data-numcols", colKeys.length); + return result; + }; + + /* + Pivot Table core: create PivotData object and call Renderer on it + */ + $.fn.pivot = function(input, opts) { + var defaults, e, pivotData, result, x; + defaults = { + cols: [], + rows: [], + filter: function() { + return true; + }, + aggregator: aggregatorTemplates.count()(), + aggregatorName: "Count", + derivedAttributes: {}, + renderer: pivotTableRenderer, + rendererOptions: null, + localeStrings: locales.en.localeStrings + }; + opts = $.extend(defaults, opts); + result = null; + try { + pivotData = new PivotData(input, opts); + try { + result = opts.renderer(pivotData, opts.rendererOptions); + } catch (_error) { + e = _error; + if (typeof console !== "undefined" && console !== null) { + console.error(e.stack); + } + result = $("<span>").html(opts.localeStrings.renderError); + } + } catch (_error) { + e = _error; + if (typeof console !== "undefined" && console !== null) { + console.error(e.stack); + } + result = $("<span>").html(opts.localeStrings.computeError); + } + x = this[0]; + while (x.hasChildNodes()) { + x.removeChild(x.lastChild); + } + return this.append(result); + }; + + /* + Pivot Table UI: calls Pivot Table core above with options set by user + */ + $.fn.pivotUI = function(input, inputOpts, overwrite, locale) { + var a, aggregator, attrLength, axisValues, c, colList, defaults, e, existingOpts, i, initialRender, k, opts, pivotTable, refresh, refreshDelayed, renderer, rendererControl, shownAttributes, tblCols, tr1, tr2, uiTable, unusedAttrsVerticalAutoOverride, x, _fn, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _ref4; + if (overwrite == null) { + overwrite = false; + } + if (locale == null) { + locale = "en"; + } + defaults = { + derivedAttributes: {}, + aggregators: locales[locale].aggregators, + renderers: locales[locale].renderers, + hiddenAttributes: [], + menuLimit: 200, + cols: [], + rows: [], + vals: [], + exclusions: {}, + unusedAttrsVertical: "auto", + autoSortUnusedAttrs: false, + rendererOptions: { + localeStrings: locales[locale].localeStrings + }, + onRefresh: null, + filter: function() { + return true; + }, + localeStrings: locales[locale].localeStrings + }; + existingOpts = this.data("pivotUIOptions"); + if ((existingOpts == null) || overwrite) { + opts = $.extend(defaults, inputOpts); + } else { + opts = existingOpts; + } + try { + input = PivotData.convertToArray(input); + tblCols = (function() { + var _ref, _results; + _ref = input[0]; + _results = []; + for (k in _ref) { + if (!__hasProp.call(_ref, k)) continue; + _results.push(k); + } + return _results; + })(); + _ref = opts.derivedAttributes; + for (c in _ref) { + if (!__hasProp.call(_ref, c)) continue; + if ((__indexOf.call(tblCols, c) < 0)) { + tblCols.push(c); + } + } + axisValues = {}; + for (_i = 0, _len = tblCols.length; _i < _len; _i++) { + x = tblCols[_i]; + axisValues[x] = {}; + } + PivotData.forEachRecord(input, opts.derivedAttributes, function(record) { + var v, _base, _results; + _results = []; + for (k in record) { + if (!__hasProp.call(record, k)) continue; + v = record[k]; + if (!(opts.filter(record))) { + continue; + } + if (v == null) { + v = "null"; + } + if ((_base = axisValues[k])[v] == null) { + _base[v] = 0; + } + _results.push(axisValues[k][v]++); + } + return _results; + }); + uiTable = $("<table cellpadding='5'>"); + rendererControl = $("<td>"); + renderer = $("<select class='pvtRenderer'>").appendTo(rendererControl).bind("change", function() { + return refresh(); + }); + _ref1 = opts.renderers; + for (x in _ref1) { + if (!__hasProp.call(_ref1, x)) continue; + $("<option>").val(x).html(x).appendTo(renderer); + } + colList = $("<td class='pvtAxisContainer pvtUnused'>"); + shownAttributes = (function() { + var _j, _len1, _results; + _results = []; + for (_j = 0, _len1 = tblCols.length; _j < _len1; _j++) { + c = tblCols[_j]; + if (__indexOf.call(opts.hiddenAttributes, c) < 0) { + _results.push(c); + } + } + return _results; + })(); + unusedAttrsVerticalAutoOverride = false; + if (opts.unusedAttrsVertical === "auto") { + attrLength = 0; + for (_j = 0, _len1 = shownAttributes.length; _j < _len1; _j++) { + a = shownAttributes[_j]; + attrLength += a.length; + } + unusedAttrsVerticalAutoOverride = attrLength > 120; + } + if (opts.unusedAttrsVertical === true || unusedAttrsVerticalAutoOverride) { + colList.addClass('pvtVertList'); + } else { + colList.addClass('pvtHorizList'); + } + _fn = function(c) { + var attrElem, btns, checkContainer, filterItem, filterItemExcluded, hasExcludedItem, keys, showFilterList, triangleLink, updateFilter, v, valueList, _k, _len2, _ref2; + keys = (function() { + var _results; + _results = []; + for (k in axisValues[c]) { + _results.push(k); + } + return _results; + })(); + hasExcludedItem = false; + valueList = $("<div>").addClass('pvtFilterBox').hide(); + valueList.append($("<h4>").text("" + c + " (" + keys.length + ")")); + if (keys.length > opts.menuLimit) { + valueList.append($("<p>").html(opts.localeStrings.tooMany)); + } else { + btns = $("<p>").appendTo(valueList); + btns.append($("<button>", { + type: "button" + }).html(opts.localeStrings.selectAll).bind("click", function() { + return valueList.find("input:visible").prop("checked", true); + })); + btns.append($("<button>", { + type: "button" + }).html(opts.localeStrings.selectNone).bind("click", function() { + return valueList.find("input:visible").prop("checked", false); + })); + btns.append($("<input>").addClass("pvtSearch").attr("placeholder", opts.localeStrings.filterResults).bind("keyup", function() { + var filter; + filter = $(this).val().toLowerCase(); + return $(this).parents(".pvtFilterBox").find('label span').each(function() { + var testString; + testString = $(this).text().toLowerCase().indexOf(filter); + if (testString !== -1) { + return $(this).parent().show(); + } else { + return $(this).parent().hide(); + } + }); + })); + checkContainer = $("<div>").addClass("pvtCheckContainer").appendTo(valueList); + _ref2 = keys.sort(naturalSort); + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + k = _ref2[_k]; + v = axisValues[c][k]; + filterItem = $("<label>"); + filterItemExcluded = opts.exclusions[c] ? (__indexOf.call(opts.exclusions[c], k) >= 0) : false; + hasExcludedItem || (hasExcludedItem = filterItemExcluded); + $("<input type='checkbox' class='pvtFilter'>").attr("checked", !filterItemExcluded).data("filter", [c, k]).appendTo(filterItem); + filterItem.append($("<span>").text("" + k + " (" + v + ")")); + checkContainer.append($("<p>").append(filterItem)); + } + } + updateFilter = function() { + var unselectedCount; + unselectedCount = $(valueList).find("[type='checkbox']").length - $(valueList).find("[type='checkbox']:checked").length; + if (unselectedCount > 0) { + attrElem.addClass("pvtFilteredAttribute"); + } else { + attrElem.removeClass("pvtFilteredAttribute"); + } + if (keys.length > opts.menuLimit) { + return valueList.toggle(); + } else { + return valueList.toggle(0, refresh); + } + }; + $("<p>").appendTo(valueList).append($("<button>", { + type: "button" + }).text("OK").bind("click", updateFilter)); + showFilterList = function(e) { + valueList.css({ + left: e.pageX, + top: e.pageY + }).toggle(); + $('.pvtSearch').val(''); + return $('label').show(); + }; + triangleLink = $("<span class='pvtTriangle'>").html(" ▾").bind("click", showFilterList); + attrElem = $("<li class='axis_" + i + "'>").append($("<span class='pvtAttr'>").text(c).data("attrName", c).append(triangleLink)); + if (hasExcludedItem) { + attrElem.addClass('pvtFilteredAttribute'); + } + colList.append(attrElem).append(valueList); + return attrElem.bind("dblclick", showFilterList); + }; + for (i in shownAttributes) { + c = shownAttributes[i]; + _fn(c); + } + tr1 = $("<tr>").appendTo(uiTable); + aggregator = $("<select class='pvtAggregator'>").bind("change", function() { + return refresh(); + }); + _ref2 = opts.aggregators; + for (x in _ref2) { + if (!__hasProp.call(_ref2, x)) continue; + aggregator.append($("<option>").val(x).html(x)); + } + $("<td class='pvtVals'>").appendTo(tr1).append(aggregator).append($("<br>")); + $("<td class='pvtAxisContainer pvtHorizList pvtCols'>").appendTo(tr1); + tr2 = $("<tr>").appendTo(uiTable); + tr2.append($("<td valign='top' class='pvtAxisContainer pvtRows'>")); + pivotTable = $("<td valign='top' class='pvtRendererArea'>").appendTo(tr2); + if (opts.unusedAttrsVertical === true || unusedAttrsVerticalAutoOverride) { + uiTable.find('tr:nth-child(1)').prepend(rendererControl); + uiTable.find('tr:nth-child(2)').prepend(colList); + } else { + uiTable.prepend($("<tr>").append(rendererControl).append(colList)); + } + this.html(uiTable); + _ref3 = opts.cols; + for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) { + x = _ref3[_k]; + this.find(".pvtCols").append(this.find(".axis_" + (shownAttributes.indexOf(x)))); + } + _ref4 = opts.rows; + for (_l = 0, _len3 = _ref4.length; _l < _len3; _l++) { + x = _ref4[_l]; + this.find(".pvtRows").append(this.find(".axis_" + (shownAttributes.indexOf(x)))); + } + if (opts.aggregatorName != null) { + this.find(".pvtAggregator").val(opts.aggregatorName); + } + if (opts.rendererName != null) { + this.find(".pvtRenderer").val(opts.rendererName); + } + initialRender = true; + refreshDelayed = (function(_this) { + return function() { + var attr, exclusions, natSort, newDropdown, numInputsToProcess, pivotUIOptions, pvtVals, subopts, unusedAttrsContainer, vals, _len4, _m, _n, _ref5; + subopts = { + derivedAttributes: opts.derivedAttributes, + localeStrings: opts.localeStrings, + rendererOptions: opts.rendererOptions, + cols: [], + rows: [] + }; + numInputsToProcess = (_ref5 = opts.aggregators[aggregator.val()]([])().numInputs) != null ? _ref5 : 0; + vals = []; + _this.find(".pvtRows li span.pvtAttr").each(function() { + return subopts.rows.push($(this).data("attrName")); + }); + _this.find(".pvtCols li span.pvtAttr").each(function() { + return subopts.cols.push($(this).data("attrName")); + }); + _this.find(".pvtVals select.pvtAttrDropdown").each(function() { + if (numInputsToProcess === 0) { + return $(this).remove(); + } else { + numInputsToProcess--; + if ($(this).val() !== "") { + return vals.push($(this).val()); + } + } + }); + if (numInputsToProcess !== 0) { + pvtVals = _this.find(".pvtVals"); + for (x = _m = 0; 0 <= numInputsToProcess ? _m < numInputsToProcess : _m > numInputsToProcess; x = 0 <= numInputsToProcess ? ++_m : --_m) { + newDropdown = $("<select class='pvtAttrDropdown'>").append($("<option>")).bind("change", function() { + return refresh(); + }); + for (_n = 0, _len4 = shownAttributes.length; _n < _len4; _n++) { + attr = shownAttributes[_n]; + newDropdown.append($("<option>").val(attr).text(attr)); + } + pvtVals.append(newDropdown); + } + } + if (initialRender) { + vals = opts.vals; + i = 0; + _this.find(".pvtVals select.pvtAttrDropdown").each(function() { + $(this).val(vals[i]); + return i++; + }); + initialRender = false; + } + subopts.aggregatorName = aggregator.val(); + subopts.vals = vals; + subopts.aggregator = opts.aggregators[aggregator.val()](vals); + subopts.renderer = opts.renderers[renderer.val()]; + exclusions = {}; + _this.find('input.pvtFilter').not(':checked').each(function() { + var filter; + filter = $(this).data("filter"); + if (exclusions[filter[0]] != null) { + return exclusions[filter[0]].push(filter[1]); + } else { + return exclusions[filter[0]] = [filter[1]]; + } + }); + subopts.filter = function(record) { + var excludedItems, _ref6; + if (!opts.filter(record)) { + return false; + } + for (k in exclusions) { + excludedItems = exclusions[k]; + if (_ref6 = "" + record[k], __indexOf.call(excludedItems, _ref6) >= 0) { + return false; + } + } + return true; + }; + pivotTable.pivot(input, subopts); + pivotUIOptions = $.extend(opts, { + cols: subopts.cols, + rows: subopts.rows, + vals: vals, + exclusions: exclusions, + aggregatorName: aggregator.val(), + rendererName: renderer.val() + }); + _this.data("pivotUIOptions", pivotUIOptions); + if (opts.autoSortUnusedAttrs) { + natSort = $.pivotUtilities.naturalSort; + unusedAttrsContainer = _this.find("td.pvtUnused.pvtAxisContainer"); + $(unusedAttrsContainer).children("li").sort(function(a, b) { + return natSort($(a).text(), $(b).text()); + }).appendTo(unusedAttrsContainer); + } + pivotTable.css("opacity", 1); + if (opts.onRefresh != null) { + return opts.onRefresh(pivotUIOptions); + } + }; + })(this); + refresh = (function(_this) { + return function() { + pivotTable.css("opacity", 0.5); + return setTimeout(refreshDelayed, 10); + }; + })(this); + refresh(); + this.find(".pvtAxisContainer").sortable({ + update: function(e, ui) { + if (ui.sender == null) { + return refresh(); + } + }, + connectWith: this.find(".pvtAxisContainer"), + items: 'li', + placeholder: 'pvtPlaceholder' + }); + } catch (_error) { + e = _error; + if (typeof console !== "undefined" && console !== null) { + console.error(e.stack); + } + this.html(opts.localeStrings.uiRenderError); + } + return this; + }; + + /* + Heatmap post-processing + */ + $.fn.heatmap = function(scope) { + var colorGen, heatmapper, i, j, numCols, numRows, _i, _j; + if (scope == null) { + scope = "heatmap"; + } + numRows = this.data("numrows"); + numCols = this.data("numcols"); + colorGen = function(color, min, max) { + var hexGen; + hexGen = (function() { + switch (color) { + case "red": + return function(hex) { + return "ff" + hex + hex; + }; + case "green": + return function(hex) { + return "" + hex + "ff" + hex; + }; + case "blue": + return function(hex) { + return "" + hex + hex + "ff"; + }; + } + })(); + return function(x) { + var hex, intensity; + intensity = 255 - Math.round(255 * (x - min) / (max - min)); + hex = intensity.toString(16).split(".")[0]; + if (hex.length === 1) { + hex = 0 + hex; + } + return hexGen(hex); + }; + }; + heatmapper = (function(_this) { + return function(scope, color) { + var colorFor, forEachCell, values; + forEachCell = function(f) { + return _this.find(scope).each(function() { + var x; + x = $(this).data("value"); + if ((x != null) && isFinite(x)) { + return f(x, $(this)); + } + }); + }; + values = []; + forEachCell(function(x) { + return values.push(x); + }); + colorFor = colorGen(color, Math.min.apply(Math, values), Math.max.apply(Math, values)); + return forEachCell(function(x, elem) { + return elem.css("background-color", "#" + colorFor(x)); + }); + }; + })(this); + switch (scope) { + case "heatmap": + heatmapper(".pvtVal", "red"); + break; + case "rowheatmap": + for (i = _i = 0; 0 <= numRows ? _i < numRows : _i > numRows; i = 0 <= numRows ? ++_i : --_i) { + heatmapper(".pvtVal.row" + i, "red"); + } + break; + case "colheatmap": + for (j = _j = 0; 0 <= numCols ? _j < numCols : _j > numCols; j = 0 <= numCols ? ++_j : --_j) { + heatmapper(".pvtVal.col" + j, "red"); + } + } + heatmapper(".pvtTotal.rowTotal", "red"); + heatmapper(".pvtTotal.colTotal", "red"); + return this; + }; + + /* + Barchart post-processing + */ + return $.fn.barchart = function() { + var barcharter, i, numCols, numRows, _i; + numRows = this.data("numrows"); + numCols = this.data("numcols"); + barcharter = (function(_this) { + return function(scope) { + var forEachCell, max, scaler, values; + forEachCell = function(f) { + return _this.find(scope).each(function() { + var x; + x = $(this).data("value"); + if ((x != null) && isFinite(x)) { + return f(x, $(this)); + } + }); + }; + values = []; + forEachCell(function(x) { + return values.push(x); + }); + max = Math.max.apply(Math, values); + scaler = function(x) { + return 100 * x / (1.4 * max); + }; + return forEachCell(function(x, elem) { + var text, wrapper; + text = elem.text(); + wrapper = $("<div>").css({ + "position": "relative", + "height": "55px" + }); + wrapper.append($("<div>").css({ + "position": "absolute", + "bottom": 0, + "left": 0, + "right": 0, + "height": scaler(x) + "%", + "background-color": "gray" + })); + wrapper.append($("<div>").text(text).css({ + "position": "relative", + "padding-left": "5px", + "padding-right": "5px" + })); + return elem.css({ + "padding": 0, + "padding-top": "5px", + "text-align": "center" + }).html(wrapper); + }); + }; + })(this); + for (i = _i = 0; 0 <= numRows ? _i < numRows : _i > numRows; i = 0 <= numRows ? ++_i : --_i) { + barcharter(".pvtVal.row" + i); + } + barcharter(".pvtTotal.colTotal"); + return this; + }; + }); + +}).call(this); + +//# sourceMappingURL=pivot.js.map \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/470ee4d7/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/pivot.min.js ---------------------------------------------------------------------- diff --git a/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/pivot.min.js b/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/pivot.min.js new file mode 100644 index 0000000..4ea9f33 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/webapp/js/lib/pivot.min.js @@ -0,0 +1,2 @@ +(function(){var t,e=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1},n=[].slice,r=function(t,e){return function(){return t.apply(e,arguments)}},o={}.hasOwnProperty;(t=function(t){return"object"==typeof exports&&"object"==typeof module?t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){var a,i,s,u,l,c,p,h,d,f,g,m,v,b,A,y;return i=function(t,e,n){var r,o,a,i;for(t+="",o=t.split("."),a=o[0],i=o.length>1?n+o[1]:"",r=/(\d+)(\d{3})/;r.test(a);)a=a.replace(r,"$1"+e+"$2");return a+i},f=function(e){var n;return n={digitsAfterDecimal:2,scaler:1,thousandsSep:",",decimalSep:".",prefix:"",suffix:"",showZero:!1},e=t.extend(n,e),function(t){var n;return isNaN(t)||!isFinite(t)?"":0!==t||e.showZero?(n=i((e.scaler*t).toFixed(e.digitsAfterDecimal),e.thousandsSep,e.decimalSep),""+e.prefix+n+e.suffix):""}},v=f(),b=f({digitsAfterDecimal:0}),A=f({digitsAfterDecimal:1,scaler:100,suffix:"%"}),s={count: function(t){return null==t&&(t=b),function(){return function(){return{count:0,push:function(){return this.count++},value:function(){return this.count},format:t}}}},countUnique:function(t){return null==t&&(t=b),function(n){var r;return r=n[0],function(){return{uniq:[],push:function(t){var n;return n=t[r],e.call(this.uniq,n)<0?this.uniq.push(t[r]):void 0},value:function(){return this.uniq.length},format:t,numInputs:null!=r?0:1}}}},listUnique:function(t){return function(n){var r;return r=n[0],function(){return{uniq:[],push:function(t){var n;return n=t[r],e.call(this.uniq,n)<0?this.uniq.push(t[r]):void 0},value:function(){return this.uniq.join(t)},format:function(t){return t},numInputs:null!=r?0:1}}}},sum:function(t){return null==t&&(t=v),function(e){var n;return n=e[0],function(){return{sum:0,push:function(t){return isNaN(parseFloat(t[n]))?void 0:this.sum+=parseFloat(t[n])},value:function(){return this.sum},format:t,numInputs:null!=n?0:1}}}},average:function(t){return null==t&&(t=v),fu nction(e){var n;return n=e[0],function(){return{sum:0,len:0,push:function(t){return isNaN(parseFloat(t[n]))?void 0:(this.sum+=parseFloat(t[n]),this.len++)},value:function(){return this.sum/this.len},format:t,numInputs:null!=n?0:1}}}},sumOverSum:function(t){return null==t&&(t=v),function(e){var n,r;return r=e[0],n=e[1],function(){return{sumNum:0,sumDenom:0,push:function(t){return isNaN(parseFloat(t[r]))||(this.sumNum+=parseFloat(t[r])),isNaN(parseFloat(t[n]))?void 0:this.sumDenom+=parseFloat(t[n])},value:function(){return this.sumNum/this.sumDenom},format:t,numInputs:null!=r&&null!=n?0:2}}}},sumOverSumBound80:function(t,e){return null==t&&(t=!0),null==e&&(e=v),function(n){var r,o;return o=n[0],r=n[1],function(){return{sumNum:0,sumDenom:0,push:function(t){return isNaN(parseFloat(t[o]))||(this.sumNum+=parseFloat(t[o])),isNaN(parseFloat(t[r]))?void 0:this.sumDenom+=parseFloat(t[r])},value:function(){var e;return e=t?1:-1,(.821187207574908/this.sumDenom+this.sumNum/this.sumDenom+1.281551 5655446004*e*Math.sqrt(.410593603787454/(this.sumDenom*this.sumDenom)+this.sumNum*(1-this.sumNum/this.sumDenom)/(this.sumDenom*this.sumDenom)))/(1+1.642374415149816/this.sumDenom)},format:e,numInputs:null!=o&&null!=r?0:2}}}},fractionOf:function(t,e,r){return null==e&&(e="total"),null==r&&(r=A),function(){var o;return o=1<=arguments.length?n.call(arguments,0):[],function(n,a,i){return{selector:{total:[[],[]],row:[a,[]],col:[[],i]}[e],inner:t.apply(null,o)(n,a,i),push:function(t){return this.inner.push(t)},format:r,value:function(){return this.inner.value()/n.getAggregator.apply(n,this.selector).inner.value()},numInputs:t.apply(null,o)().numInputs}}}}},u=function(t){return{Count:t.count(b),"Count Unique Values":t.countUnique(b),"List Unique Values":t.listUnique(", "),Sum:t.sum(v),"Integer Sum":t.sum(b),Average:t.average(v),"Sum over Sum":t.sumOverSum(v),"80% Upper Bound":t.sumOverSumBound80(!0,v),"80% Lower Bound":t.sumOverSumBound80(!1,v),"Sum as Fraction of Total":t.fractionOf(t.sum (),"total",A),"Sum as Fraction of Rows":t.fractionOf(t.sum(),"row",A),"Sum as Fraction of Columns":t.fractionOf(t.sum(),"col",A),"Count as Fraction of Total":t.fractionOf(t.count(),"total",A),"Count as Fraction of Rows":t.fractionOf(t.count(),"row",A),"Count as Fraction of Columns":t.fractionOf(t.count(),"col",A)}}(s),m={Table:function(t,e){return g(t,e)},"Table Barchart":function(e,n){return t(g(e,n)).barchart()},Heatmap:function(e,n){return t(g(e,n)).heatmap()},"Row Heatmap":function(e,n){return t(g(e,n)).heatmap("rowheatmap")},"Col Heatmap":function(e,n){return t(g(e,n)).heatmap("colheatmap")}},p={en:{aggregators:u,renderers:m,localeStrings:{renderError:"An error occurred rendering the PivotTable results.",computeError:"An error occurred computing the PivotTable results.",uiRenderError:"An error occurred rendering the PivotTable UI.",selectAll:"Select All",selectNone:"Select None",tooMany:"(too many to list)",filterResults:"Filter results",totals:"Totals",vs:"vs",by:"by"}}},h=["J an","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],l=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],y=function(t){return("0"+t).substr(-2,2)},c={bin:function(t,e){return function(n){return n[t]-n[t]%e}},dateFormat:function(t,e,n,r){return null==n&&(n=h),null==r&&(r=l),function(o){var a;return a=new Date(Date.parse(o[t])),isNaN(a)?"":e.replace(/%(.)/g,function(t,e){switch(e){case"y":return a.getFullYear();case"m":return y(a.getMonth()+1);case"n":return n[a.getMonth()];case"d":return y(a.getDate());case"w":return r[a.getDay()];case"x":return a.getDay();case"H":return y(a.getHours());case"M":return y(a.getMinutes());case"S":return y(a.getSeconds());default:return"%"+e}})}}},d=function(){return function(t,e){var n,r,o,a,i,s,u;if(s=/(\d+)|(\D+)/g,i=/\d/,u=/^0/,"number"==typeof t||"number"==typeof e)return isNaN(t)?1:isNaN(e)?-1:t-e;if(n=String(t).toLowerCase(),o=String(e).toLowerCase(),n===o)return 0;if(!i.test(n)||!i.test(o))return n>o?1:-1;for(n=n.match(s),o=o.match(s) ;n.length&&o.length;)if(r=n.shift(),a=o.shift(),r!==a)return i.test(r)&&i.test(a)?r.replace(u,".0")-a.replace(u,".0"):r>a?1:-1;return n.length-o.length}}(this),t.pivotUtilities={aggregatorTemplates:s,aggregators:u,renderers:m,derivers:c,locales:p,naturalSort:d,numberFormat:f},a=function(){function e(t,n){this.getAggregator=r(this.getAggregator,this),this.getRowKeys=r(this.getRowKeys,this),this.getColKeys=r(this.getColKeys,this),this.sortKeys=r(this.sortKeys,this),this.arrSort=r(this.arrSort,this),this.natSort=r(this.natSort,this),this.aggregator=n.aggregator,this.aggregatorName=n.aggregatorName,this.colAttrs=n.cols,this.rowAttrs=n.rows,this.valAttrs=n.vals,this.tree={},this.rowKeys=[],this.colKeys=[],this.rowTotals={},this.colTotals={},this.allTotal=this.aggregator(this,[],[]),this.sorted=!1,e.forEachRecord(t,n.derivedAttributes,function(t){return function(e){return n.filter(e)?t.processRecord(e):void 0}}(this))}return e.forEachRecord=function(e,n,r){var a,i,s,u,l,c,p,h,d,f,g,m;if(a =t.isEmptyObject(n)?r:function(t){var e,o,a;for(e in n)o=n[e],t[e]=null!=(a=o(t))?a:t[e];return r(t)},t.isFunction(e))return e(a);if(t.isArray(e)){if(t.isArray(e[0])){g=[];for(s in e)if(o.call(e,s)&&(i=e[s],s>0)){c={},f=e[0];for(u in f)o.call(f,u)&&(l=f[u],c[l]=i[u]);g.push(a(c))}return g}for(m=[],h=0,d=e.length;d>h;h++)c=e[h],m.push(a(c));return m}if(e instanceof jQuery)return p=[],t("thead > tr > th",e).each(function(){return p.push(t(this).text())}),t("tbody > tr",e).each(function(){return c={},t("td",this).each(function(e){return c[p[e]]=t(this).text()}),a(c)});throw new Error("unknown input format")},e.convertToArray=function(t){var n;return n=[],e.forEachRecord(t,{},function(t){return n.push(t)}),n},e.prototype.natSort=function(t,e){return d(t,e)},e.prototype.arrSort=function(t,e){return this.natSort(t.join(),e.join())},e.prototype.sortKeys=function(){return this.sorted||(this.rowKeys.sort(this.arrSort),this.colKeys.sort(this.arrSort)),this.sorted=!0},e.prototype.getColKeys=fu nction(){return this.sortKeys(),this.colKeys},e.prototype.getRowKeys=function(){return this.sortKeys(),this.rowKeys},e.prototype.processRecord=function(t){var e,n,r,o,a,i,s,u,l,c,p,h,d;for(e=[],o=[],c=this.colAttrs,i=0,u=c.length;u>i;i++)a=c[i],e.push(null!=(p=t[a])?p:"null");for(h=this.rowAttrs,s=0,l=h.length;l>s;s++)a=h[s],o.push(null!=(d=t[a])?d:"null");return r=o.join(String.fromCharCode(0)),n=e.join(String.fromCharCode(0)),this.allTotal.push(t),0!==o.length&&(this.rowTotals[r]||(this.rowKeys.push(o),this.rowTotals[r]=this.aggregator(this,o,[])),this.rowTotals[r].push(t)),0!==e.length&&(this.colTotals[n]||(this.colKeys.push(e),this.colTotals[n]=this.aggregator(this,[],e)),this.colTotals[n].push(t)),0!==e.length&&0!==o.length?(this.tree[r]||(this.tree[r]={}),this.tree[r][n]||(this.tree[r][n]=this.aggregator(this,o,e)),this.tree[r][n].push(t)):void 0},e.prototype.getAggregator=function(t,e){var n,r,o;return o=t.join(String.fromCharCode(0)),r=e.join(String.fromCharCode(0)),n=0===t. length&&0===e.length?this.allTotal:0===t.length?this.colTotals[r]:0===e.length?this.rowTotals[o]:this.tree[o][r],null!=n?n:{value:function(){return null},format:function(){return""}}},e}(),g=function(e,n){var r,a,i,s,u,l,c,p,h,d,f,g,m,v,b,A,y,w,C,S,T;l={localeStrings:{totals:"Totals"}},n=t.extend(l,n),i=e.colAttrs,f=e.rowAttrs,m=e.getRowKeys(),u=e.getColKeys(),d=document.createElement("table"),d.className="pvtTable",v=function(t,e,n){var r,o,a,i,s,u;if(0!==e){for(o=!0,i=s=0;n>=0?n>=s:s>=n;i=n>=0?++s:--s)t[e-1][i]!==t[e][i]&&(o=!1);if(o)return-1}for(r=0;e+r<t.length;){for(a=!1,i=u=0;n>=0?n>=u:u>=n;i=n>=0?++u:--u)t[e][i]!==t[e+r][i]&&(a=!0);if(a)break;r++}return r};for(p in i)if(o.call(i,p)){a=i[p],w=document.createElement("tr"),0===parseInt(p)&&0!==f.length&&(A=document.createElement("th"),A.setAttribute("colspan",f.length),A.setAttribute("rowspan",i.length),w.appendChild(A)),A=document.createElement("th"),A.className="pvtAxisLabel",A.textContent=a,w.appendChild(A);for(c in u)o.call( u,c)&&(s=u[c],T=v(u,parseInt(c),parseInt(p)),-1!==T&&(A=document.createElement("th"),A.className="pvtColLabel",A.textContent=s[p],A.setAttribute("colspan",T),parseInt(p)===i.length-1&&0!==f.length&&A.setAttribute("rowspan",2),w.appendChild(A)));0===parseInt(p)&&(A=document.createElement("th"),A.className="pvtTotalLabel",A.innerHTML=n.localeStrings.totals,A.setAttribute("rowspan",i.length+(0===f.length?0:1)),w.appendChild(A)),d.appendChild(w)}if(0!==f.length){w=document.createElement("tr");for(c in f)o.call(f,c)&&(h=f[c],A=document.createElement("th"),A.className="pvtAxisLabel",A.textContent=h,w.appendChild(A));A=document.createElement("th"),0===i.length&&(A.className="pvtTotalLabel",A.innerHTML=n.localeStrings.totals),w.appendChild(A),d.appendChild(w)}for(c in m)if(o.call(m,c)){g=m[c],w=document.createElement("tr");for(p in g)o.call(g,p)&&(C=g[p],T=v(m,parseInt(c),parseInt(p)),-1!==T&&(A=document.createElement("th"),A.className="pvtRowLabel",A.textContent=C,A.setAttribute("rowspan", T),parseInt(p)===f.length-1&&0!==i.length&&A.setAttribute("colspan",2),w.appendChild(A)));for(p in u)o.call(u,p)&&(s=u[p],r=e.getAggregator(g,s),S=r.value(),b=document.createElement("td"),b.className="pvtVal row"+c+" col"+p,b.innerHTML=r.format(S),b.setAttribute("data-value",S),w.appendChild(b));y=e.getAggregator(g,[]),S=y.value(),b=document.createElement("td"),b.className="pvtTotal rowTotal",b.innerHTML=y.format(S),b.setAttribute("data-value",S),b.setAttribute("data-for","row"+c),w.appendChild(b),d.appendChild(w)}w=document.createElement("tr"),A=document.createElement("th"),A.className="pvtTotalLabel",A.innerHTML=n.localeStrings.totals,A.setAttribute("colspan",f.length+(0===i.length?0:1)),w.appendChild(A);for(p in u)o.call(u,p)&&(s=u[p],y=e.getAggregator([],s),S=y.value(),b=document.createElement("td"),b.className="pvtTotal colTotal",b.innerHTML=y.format(S),b.setAttribute("data-value",S),b.setAttribute("data-for","col"+p),w.appendChild(b));return y=e.getAggregator([],[]),S=y.value( ),b=document.createElement("td"),b.className="pvtGrandTotal",b.innerHTML=y.format(S),b.setAttribute("data-value",S),w.appendChild(b),d.appendChild(w),d.setAttribute("data-numrows",m.length),d.setAttribute("data-numcols",u.length),d},t.fn.pivot=function(e,n){var r,o,i,u,l;r={cols:[],rows:[],filter:function(){return!0},aggregator:s.count()(),aggregatorName:"Count",derivedAttributes:{},renderer:g,rendererOptions:null,localeStrings:p.en.localeStrings},n=t.extend(r,n),u=null;try{i=new a(e,n);try{u=n.renderer(i,n.rendererOptions)}catch(c){o=c,"undefined"!=typeof console&&null!==console&&console.error(o.stack),u=t("<span>").html(n.localeStrings.renderError)}}catch(c){o=c,"undefined"!=typeof console&&null!==console&&console.error(o.stack),u=t("<span>").html(n.localeStrings.computeError)}for(l=this[0];l.hasChildNodes();)l.removeChild(l.lastChild);return this.append(u)},t.fn.pivotUI=function(n,r,i,s){var u,l,c,h,f,g,m,v,b,A,y,w,C,S,T,x,N,F,E,D,O,R,L,k,M,I,K,q,U,V,j,H,B,P,J,_,z,Q,W;null==i&&(i =!1),null==s&&(s="en"),m={derivedAttributes:{},aggregators:p[s].aggregators,renderers:p[s].renderers,hiddenAttributes:[],menuLimit:200,cols:[],rows:[],vals:[],exclusions:{},unusedAttrsVertical:"auto",autoSortUnusedAttrs:!1,rendererOptions:{localeStrings:p[s].localeStrings},onRefresh:null,filter:function(){return!0},localeStrings:p[s].localeStrings},b=this.data("pivotUIOptions"),C=null==b||i?t.extend(m,r):b;try{n=a.convertToArray(n),D=function(){var t,e;t=n[0],e=[];for(w in t)o.call(t,w)&&e.push(w);return e}(),J=C.derivedAttributes;for(f in J)o.call(J,f)&&e.call(D,f)<0&&D.push(f);for(h={},K=0,j=D.length;j>K;K++)M=D[K],h[M]={};a.forEachRecord(n,C.derivedAttributes,function(t){var e,n,r;r=[];for(w in t)o.call(t,w)&&(e=t[w],C.filter(t)&&(null==e&&(e="null"),null==(n=h[w])[e]&&(n[e]=0),r.push(h[w][e]++)));return r}),L=t("<table cellpadding='5'>"),F=t("<td>"),N=t("<select class='pvtRenderer'>").appendTo(F).bind("change",function(){return T()}),_=C.renderers;for(M in _)o.call(_,M)&&t("<opt ion>").val(M).html(M).appendTo(N);if(g=t("<td class='pvtAxisContainer pvtUnused'>"),E=function(){var t,n,r;for(r=[],t=0,n=D.length;n>t;t++)f=D[t],e.call(C.hiddenAttributes,f)<0&&r.push(f);return r}(),k=!1,"auto"===C.unusedAttrsVertical){for(c=0,q=0,H=E.length;H>q;q++)u=E[q],c+=u.length;k=c>120}g.addClass(C.unusedAttrsVertical===!0||k?"pvtVertList":"pvtHorizList"),I=function(n){var r,o,a,i,s,u,l,c,p,f,m,v,b,y,S;if(l=function(){var t;t=[];for(w in h[n])t.push(w);return t}(),u=!1,v=t("<div>").addClass("pvtFilterBox").hide(),v.append(t("<h4>").text(""+n+" ("+l.length+")")),l.length>C.menuLimit)v.append(t("<p>").html(C.localeStrings.tooMany));else for(o=t("<p>").appendTo(v),o.append(t("<button>",{type:"button"}).html(C.localeStrings.selectAll).bind("click",function(){return v.find("input:visible").prop("checked",!0)})),o.append(t("<button>",{type:"button"}).html(C.localeStrings.selectNone).bind("click",function(){return v.find("input:visible").prop("checked",!1)})),o.append(t("<input>"). addClass("pvtSearch").attr("placeholder",C.localeStrings.filterResults).bind("keyup",function(){var e;return e=t(this).val().toLowerCase(),t(this).parents(".pvtFilterBox").find("label span").each(function(){var n;return n=t(this).text().toLowerCase().indexOf(e),-1!==n?t(this).parent().show():t(this).parent().hide()})})),a=t("<div>").addClass("pvtCheckContainer").appendTo(v),S=l.sort(d),b=0,y=S.length;y>b;b++)w=S[b],m=h[n][w],i=t("<label>"),s=C.exclusions[n]?e.call(C.exclusions[n],w)>=0:!1,u||(u=s),t("<input type='checkbox' class='pvtFilter'>").attr("checked",!s).data("filter",[n,w]).appendTo(i),i.append(t("<span>").text(""+w+" ("+m+")")),a.append(t("<p>").append(i));return f=function(){var e;return e=t(v).find("[type='checkbox']").length-t(v).find("[type='checkbox']:checked").length,e>0?r.addClass("pvtFilteredAttribute"):r.removeClass("pvtFilteredAttribute"),l.length>C.menuLimit?v.toggle():v.toggle(0,T)},t("<p>").appendTo(v).append(t("<button>",{type:"button"}).text("OK").bind("clic k",f)),c=function(e){return v.css({left:e.pageX,top:e.pageY}).toggle(),t(".pvtSearch").val(""),t("label").show()},p=t("<span class='pvtTriangle'>").html(" ▾").bind("click",c),r=t("<li class='axis_"+A+"'>").append(t("<span class='pvtAttr'>").text(n).data("attrName",n).append(p)),u&&r.addClass("pvtFilteredAttribute"),g.append(r).append(v),r.bind("dblclick",c)};for(A in E)f=E[A],I(f);O=t("<tr>").appendTo(L),l=t("<select class='pvtAggregator'>").bind("change",function(){return T()}),z=C.aggregators;for(M in z)o.call(z,M)&&l.append(t("<option>").val(M).html(M));for(t("<td class='pvtVals'>").appendTo(O).append(l).append(t("<br>")),t("<td class='pvtAxisContainer pvtHorizList pvtCols'>").appendTo(O),R=t("<tr>").appendTo(L),R.append(t("<td valign='top' class='pvtAxisContainer pvtRows'>")),S=t("<td valign='top' class='pvtRendererArea'>").appendTo(R),C.unusedAttrsVertical===!0||k?(L.find("tr:nth-child(1)").prepend(F),L.find("tr:nth-child(2)").prepend(g)):L.prepend(t("<tr>").append(F).ap pend(g)),this.html(L),Q=C.cols,U=0,B=Q.length;B>U;U++)M=Q[U],this.find(".pvtCols").append(this.find(".axis_"+E.indexOf(M)));for(W=C.rows,V=0,P=W.length;P>V;V++)M=W[V],this.find(".pvtRows").append(this.find(".axis_"+E.indexOf(M)));null!=C.aggregatorName&&this.find(".pvtAggregator").val(C.aggregatorName),null!=C.rendererName&&this.find(".pvtRenderer").val(C.rendererName),y=!0,x=function(r){return function(){var o,a,i,s,u,c,p,h,d,f,g,m,v,b;if(h={derivedAttributes:C.derivedAttributes,localeStrings:C.localeStrings,rendererOptions:C.rendererOptions,cols:[],rows:[]},u=null!=(b=C.aggregators[l.val()]([])().numInputs)?b:0,f=[],r.find(".pvtRows li span.pvtAttr").each(function(){return h.rows.push(t(this).data("attrName"))}),r.find(".pvtCols li span.pvtAttr").each(function(){return h.cols.push(t(this).data("attrName"))}),r.find(".pvtVals select.pvtAttrDropdown").each(function(){return 0===u?t(this).remove():(u--,""!==t(this).val()?f.push(t(this).val()):void 0)}),0!==u)for(p=r.find(".pvtVals"), M=m=0;u>=0?u>m:m>u;M=u>=0?++m:--m){for(s=t("<select class='pvtAttrDropdown'>").append(t("<option>")).bind("change",function(){return T()}),v=0,g=E.length;g>v;v++)o=E[v],s.append(t("<option>").val(o).text(o));p.append(s)}return y&&(f=C.vals,A=0,r.find(".pvtVals select.pvtAttrDropdown").each(function(){return t(this).val(f[A]),A++}),y=!1),h.aggregatorName=l.val(),h.vals=f,h.aggregator=C.aggregators[l.val()](f),h.renderer=C.renderers[N.val()],a={},r.find("input.pvtFilter").not(":checked").each(function(){var e;return e=t(this).data("filter"),null!=a[e[0]]?a[e[0]].push(e[1]):a[e[0]]=[e[1]]}),h.filter=function(t){var n,r;if(!C.filter(t))return!1;for(w in a)if(n=a[w],r=""+t[w],e.call(n,r)>=0)return!1;return!0},S.pivot(n,h),c=t.extend(C,{cols:h.cols,rows:h.rows,vals:f,exclusions:a,aggregatorName:l.val(),rendererName:N.val()}),r.data("pivotUIOptions",c),C.autoSortUnusedAttrs&&(i=t.pivotUtilities.naturalSort,d=r.find("td.pvtUnused.pvtAxisContainer"),t(d).children("li").sort(function(e,n){ret urn i(t(e).text(),t(n).text())}).appendTo(d)),S.css("opacity",1),null!=C.onRefresh?C.onRefresh(c):void 0}}(this),T=function(){return function(){return S.css("opacity",.5),setTimeout(x,10)}}(this),T(),this.find(".pvtAxisContainer").sortable({update:function(t,e){return null==e.sender?T():void 0},connectWith:this.find(".pvtAxisContainer"),items:"li",placeholder:"pvtPlaceholder"})}catch(Y){v=Y,"undefined"!=typeof console&&null!==console&&console.error(v.stack),this.html(C.localeStrings.uiRenderError)}return this},t.fn.heatmap=function(e){var n,r,o,a,i,s,u,l;switch(null==e&&(e="heatmap"),s=this.data("numrows"),i=this.data("numcols"),n=function(t,e,n){var r;return r=function(){switch(t){case"red":return function(t){return"ff"+t+t};case"green":return function(t){return""+t+"ff"+t};case"blue":return function(t){return""+t+t+"ff"}}}(),function(t){var o,a;return a=255-Math.round(255*(t-e)/(n-e)),o=a.toString(16).split(".")[0],1===o.length&&(o=0+o),r(o)}},r=function(e){return function(r,o){va r a,i,s;return i=function(n){return e.find(r).each(function(){var e;return e=t(this).data("value"),null!=e&&isFinite(e)?n(e,t(this)):void 0})},s=[],i(function(t){return s.push(t)}),a=n(o,Math.min.apply(Math,s),Math.max.apply(Math,s)),i(function(t,e){return e.css("background-color","#"+a(t))})}}(this),e){case"heatmap":r(".pvtVal","red");break;case"rowheatmap":for(o=u=0;s>=0?s>u:u>s;o=s>=0?++u:--u)r(".pvtVal.row"+o,"red");break;case"colheatmap":for(a=l=0;i>=0?i>l:l>i;a=i>=0?++l:--l)r(".pvtVal.col"+a,"red")}return r(".pvtTotal.rowTotal","red"),r(".pvtTotal.colTotal","red"),this},t.fn.barchart=function(){var e,n,r,o,a;for(o=this.data("numrows"),r=this.data("numcols"),e=function(e){return function(n){var r,o,a,i;return r=function(r){return e.find(n).each(function(){var e;return e=t(this).data("value"),null!=e&&isFinite(e)?r(e,t(this)):void 0})},i=[],r(function(t){return i.push(t)}),o=Math.max.apply(Math,i),a=function(t){return 100*t/(1.4*o)},r(function(e,n){var r,o;return r=n.text(),o=t( "<div>").css({position:"relative",height:"55px"}),o.append(t("<div>").css({position:"absolute",bottom:0,left:0,right:0,height:a(e)+"%","background-color":"gray"})),o.append(t("<div>").text(r).css({position:"relative","padding-left":"5px","padding-right":"5px"})),n.css({padding:0,"padding-top":"5px","text-align":"center"}).html(o)})}}(this),n=a=0;o>=0?o>a:a>o;n=o>=0?++a:--a)e(".pvtVal.row"+n);return e(".pvtTotal.colTotal"),this}})}).call(this); +//# sourceMappingURL=pivot.min.js.map \ No newline at end of file
