You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
7.3 KiB

/*
Data plugin for Highcharts
(c) 2012-2013 Torstein Hønsi
Last revision 2013-06-07
License: www.highcharts.com/license
*/
(function (h) {
var k = h.each,
m = function (b, a) {
this.init(b, a);
};
h.extend(m.prototype, {
init: function (b, a) {
this.options = b;
this.chartOptions = a;
this.columns = b.columns || this.rowsToColumns(b.rows) || [];
this.columns.length
? this.dataFound()
: (this.parseCSV(), this.parseTable(), this.parseGoogleSpreadsheet());
},
getColumnDistribution: function () {
var b = this.chartOptions,
a = b && b.chart && b.chart.type,
c = [];
k((b && b.series) || [], function (b) {
c.push((h.seriesTypes[b.type || a || 'line'].prototype.pointArrayMap || [0]).length);
});
this.valueCount = {
global: (h.seriesTypes[a || 'line'].prototype.pointArrayMap || [0]).length,
individual: c,
};
},
dataFound: function () {
this.parseTypes();
this.findHeaderRow();
this.parsed();
this.complete();
},
parseCSV: function () {
var b = this,
a = this.options,
c = a.csv,
d = this.columns,
f = a.startRow || 0,
i = a.endRow || Number.MAX_VALUE,
j = a.startColumn || 0,
e = a.endColumn || Number.MAX_VALUE,
g = 0;
c &&
((c = c
.replace(/\r\n/g, '\n')
.replace(/\r/g, '\n')
.split(a.lineDelimiter || '\n')),
k(c, function (c, h) {
var n = b.trim(c),
p = n.indexOf('#') === 0;
h >= f &&
h <= i &&
!p &&
n !== '' &&
((n = c.split(a.itemDelimiter || ',')),
k(n, function (b, a) {
a >= j && a <= e && (d[a - j] || (d[a - j] = []), (d[a - j][g] = b));
}),
(g += 1));
}),
this.dataFound());
},
parseTable: function () {
var b = this.options,
a = b.table,
c = this.columns,
d = b.startRow || 0,
f = b.endRow || Number.MAX_VALUE,
i = b.startColumn || 0,
j = b.endColumn || Number.MAX_VALUE,
e;
a &&
(typeof a === 'string' && (a = document.getElementById(a)),
k(a.getElementsByTagName('tr'), function (a, b) {
e = 0;
b >= d &&
b <= f &&
k(a.childNodes, function (a) {
if ((a.tagName === 'TD' || a.tagName === 'TH') && e >= i && e <= j)
c[e] || (c[e] = []), (c[e][b - d] = a.innerHTML), (e += 1);
});
}),
this.dataFound());
},
parseGoogleSpreadsheet: function () {
var b = this,
a = this.options,
c = a.googleSpreadsheetKey,
d = this.columns,
f = a.startRow || 0,
i = a.endRow || Number.MAX_VALUE,
j = a.startColumn || 0,
e = a.endColumn || Number.MAX_VALUE,
g,
h;
c &&
jQuery.getJSON(
'https://spreadsheets.google.com/feeds/cells/' +
c +
'/' +
(a.googleSpreadsheetWorksheet || 'od6') +
'/public/values?alt=json-in-script&callback=?',
function (a) {
var a = a.feed.entry,
c,
k = a.length,
m = 0,
o = 0,
l;
for (l = 0; l < k; l++)
(c = a[l]), (m = Math.max(m, c.gs$cell.col)), (o = Math.max(o, c.gs$cell.row));
for (l = 0; l < m; l++)
if (l >= j && l <= e) (d[l - j] = []), (d[l - j].length = Math.min(o, i - f));
for (l = 0; l < k; l++)
if (
((c = a[l]),
(g = c.gs$cell.row - 1),
(h = c.gs$cell.col - 1),
h >= j && h <= e && g >= f && g <= i)
)
d[h - j][g - f] = c.content.$t;
b.dataFound();
},
);
},
findHeaderRow: function () {
k(this.columns, function () {});
this.headerRow = 0;
},
trim: function (b) {
return typeof b === 'string' ? b.replace(/^\s+|\s+$/g, '') : b;
},
parseTypes: function () {
for (var b = this.columns, a = b.length, c, d, f, i; a--; )
for (c = b[a].length; c--; )
(d = b[a][c]),
(f = parseFloat(d)),
(i = this.trim(d)),
i == f
? ((b[a][c] = f), f > 31536e6 ? (b[a].isDatetime = !0) : (b[a].isNumeric = !0))
: ((d = this.parseDate(d)),
a === 0 && typeof d === 'number' && !isNaN(d)
? ((b[a][c] = d), (b[a].isDatetime = !0))
: (b[a][c] = i === '' ? null : i));
},
dateFormats: {
'YYYY-mm-dd': {
regex: '^([0-9]{4})-([0-9]{2})-([0-9]{2})$',
parser: function (b) {
return Date.UTC(+b[1], b[2] - 1, +b[3]);
},
},
},
parseDate: function (b) {
var a = this.options.parseDate,
c,
d,
f;
a && (c = a(b));
if (typeof b === 'string')
for (d in this.dateFormats)
(a = this.dateFormats[d]), (f = b.match(a.regex)) && (c = a.parser(f));
return c;
},
rowsToColumns: function (b) {
var a, c, d, f, i;
if (b) {
i = [];
c = b.length;
for (a = 0; a < c; a++) {
f = b[a].length;
for (d = 0; d < f; d++) i[d] || (i[d] = []), (i[d][a] = b[a][d]);
}
}
return i;
},
parsed: function () {
this.options.parsed && this.options.parsed.call(this, this.columns);
},
complete: function () {
var b = this.columns,
a,
c,
d = this.options,
f,
i,
j,
e,
g,
k;
if (d.complete) {
this.getColumnDistribution();
b.length > 1 &&
((a = b.shift()),
this.headerRow === 0 && a.shift(),
a.isDatetime ? (c = 'datetime') : a.isNumeric || (c = 'category'));
for (e = 0; e < b.length; e++) if (this.headerRow === 0) b[e].name = b[e].shift();
i = [];
for (e = 0, k = 0; e < b.length; k++) {
f = h.pick(this.valueCount.individual[k], this.valueCount.global);
j = [];
for (g = 0; g < b[e].length; g++)
(j[g] = [a[g], b[e][g] !== void 0 ? b[e][g] : null]),
f > 1 && j[g].push(b[e + 1][g] !== void 0 ? b[e + 1][g] : null),
f > 2 && j[g].push(b[e + 2][g] !== void 0 ? b[e + 2][g] : null),
f > 3 && j[g].push(b[e + 3][g] !== void 0 ? b[e + 3][g] : null),
f > 4 && j[g].push(b[e + 4][g] !== void 0 ? b[e + 4][g] : null);
i[k] = { name: b[e].name, data: j };
e += f;
}
d.complete({ xAxis: { type: c }, series: i });
}
},
});
h.Data = m;
h.data = function (b, a) {
return new m(b, a);
};
h.wrap(h.Chart.prototype, 'init', function (b, a, c) {
var d = this;
a && a.data
? h.data(
h.extend(a.data, {
complete: function (f) {
a.series &&
k(a.series, function (b, c) {
a.series[c] = h.merge(b, f.series[c]);
});
a = h.merge(f, a);
b.call(d, a, c);
},
}),
a,
)
: b.call(d, a, c);
});
})(Highcharts);