(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);