Bug 17282: Ability to create charts for SQL reports
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / charts.js
1 function create_chart(headers, results, x_element, y_elements, y_groups, options) {
2
3     var type = options.type;
4     var horizontal = options.horizontal;
5     var lines = options.lines;
6     var data;
7     var axis;
8
9     if (type != 'pie') {
10         var columns = build_columns(headers, results, x_element, y_elements);
11         var groups = build_group(y_elements, y_groups);
12         var x_values = build_xvalues(headers, results, x_element);
13
14         axis = {
15             x: {
16                 type: 'category',
17                 categories: x_values
18             }
19         };
20
21         data = {
22             columns: columns,
23             groups: groups,
24             type: type,
25         };
26
27     }
28     else {
29         var columns = build_pie_columns(headers, results, x_element);
30         data = {
31             columns: columns,
32             type: type,
33         };
34
35     }
36
37     if (type == 'bar') {
38         var types = {};
39         $.each(lines, function(index, value) {
40             types[value] = 'line';
41         });
42         data.types = types;
43
44         if (horizontal) {
45             axis.rotated = true;
46         }
47     }
48
49     var chart = c3.generate({
50         bindto: '#chart',
51         data: data,
52         axis: axis,
53     });
54
55     return chart;
56 }
57
58 function build_pie_columns(headers, results, x_element) {
59     var columns = [];
60     var x_index;
61
62     //Get x_element index.
63     $.each(headers, function(index, value) {
64         if (value.cell == x_element) {
65             x_index = index;
66         }
67     });
68
69     $.each(results, function(index, value) {
70         var cells = value.cells;
71         $.each( cells, function(i, value) {
72             if (i == x_index) {
73                 columns[index] = [value.cell];
74             }
75         });
76         $.each( cells, function(i, value) {
77             if (i != x_index) {
78                 columns[index].push(value.cell);
79             }
80         });
81     });
82
83     return columns;
84 }
85
86 function build_xvalues(headers, results, x_element) {
87     var h_index;
88     x_values = [];
89
90     //Get x_element index.
91     $.each(headers, function(index, value) {
92         if (value.cell == x_element) {
93             h_index = index;
94         }
95     });
96
97     $.each( results, function (i, value) {
98         var cells = value.cells;
99         $.each( cells, function(index, value) {
100             if (index == h_index) {
101                 x_values.push(value.cell);
102             }
103         });
104     });
105
106     return x_values;
107
108 }
109
110 function build_group(y_elements, y_groups) {
111     var groups_hash = {};
112     var groups = [];
113
114     $.each(y_groups, function(index, value) {
115         var related_y = y_elements.shift();
116         if (!$.isArray(groups_hash[value])) {
117             groups_hash[value] = [];
118         }
119         groups_hash[value].push(related_y);
120     });
121
122     $.each(groups_hash, function(key, value) {
123         if (value.length !== 0) {
124             groups.push(value);
125         }
126     });
127
128     return groups;
129 }
130
131 function build_columns(headers, results, x_element, y_elements) {
132     var x_index;
133     var header_index = [];
134     var y_values = {};
135
136     // Keep order of headers using array index.
137     $.each( headers, function(index, value) {
138         if (value.cell == x_element) {
139             x_index = index;
140         }
141         header_index.push(value.cell)
142     });
143
144     $.each( y_elements, function(index, element) {
145         y_values[element] = [element];
146     });
147
148     $.each( results, function (i, value) {
149         var cells = value.cells;
150         $.each( cells, function(index, value) {
151             if (index != x_index) {
152                 y_values[header_index[index]].push(value.cell);
153             }
154         });
155     });
156
157     var columns = [];
158     $.each( y_values, function(key, value) {
159         columns.push(value);
160     });
161
162     return columns;
163 }