lz4/js/rendercharts.js

236 lines
7.8 KiB
JavaScript

(function(window, document) {
// http://stackoverflow.com/a/1414175/2132223
var stringToBoolean1 = function (str) {
switch(str.toLowerCase()) {
case "true": case "yes": case "1": return true;
case "false": case "no": case "0": case null: return false;
default: return null;
}
};
var stringToBoolean = function (str) {
var b = stringToBoolean1(str);
if(b === null) {
b = Boolean(str);
}
return b;
};
// http://stackoverflow.com/a/4981700/2132223
var getNestedObjectByName = function (strObjName) {
var parts = strObjName.split(".");
for (var i = 0, len = parts.length, obj = window; i < len; ++i) {
obj = obj[parts[i]];
}
return obj;
};
// Copyright 2012-2013 Daniel Tillin
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// csvToArray v2.1 (Unminifiled for development)
//
// For documentation visit:
// http://code.google.com/p/csv-to-array/
//
var csvToArray = function (csvStr, o) {
var od = {
'fSep': ',',
'rSep': '\r\n',
'quot': '"',
'head': false,
'trim': false
}
if (o) {
for (var i in od) {
if (!o[i]) o[i] = od[i];
}
} else {
o = od;
}
var a = [
['']
];
for (var r = f = p = q = 0; p < csvStr.length; p++) {
switch (c = csvStr.charAt(p)) {
case o.quot:
if (q && csvStr.charAt(p + 1) == o.quot) {
a[r][f] += o.quot;
++p;
} else {
q ^= 1;
}
break;
case o.fSep:
if (!q) {
if (o.trim) {
a[r][f] = a[r][f].replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
a[r][++f] = '';
} else {
a[r][f] += c;
}
break;
case o.rSep.charAt(0):
if (!q && (!o.rSep.charAt(1) || (o.rSep.charAt(1) && o.rSep.charAt(1) == csvStr.charAt(p + 1)))) {
if (o.trim) {
a[r][f] = a[r][f].replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
a[++r] = [''];
a[r][f = 0] = '';
if (o.rSep.charAt(1)) {
++p;
}
} else {
a[r][f] += c;
}
break;
default:
a[r][f] += c;
}
}
if (o.head) {
a.shift()
}
if (a[a.length - 1].length < a[0].length) {
a.pop()
}
return a;
};
// end of http://code.google.com/p/csv-to-array/
var estimateColumnType = function (csvAsArray, columnIndex) {
var isColumnBoolean = function (csvAsArray, columnIndex) {
for(var row = 0, nRow = csvAsArray.length; row < nRow; ++row) {
if(stringToBoolean1(csvAsArray[row][columnIndex]) === null) {
return false;
}
}
return true;
};
var isColumnNumber = function (csvAsArray, columnIndex) {
// http://stackoverflow.com/a/1830844/2132223
var isNumber = function(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
for(var row = 0, nRow = csvAsArray.length; row < nRow; ++row) {
if(! isNumber(csvAsArray[row][columnIndex])) {
return false;
}
}
return true;
};
if(isColumnBoolean(csvAsArray, columnIndex)) {
return "boolean";
}
if(isColumnNumber(csvAsArray, columnIndex)) {
return "number";
}
return "string";
};
var drawTable = function (gvCtor, gvOptions, csvUrl, csvEl) {
var r = new XMLHttpRequest();
r.open("GET", csvUrl, true);
r.onreadystatechange = function() {
if (this.readyState === 4 && this.status == 200) {
var csvAsArray = csvToArray(this.responseText);
var gvdt = new google.visualization.DataTable()
var csvHeaderLine = csvAsArray.shift();
for(var i = 0; i < csvHeaderLine.length; i++) {
/*
var csvHeaderElement = csvHeaderLine[i].split(":");
var csvHeaderName = "?";
var csvHeaderType = "string";
if(csvHeaderElement.length > 0) {
csvHeaderName = csvHeaderElement[0];
if(csvHeaderElement.length > 1) {
csvHeaderType = csvHeaderElement[1].trim();
}
}
gvdt.addColumn(csvHeaderType, csvHeaderName);
for(var j = 0; j < csvAsArray.length; j++) {
switch(csvHeaderType) {
default:
case "string": csvAsArray[j][i] = String(csvAsArray[j][i]); break;
case "number": csvAsArray[j][i] = Number(csvAsArray[j][i]); break;
case "boolean": csvAsArray[j][i] = stringToBoolean(csvAsArray[j][i]); break;
}
}
*/
var csvHeaderType = estimateColumnType(csvAsArray, i);
// alert("column" + i + " = " + csvHeaderType);
gvdt.addColumn(csvHeaderType, csvHeaderLine[i]);
for(var j = 0; j < csvAsArray.length; j++) {
switch(csvHeaderType) {
default:
case "string": csvAsArray[j][i] = String(csvAsArray[j][i]); break;
case "number": csvAsArray[j][i] = Number(csvAsArray[j][i]); break;
case "boolean": csvAsArray[j][i] = stringToBoolean(csvAsArray[j][i]); break;
}
}
}
gvdt.addRows(csvAsArray);
var ctor = getNestedObjectByName(gvCtor);
var table = new ctor (csvEl);
table.draw(gvdt, gvOptions);
}
}
r.send();
};
var foreachCsvElement = function(cb) {
var divEls = document.getElementsByTagName("div");
for (var i = 0, n = divEls.length; i < n; i++) {
var divEl = divEls[i];
var propsAttr = divEl.getAttribute("data-csv-props");
if(propsAttr !== null) {
cb(divEl, JSON.parse(propsAttr));
}
}
};
var packages = function() {
var gvPackageSet = [];
foreachCsvElement(function(csvEl, props) {
var gvPackageName = props["csvGvPackage"];
if(! gvPackageSet.hasOwnProperty(gvPackageName)) {
gvPackageSet.push(gvPackageName);
}
});
return gvPackageSet;
}();
google.load("visualization", "1", {"packages": packages});
google.setOnLoadCallback(function() {
foreachCsvElement(function(csvEl, props) {
var srcAttr = props["csvSrc"];
var gvCtorName = props["csvGvType"];
drawTable(gvCtorName, props, srcAttr, csvEl);
});
});
})(window, document);