function create_chart(headers, results, x_element, y_elements, y_groups, options) { var type = options.type; var horizontal = options.horizontal; var lines = options.lines; var data; var axis; if (type != 'pie') { var columns = build_columns(headers, results, x_element, y_elements); var groups = build_group(y_elements, y_groups); var x_values = build_xvalues(headers, results, x_element); axis = { x: { type: 'category', categories: x_values } }; data = { columns: columns, groups: groups, type: type, }; } else { var columns = build_pie_columns(headers, results, x_element); data = { columns: columns, type: type, }; } if (type == 'bar') { var types = {}; $.each(lines, function(index, value) { types[value] = 'line'; }); data.types = types; if (horizontal) { axis.rotated = true; } } var chart = c3.generate({ bindto: '#chart', data: data, axis: axis, }); return chart; } function build_pie_columns(headers, results, x_element) { var columns = []; var x_index; //Get x_element index. $.each(headers, function(index, value) { if (value.cell == x_element) { x_index = index; } }); $.each(results, function(index, value) { var cells = value.cells; $.each( cells, function(i, value) { if (i == x_index) { columns[index] = [value.cell]; } }); $.each( cells, function(i, value) { if (i != x_index) { columns[index].push(value.cell); } }); }); return columns; } function build_xvalues(headers, results, x_element) { var h_index; x_values = []; //Get x_element index. $.each(headers, function(index, value) { if (value.cell == x_element) { h_index = index; } }); $.each( results, function (i, value) { var cells = value.cells; $.each( cells, function(index, value) { if (index == h_index) { x_values.push(value.cell); } }); }); return x_values; } function build_group(y_elements, y_groups) { var groups_hash = {}; var groups = []; $.each(y_groups, function(index, value) { var related_y = y_elements.shift(); if (!$.isArray(groups_hash[value])) { groups_hash[value] = []; } groups_hash[value].push(related_y); }); $.each(groups_hash, function(key, value) { if (value.length !== 0) { groups.push(value); } }); return groups; } function build_columns(headers, results, x_element, y_elements) { var x_index; var header_index = []; var y_values = {}; // Keep order of headers using array index. $.each( headers, function(index, value) { if (value.cell == x_element) { x_index = index; } header_index.push(value.cell) }); $.each( y_elements, function(index, element) { y_values[element] = [element]; }); $.each( results, function (i, value) { var cells = value.cells; $.each( cells, function(index, value) { if (index != x_index) { y_values[header_index[index]].push(value.cell); } }); }); var columns = []; $.each( y_values, function(key, value) { columns.push(value); }); return columns; }