You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2014/12/29 19:45:30 UTC

[08/11] jena git commit: JENA-823 : Update for Fuseki2 interface : This closes #11

http://git-wip-us.apache.org/repos/asf/jena/blob/9e523d22/jena-fuseki2/src/main/webapp/js/lib/pivot.js
----------------------------------------------------------------------
diff --git a/jena-fuseki2/src/main/webapp/js/lib/pivot.js b/jena-fuseki2/src/main/webapp/js/lib/pivot.js
new file mode 100644
index 0000000..c4f7eab
--- /dev/null
+++ b/jena-fuseki2/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(" &#x25BE;").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/9e523d22/jena-fuseki2/src/main/webapp/js/lib/pivot.min.js
----------------------------------------------------------------------
diff --git a/jena-fuseki2/src/main/webapp/js/lib/pivot.min.js b/jena-fuseki2/src/main/webapp/js/lib/pivot.min.js
new file mode 100644
index 0000000..4ea9f33
--- /dev/null
+++ b/jena-fuseki2/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(" &#x25BE;").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