/* global console */
/* global visualizer */
(function($) {
var all_charts;
// so that we know which charts belong to our library.
var rendered_charts = [];
// save the settings corresponding to cssClassNames so that when a table is being edited, they stripes etc. don't get reset
var cssClassNames;
function renderChart(id, v) {
var chart = all_charts[id];
if(chart.library !== 'datatables'){
return;
}
cssClassNames = null;
renderSpecificChart(id, chart, v);
}
function renderSpecificChart(id, chart, v) {
var render, container, series, data, table, settings, i, j, row, date, axis, property, format, formatter, type, rows, cols;
if(chart.library !== 'datatables'){
return;
}
rendered_charts[id] = 'yes';
series = chart.series;
data = chart.data;
container = document.getElementById(id);
if (container == null) {
return;
}
if($('#' + id).find('table.visualizer-data-table').length > 0){
$('#' + id).empty();
}
settings = {
destroy: true,
paging: false,
searching: false,
ordering: true,
select: false,
lengthChange: false,
buttons: {
buttons: [{
extend: 'print',
text: '',
title: ''
}]
},
dom: 'Bfrtip',
};
var $classes = 'dataTable visualizer-data-table table table-striped';
if(typeof v.page_type !== 'undefined'){
switch(v.page_type){
case 'post':
// fall-through.
case 'library':
// for smaller screens...
if(window.innerWidth < 1500){
delete chart.settings['scrollX'];
delete chart.settings['scrollY'];
delete chart.settings['scrollY_int'];
$.extend( settings, {
scrollX: 150,
scrollY: (( chart.settings['responsive_bool'] === 'true' ? 0.8 : 0.5 ) * parseInt($(container).css('height').replace('px',''))),
scrollCollapse: true
} );
}else{
if(parseInt(chart.settings['scrollY_int']) > 180){
chart.settings['scrollY_int'];
}
delete chart.settings['scrollX'];
$.extend( settings, {
scrollX: 150,
scrollY: 180,
} );
}
break;
case 'chart':
delete chart.settings['scrollX']; // jshint ignore:line
// fall-through.
case 'frontend':
// empty.
break;
}
}
if(typeof chart.settings['scrollX'] !== 'undefined'){
if(chart.settings['scrollX'] == 'true'){ // jshint ignore:line
$classes = $classes + ' nowrap';
}
}
$('#' + id).append($('
'));
var select = {
info: false
};
// we cannot use { select } below because https://github.com/Codeinwp/visualizer/issues/357
$.extend( settings, { info: false } ); // jshint ignore:line
var stripe = ['', ''];
if(cssClassNames !== null){
chart.settings['cssClassNames'] = cssClassNames;
}
// in preview mode, cssClassNames will not exist when a color is changed.
if(typeof chart.settings['cssClassNames'] !== 'undefined'){
cssClassNames = chart.settings['cssClassNames'];
if(typeof chart.settings['cssClassNames']['oddTableRow'] !== 'undefined'){
stripe[0] = chart.settings['cssClassNames']['oddTableRow'];
}
if(typeof chart.settings['cssClassNames']['evenTableRow'] !== 'undefined'){
stripe[1] = chart.settings['cssClassNames']['evenTableRow'];
}
if(typeof chart.settings['cssClassNames']['selectedTableItem'] !== 'undefined'){
$.extend( select, {
className: chart.settings['cssClassNames']['selectedTableItem']
} );
}
}
// remove this so that the eval does not fail.
delete chart.settings['internal_title'];
var additional = [];
for (i in chart.settings) {
var valoo = chart.settings[i];
// remove the type suffix to get the name of the setting.
i = i.replace(/_bool/g, '').replace(/_int/g, '');
switch(valoo){
case 'true':
valoo = true;
break;
case 'false':
valoo = false;
break;
default:
if(parseInt(valoo) > 0){
valoo = parseInt(valoo);
}
if(i === 'pageLength' && (valoo === '' || parseInt(valoo) < 0)){
valoo = 1;
}
}
// if the setting name has an '_' this means it is a sub-setting e.g. select_items means { select: { items: ... } }.
var array = i.split('_');
if(array.length === 2){
i = eval( array[0] ); // jshint ignore:line
i[ array[1] ] = valoo;
additional[ array[0] ] = i;
if(array[0] === 'select' && array[1] === 'info' ){
// enable main info or the selection info will not show.
$.extend( settings, {info: true} );
}
} else {
settings[i] = valoo;
}
}
$.extend( settings, additional );
cols = [];
for (j = 0; j < series.length; j++) {
type = series[j].type;
switch(type){
case 'number':
type = 'num';
break;
case 'date':
case 'datetime':
case 'timeofday':
type = 'date';
break;
}
render = addRenderer(series[j].type, settings.series, j);
var col = { title: series[j].label, data: series[j].label, type: type, render: render };
if(typeof chart.settings['cssClassNames'] !== 'undefined' && typeof chart.settings['cssClassNames']['tableCell'] !== 'undefined'){
col['className'] = chart.settings['cssClassNames']['tableCell'];
}
cols.push(col);
}
rows = [];
for (i = 0; i < data.length; i++) {
row = [];
for (j = 0; j < series.length; j++) {
var datum = data[i][j];
// datum could be undefined for dynamic data (e.g. through json).
if(typeof datum === 'undefined'){
datum = data[i][series[j].label];
}
row[ series[j].label ] = datum;
}
rows.push(row);
}
$.extend( settings, {
data: rows,
columns: cols,
stripeClasses: stripe,
} );
// allow user to extend the settings.
$('body').trigger('visualizer:chart:settings:extend', {id: id, chart: chart, settings: settings});
table = $('#' + id + ' table.visualizer-data-table');
table.DataTable( settings );
// header row is handled here as the class is added dynamically to it (after the table is rendered).
if(typeof chart.settings['cssClassNames'] !== 'undefined'){
if(typeof chart.settings['cssClassNames']['headerRow'] !== 'undefined'){
$('#' + id + ' table thead tr').addClass( chart.settings['cssClassNames']['headerRow'] );
}
}
$('.loader').remove();
}
function addRenderer(type, series, index){
var render = null;
if(typeof series === 'undefined' || typeof series[index] === 'undefined' || typeof series[index].format === 'undefined' ){
return render;
}
series = series[index];
/* jshint ignore:start */
switch(type){
case 'number':
var parts = ['', '', '', '', ''];
if(typeof series.format.thousands !== ''){
parts[0] = series.format.thousands;
}
if(typeof series.format.decimal !== ''){
parts[1] = series.format.decimal;
if ( '' === series.format.precision ) {
series.format.precision = 2;
}
}
if(typeof series.format.precision !== '' && parseInt(series.format.precision) > 0){
parts[2] = series.format.precision;
}
if(typeof series.format.prefix !== ''){
parts[3] = series.format.prefix;
}
if(typeof series.format.suffix !== ''){
parts[4] = series.format.suffix;
}
render = $.fn.dataTable.render.number(parts[0], parts[1], parts[2], parts[3], parts[4]);
break;
case 'date':
case 'datetime':
case 'timeofday':
if(typeof series.format.to !== 'undefined' && typeof series.format.from !== 'undefined' && series.format.from != '' && series.format.to !== ''){
render = $.fn.dataTable.render.moment(series.format.from, series.format.to);
}
break;
default:
render = $.fn.dataTable.render.extra = function ( data, type, row ) {
if((data === true || data === 'true') && typeof series.format !== 'undefined' && series.format.truthy !== ''){
data = series.format.truthy.replace(/