spina 0.11.1 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of spina might be problematic. Click here for more details.

Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -12
  3. data/Rakefile +1 -0
  4. data/app/assets/fonts/spina/ics_spina.eot +0 -0
  5. data/app/assets/fonts/spina/ics_spina.svg +5 -3
  6. data/app/assets/fonts/spina/ics_spina.ttf +0 -0
  7. data/app/assets/fonts/spina/ics_spina.woff +0 -0
  8. data/app/assets/icons/spina/lock.svg +3 -0
  9. data/app/assets/icons/spina/preview/ics_spina-preview.html +16 -1
  10. data/app/assets/javascripts/spina/admin/application.coffee.erb +3 -25
  11. data/app/assets/javascripts/spina/admin/navigation.coffee +7 -0
  12. data/app/assets/javascripts/spina/admin/pages.coffee.erb +1 -13
  13. data/app/assets/javascripts/spina/admin/trix.coffee.erb +2 -1
  14. data/app/assets/stylesheets/spina/_admin_editing.sass +0 -4
  15. data/app/assets/stylesheets/spina/_buttons.sass +8 -8
  16. data/app/assets/stylesheets/spina/_configuration.sass +5 -1
  17. data/app/assets/stylesheets/spina/_custom_animations.sass +26 -26
  18. data/app/assets/stylesheets/spina/_fonts.sass +5 -1
  19. data/app/assets/stylesheets/spina/_forms.sass +66 -33
  20. data/app/assets/stylesheets/spina/_gallery.sass +32 -15
  21. data/app/assets/stylesheets/spina/_ics_spina.scss +1 -0
  22. data/app/assets/stylesheets/spina/_login.sass +10 -4
  23. data/app/assets/stylesheets/spina/_mixins.sass +5 -0
  24. data/app/assets/stylesheets/spina/_modal.sass +4 -4
  25. data/app/assets/stylesheets/spina/_notifications.sass +5 -5
  26. data/app/assets/stylesheets/spina/_sortable_lists.sass +9 -9
  27. data/app/assets/stylesheets/spina/_tables.sass +9 -9
  28. data/app/assets/stylesheets/spina/_wizard.sass +5 -5
  29. data/app/assets/stylesheets/spina/admin/application.sass +4 -1
  30. data/app/assets/stylesheets/spina/application.sass +0 -1
  31. data/app/assets/stylesheets/spina.sass +23 -27
  32. data/app/controllers/spina/admin/accounts_controller.rb +2 -7
  33. data/app/controllers/spina/admin/admin_controller.rb +8 -3
  34. data/app/controllers/spina/admin/attachments_controller.rb +0 -2
  35. data/app/controllers/spina/admin/navigations_controller.rb +3 -2
  36. data/app/controllers/spina/admin/pages_controller.rb +7 -8
  37. data/app/controllers/spina/admin/password_resets_controller.rb +49 -0
  38. data/app/controllers/spina/admin/photos_controller.rb +15 -34
  39. data/app/controllers/spina/admin/sessions_controller.rb +1 -1
  40. data/app/controllers/spina/admin/users_controller.rb +8 -9
  41. data/app/controllers/spina/application_controller.rb +3 -9
  42. data/app/controllers/spina/pages_controller.rb +3 -3
  43. data/app/helpers/spina/admin/pages_helper.rb +16 -23
  44. data/app/mailers/spina/user_mailer.rb +21 -0
  45. data/app/models/concerns/spina/optionable.rb +12 -0
  46. data/app/models/concerns/spina/part.rb +5 -1
  47. data/app/models/concerns/spina/partable.rb +20 -5
  48. data/app/models/concerns/spina/photo_collectable.rb +24 -0
  49. data/app/models/spina/account.rb +16 -6
  50. data/app/models/spina/layout_part.rb +1 -0
  51. data/app/models/spina/option.rb +17 -0
  52. data/app/models/spina/page.rb +36 -63
  53. data/app/models/spina/page_part.rb +1 -0
  54. data/app/models/spina/photo_collection.rb +1 -13
  55. data/app/models/spina/structure_item.rb +4 -8
  56. data/app/models/spina/structure_part.rb +2 -13
  57. data/app/models/spina/user.rb +1 -0
  58. data/app/presenters/spina/pages/menu_presenter.rb +18 -49
  59. data/app/views/layouts/spina/mail.html.erb +1 -0
  60. data/app/views/spina/admin/page_partables/{colors → options}/_form.html.haml +2 -3
  61. data/app/views/spina/admin/page_partables/photo_collections/_form.html.haml +7 -7
  62. data/app/views/spina/admin/page_partables/structures/_form.html.haml +7 -8
  63. data/app/views/spina/admin/pages/_form.html.haml +2 -2
  64. data/app/views/spina/admin/pages/_form_advanced.html.haml +2 -2
  65. data/app/views/spina/admin/password_resets/edit.html.haml +13 -0
  66. data/app/views/spina/admin/password_resets/new.html.haml +13 -0
  67. data/app/views/spina/admin/photos/_photo.html.haml +2 -1
  68. data/app/views/spina/admin/photos/{_wysihtml5_select.html.haml → _trix_select.html.haml} +2 -4
  69. data/app/views/spina/admin/photos/create.js.erb +3 -5
  70. data/app/views/spina/admin/photos/{wysihtml5_infinite_scroll.js.erb → trix_infinite_scroll.js.erb} +0 -2
  71. data/app/views/spina/admin/photos/{wysihtml5_insert.js.coffee → trix_insert.js.erb} +2 -2
  72. data/app/views/spina/admin/photos/trix_select.js.erb +3 -0
  73. data/app/views/spina/admin/sessions/new.html.haml +3 -1
  74. data/app/views/spina/admin/shared/_primary_navigation.html.haml +1 -1
  75. data/app/views/spina/admin/shared/_rich_text_field.html.haml +2 -1
  76. data/app/views/spina/admin/structure_items/_fields.html.haml +3 -3
  77. data/app/views/spina/admin/structure_partables/lines/_form.html.haml +5 -2
  78. data/app/views/spina/admin/structure_partables/options/_form.html.haml +7 -0
  79. data/app/views/spina/admin/structure_partables/photo_collections/_form.html.haml +12 -9
  80. data/app/views/spina/admin/structure_partables/photos/_form.html.haml +10 -7
  81. data/app/views/spina/admin/structure_partables/texts/_form.html.haml +5 -2
  82. data/app/views/spina/admin/users/_form.html.haml +1 -1
  83. data/app/views/spina/shared/_admin_bar.html.haml +1 -1
  84. data/app/views/spina/shared/_navigation.html.haml +1 -1
  85. data/app/views/spina/user_mailer/forgot_password.html.erb +1 -0
  86. data/app/views/spina/user_mailer/forgot_password.txt.erb +1 -0
  87. data/config/locales/en.yml +10 -0
  88. data/config/locales/nl.yml +2 -0
  89. data/config/routes.rb +5 -9
  90. data/db/migrate/1_create_spina_tables.rb +8 -7
  91. data/db/migrate/2_create_spina_translation_tables.rb +7 -26
  92. data/db/migrate/3_create_spina_navigations.rb +1 -1
  93. data/db/migrate/4_add_password_reset_token_to_spina_users.rb +6 -0
  94. data/db/migrate/5_remove_translated_columns.rb +11 -0
  95. data/db/migrate/6_create_spina_options.rb +8 -0
  96. data/lib/generators/spina/install_generator.rb +0 -22
  97. data/lib/generators/spina/templates/app/views/default/shared/_navigation.html.haml +1 -1
  98. data/lib/generators/spina/templates/app/views/demo/shared/_navigation.html.haml +1 -1
  99. data/lib/generators/spina/templates/config/initializers/themes/default.rb +9 -0
  100. data/lib/generators/spina/templates/config/initializers/themes/demo.rb +1 -9
  101. data/lib/spina/engine.rb +4 -3
  102. data/lib/spina/theme.rb +2 -1
  103. data/lib/spina/version.rb +1 -1
  104. data/lib/spina.rb +0 -23
  105. metadata +32 -69
  106. data/app/assets/images/spina/marker.png +0 -0
  107. data/app/assets/images/spina/mask.png +0 -0
  108. data/app/assets/images/spina/wheel.png +0 -0
  109. data/app/assets/stylesheets/spina/_cards.sass +0 -54
  110. data/app/assets/stylesheets/spina/_farbtastic.sass +0 -37
  111. data/app/assets/stylesheets/spina/_wysihtml5.sass +0 -79
  112. data/app/assets/stylesheets/spina/wysihtml5_textarea.sass +0 -14
  113. data/app/controllers/spina/admin/page_parts_controller.rb +0 -11
  114. data/app/helpers/spina/application_helper.rb +0 -30
  115. data/app/models/spina/ability.rb +0 -20
  116. data/app/models/spina/color.rb +0 -7
  117. data/app/presenters/spina/pages/breadcrumb.rb +0 -102
  118. data/app/views/layouts/spina/email.html.erb +0 -124
  119. data/app/views/spina/admin/layout_partables/colors/_form.html.haml +0 -4
  120. data/app/views/spina/admin/page_parts/_wysihtml5_link.html.haml +0 -12
  121. data/app/views/spina/admin/page_parts/insert_wysihtml5_link.js +0 -5
  122. data/app/views/spina/admin/page_parts/wysihtml5_link.js +0 -2
  123. data/app/views/spina/admin/photos/create_and_select.js.erb +0 -7
  124. data/app/views/spina/admin/photos/create_multiple.js.erb +0 -4
  125. data/app/views/spina/admin/photos/wysihtml5_select.js.erb +0 -3
  126. data/vendor/assets/javascripts/spina/jquery.farbtastic.js +0 -345
  127. data/vendor/assets/javascripts/spina/morris.js +0 -1767
  128. data/vendor/assets/javascripts/spina/raphael.js +0 -8111
  129. data/vendor/assets/javascripts/spina/wysihtml5.js +0 -269
  130. data/vendor/assets/javascripts/spina/wysihtml5_parser_rules.js +0 -551
  131. data/vendor/assets/stylesheets/spina/_morris.scss +0 -2
@@ -1,1767 +0,0 @@
1
- (function() {
2
- var $, Morris, minutesSpecHelper, secondsSpecHelper,
3
- __slice = [].slice,
4
- __hasProp = {}.hasOwnProperty,
5
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
6
- __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
7
- __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
8
-
9
- Morris = window.Morris = {};
10
-
11
- $ = jQuery;
12
-
13
- Morris.EventEmitter = (function() {
14
-
15
- function EventEmitter() {}
16
-
17
- EventEmitter.prototype.on = function(name, handler) {
18
- if (this.handlers == null) {
19
- this.handlers = {};
20
- }
21
- if (this.handlers[name] == null) {
22
- this.handlers[name] = [];
23
- }
24
- this.handlers[name].push(handler);
25
- return this;
26
- };
27
-
28
- EventEmitter.prototype.fire = function() {
29
- var args, handler, name, _i, _len, _ref, _results;
30
- name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
31
- if ((this.handlers != null) && (this.handlers[name] != null)) {
32
- _ref = this.handlers[name];
33
- _results = [];
34
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
35
- handler = _ref[_i];
36
- _results.push(handler.apply(null, args));
37
- }
38
- return _results;
39
- }
40
- };
41
-
42
- return EventEmitter;
43
-
44
- })();
45
-
46
- Morris.commas = function(num) {
47
- var absnum, intnum, ret, strabsnum;
48
- if (num != null) {
49
- ret = num < 0 ? "-" : "";
50
- absnum = Math.abs(num);
51
- intnum = Math.floor(absnum).toFixed(0);
52
- ret += intnum.replace(/(?=(?:\d{3})+$)(?!^)/g, ',');
53
- strabsnum = absnum.toString();
54
- if (strabsnum.length > intnum.length) {
55
- ret += strabsnum.slice(intnum.length);
56
- }
57
- return ret;
58
- } else {
59
- return '-';
60
- }
61
- };
62
-
63
- Morris.pad2 = function(number) {
64
- return (number < 10 ? '0' : '') + number;
65
- };
66
-
67
- Morris.Grid = (function(_super) {
68
-
69
- __extends(Grid, _super);
70
-
71
- function Grid(options) {
72
- var _this = this;
73
- if (typeof options.element === 'string') {
74
- this.el = $(document.getElementById(options.element));
75
- } else {
76
- this.el = $(options.element);
77
- }
78
- if (!(this.el != null) || this.el.length === 0) {
79
- throw new Error("Graph container element not found");
80
- }
81
- if (this.el.css('position') === 'static') {
82
- this.el.css('position', 'relative');
83
- }
84
- this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options);
85
- if (typeof this.options.units === 'string') {
86
- this.options.postUnits = options.units;
87
- }
88
- this.raphael = new Raphael(this.el[0]);
89
- this.elementWidth = null;
90
- this.elementHeight = null;
91
- this.dirty = false;
92
- if (this.init) {
93
- this.init();
94
- }
95
- this.setData(this.options.data);
96
- this.el.bind('mousemove', function(evt) {
97
- var offset;
98
- offset = _this.el.offset();
99
- return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top);
100
- });
101
- this.el.bind('mouseout', function(evt) {
102
- return _this.fire('hoverout');
103
- });
104
- this.el.bind('touchstart touchmove touchend', function(evt) {
105
- var offset, touch;
106
- touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0];
107
- offset = _this.el.offset();
108
- _this.fire('hover', touch.pageX - offset.left, touch.pageY - offset.top);
109
- return touch;
110
- });
111
- this.el.bind('click', function(evt) {
112
- var offset;
113
- offset = _this.el.offset();
114
- return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top);
115
- });
116
- if (this.postInit) {
117
- this.postInit();
118
- }
119
- }
120
-
121
- Grid.prototype.gridDefaults = {
122
- dateFormat: null,
123
- axes: true,
124
- grid: true,
125
- gridLineColor: '#aaa',
126
- gridStrokeWidth: 0.5,
127
- gridTextColor: '#888',
128
- gridTextSize: 12,
129
- gridTextFamily: 'sans-serif',
130
- gridTextWeight: 'normal',
131
- hideHover: false,
132
- yLabelFormat: null,
133
- xLabelAngle: 0,
134
- numLines: 5,
135
- padding: 25,
136
- parseTime: true,
137
- postUnits: '',
138
- preUnits: '',
139
- ymax: 'auto',
140
- ymin: 'auto 0',
141
- goals: [],
142
- goalStrokeWidth: 1.0,
143
- goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'],
144
- events: [],
145
- eventStrokeWidth: 1.0,
146
- eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502']
147
- };
148
-
149
- Grid.prototype.setData = function(data, redraw) {
150
- var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval;
151
- if (redraw == null) {
152
- redraw = true;
153
- }
154
- this.options.data = data;
155
- if (!(data != null) || data.length === 0) {
156
- this.data = [];
157
- this.raphael.clear();
158
- if (this.hover != null) {
159
- this.hover.hide();
160
- }
161
- return;
162
- }
163
- ymax = this.cumulative ? 0 : null;
164
- ymin = this.cumulative ? 0 : null;
165
- if (this.options.goals.length > 0) {
166
- minGoal = Math.min.apply(null, this.options.goals);
167
- maxGoal = Math.max.apply(null, this.options.goals);
168
- ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal;
169
- ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal;
170
- }
171
- this.data = (function() {
172
- var _i, _len, _results;
173
- _results = [];
174
- for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) {
175
- row = data[index];
176
- ret = {};
177
- ret.label = row[this.options.xkey];
178
- if (this.options.parseTime) {
179
- ret.x = Morris.parseDate(ret.label);
180
- if (this.options.dateFormat) {
181
- ret.label = this.options.dateFormat(ret.x);
182
- } else if (typeof ret.label === 'number') {
183
- ret.label = new Date(ret.label).toString();
184
- }
185
- } else {
186
- ret.x = index;
187
- if (this.options.xLabelFormat) {
188
- ret.label = this.options.xLabelFormat(ret);
189
- }
190
- }
191
- total = 0;
192
- ret.y = (function() {
193
- var _j, _len1, _ref, _results1;
194
- _ref = this.options.ykeys;
195
- _results1 = [];
196
- for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) {
197
- ykey = _ref[idx];
198
- yval = row[ykey];
199
- if (typeof yval === 'string') {
200
- yval = parseFloat(yval);
201
- }
202
- if ((yval != null) && typeof yval !== 'number') {
203
- yval = null;
204
- }
205
- if (yval != null) {
206
- if (this.cumulative) {
207
- total += yval;
208
- } else {
209
- if (ymax != null) {
210
- ymax = Math.max(yval, ymax);
211
- ymin = Math.min(yval, ymin);
212
- } else {
213
- ymax = ymin = yval;
214
- }
215
- }
216
- }
217
- if (this.cumulative && (total != null)) {
218
- ymax = Math.max(total, ymax);
219
- ymin = Math.min(total, ymin);
220
- }
221
- _results1.push(yval);
222
- }
223
- return _results1;
224
- }).call(this);
225
- _results.push(ret);
226
- }
227
- return _results;
228
- }).call(this);
229
- if (this.options.parseTime) {
230
- this.data = this.data.sort(function(a, b) {
231
- return (a.x > b.x) - (b.x > a.x);
232
- });
233
- }
234
- this.xmin = this.data[0].x;
235
- this.xmax = this.data[this.data.length - 1].x;
236
- this.events = [];
237
- if (this.options.parseTime && this.options.events.length > 0) {
238
- this.events = (function() {
239
- var _i, _len, _ref, _results;
240
- _ref = this.options.events;
241
- _results = [];
242
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
243
- e = _ref[_i];
244
- _results.push(Morris.parseDate(e));
245
- }
246
- return _results;
247
- }).call(this);
248
- this.xmax = Math.max(this.xmax, Math.max.apply(null, this.events));
249
- this.xmin = Math.min(this.xmin, Math.min.apply(null, this.events));
250
- }
251
- if (this.xmin === this.xmax) {
252
- this.xmin -= 1;
253
- this.xmax += 1;
254
- }
255
- this.ymin = this.yboundary('min', ymin);
256
- this.ymax = this.yboundary('max', ymax);
257
- if (this.ymin === this.ymax) {
258
- if (ymin) {
259
- this.ymin -= 1;
260
- }
261
- this.ymax += 1;
262
- }
263
- if (this.options.axes === true || this.options.grid === true) {
264
- if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) {
265
- this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines);
266
- this.ymin = Math.min(this.ymin, this.grid[0]);
267
- this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]);
268
- } else {
269
- step = (this.ymax - this.ymin) / (this.options.numLines - 1);
270
- this.grid = (function() {
271
- var _i, _ref, _ref1, _results;
272
- _results = [];
273
- for (y = _i = _ref = this.ymin, _ref1 = this.ymax; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; y = _i += step) {
274
- _results.push(y);
275
- }
276
- return _results;
277
- }).call(this);
278
- }
279
- }
280
- this.dirty = true;
281
- if (redraw) {
282
- return this.redraw();
283
- }
284
- };
285
-
286
- Grid.prototype.yboundary = function(boundaryType, currentValue) {
287
- var boundaryOption, suggestedValue;
288
- boundaryOption = this.options["y" + boundaryType];
289
- if (typeof boundaryOption === 'string') {
290
- if (boundaryOption.slice(0, 4) === 'auto') {
291
- if (boundaryOption.length > 5) {
292
- suggestedValue = parseInt(boundaryOption.slice(5), 10);
293
- if (currentValue == null) {
294
- return suggestedValue;
295
- }
296
- return Math[boundaryType](currentValue, suggestedValue);
297
- } else {
298
- if (currentValue != null) {
299
- return currentValue;
300
- } else {
301
- return 0;
302
- }
303
- }
304
- } else {
305
- return parseInt(boundaryOption, 10);
306
- }
307
- } else {
308
- return boundaryOption;
309
- }
310
- };
311
-
312
- Grid.prototype.autoGridLines = function(ymin, ymax, nlines) {
313
- var gmax, gmin, grid, smag, span, step, unit, y, ymag;
314
- span = ymax - ymin;
315
- ymag = Math.floor(Math.log(span) / Math.log(10));
316
- unit = Math.pow(10, ymag);
317
- gmin = Math.floor(ymin / unit) * unit;
318
- gmax = Math.ceil(ymax / unit) * unit;
319
- step = (gmax - gmin) / (nlines - 1);
320
- if (unit === 1 && step > 1 && Math.ceil(step) !== step) {
321
- step = Math.ceil(step);
322
- gmax = gmin + step * (nlines - 1);
323
- }
324
- if (gmin < 0 && gmax > 0) {
325
- gmin = Math.floor(ymin / step) * step;
326
- gmax = Math.ceil(ymax / step) * step;
327
- }
328
- if (step < 1) {
329
- smag = Math.floor(Math.log(step) / Math.log(10));
330
- grid = (function() {
331
- var _i, _results;
332
- _results = [];
333
- for (y = _i = gmin; gmin <= gmax ? _i <= gmax : _i >= gmax; y = _i += step) {
334
- _results.push(parseFloat(y.toFixed(1 - smag)));
335
- }
336
- return _results;
337
- })();
338
- } else {
339
- grid = (function() {
340
- var _i, _results;
341
- _results = [];
342
- for (y = _i = gmin; gmin <= gmax ? _i <= gmax : _i >= gmax; y = _i += step) {
343
- _results.push(y);
344
- }
345
- return _results;
346
- })();
347
- }
348
- return grid;
349
- };
350
-
351
- Grid.prototype._calc = function() {
352
- var bottomOffsets, gridLine, h, i, w, yLabelWidths;
353
- w = this.el.width();
354
- h = this.el.height();
355
- if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) {
356
- this.elementWidth = w;
357
- this.elementHeight = h;
358
- this.dirty = false;
359
- this.left = this.options.padding;
360
- this.right = this.elementWidth - this.options.padding;
361
- this.top = this.options.padding;
362
- this.bottom = this.elementHeight - this.options.padding;
363
- if (this.options.axes) {
364
- yLabelWidths = (function() {
365
- var _i, _len, _ref, _results;
366
- _ref = this.grid;
367
- _results = [];
368
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
369
- gridLine = _ref[_i];
370
- _results.push(this.measureText(this.yAxisFormat(gridLine)).width);
371
- }
372
- return _results;
373
- }).call(this);
374
- this.left += Math.max.apply(Math, yLabelWidths);
375
- bottomOffsets = (function() {
376
- var _i, _ref, _results;
377
- _results = [];
378
- for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
379
- _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height);
380
- }
381
- return _results;
382
- }).call(this);
383
- this.bottom -= Math.max.apply(Math, bottomOffsets);
384
- }
385
- this.width = Math.max(1, this.right - this.left);
386
- this.height = Math.max(1, this.bottom - this.top);
387
- this.dx = this.width / (this.xmax - this.xmin);
388
- this.dy = this.height / (this.ymax - this.ymin);
389
- if (this.calc) {
390
- return this.calc();
391
- }
392
- }
393
- };
394
-
395
- Grid.prototype.transY = function(y) {
396
- return this.bottom - (y - this.ymin) * this.dy;
397
- };
398
-
399
- Grid.prototype.transX = function(x) {
400
- if (this.data.length === 1) {
401
- return (this.left + this.right) / 2;
402
- } else {
403
- return this.left + (x - this.xmin) * this.dx;
404
- }
405
- };
406
-
407
- Grid.prototype.redraw = function() {
408
- this.raphael.clear();
409
- this._calc();
410
- this.drawGrid();
411
- this.drawGoals();
412
- this.drawEvents();
413
- if (this.draw) {
414
- return this.draw();
415
- }
416
- };
417
-
418
- Grid.prototype.measureText = function(text, angle) {
419
- var ret, tt;
420
- if (angle == null) {
421
- angle = 0;
422
- }
423
- tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle);
424
- ret = tt.getBBox();
425
- tt.remove();
426
- return ret;
427
- };
428
-
429
- Grid.prototype.yAxisFormat = function(label) {
430
- return this.yLabelFormat(label);
431
- };
432
-
433
- Grid.prototype.yLabelFormat = function(label) {
434
- if (typeof this.options.yLabelFormat === 'function') {
435
- return this.options.yLabelFormat(label);
436
- } else {
437
- return "" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits;
438
- }
439
- };
440
-
441
- Grid.prototype.updateHover = function(x, y) {
442
- var hit, _ref;
443
- hit = this.hitTest(x, y);
444
- if (hit != null) {
445
- return (_ref = this.hover).update.apply(_ref, hit);
446
- }
447
- };
448
-
449
- Grid.prototype.drawGrid = function() {
450
- var lineY, y, _i, _len, _ref, _results;
451
- if (this.options.grid === false && this.options.axes === false) {
452
- return;
453
- }
454
- _ref = this.grid;
455
- _results = [];
456
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
457
- lineY = _ref[_i];
458
- y = this.transY(lineY);
459
- if (this.options.axes) {
460
- this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY));
461
- }
462
- if (this.options.grid) {
463
- _results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width)));
464
- } else {
465
- _results.push(void 0);
466
- }
467
- }
468
- return _results;
469
- };
470
-
471
- Grid.prototype.drawGoals = function() {
472
- var color, goal, i, _i, _len, _ref, _results;
473
- _ref = this.options.goals;
474
- _results = [];
475
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
476
- goal = _ref[i];
477
- color = this.options.goalLineColors[i % this.options.goalLineColors.length];
478
- _results.push(this.drawGoal(goal, color));
479
- }
480
- return _results;
481
- };
482
-
483
- Grid.prototype.drawEvents = function() {
484
- var color, event, i, _i, _len, _ref, _results;
485
- _ref = this.events;
486
- _results = [];
487
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
488
- event = _ref[i];
489
- color = this.options.eventLineColors[i % this.options.eventLineColors.length];
490
- _results.push(this.drawEvent(event, color));
491
- }
492
- return _results;
493
- };
494
-
495
- Grid.prototype.drawGoal = function(goal, color) {
496
- return this.raphael.path("M" + this.left + "," + (this.transY(goal)) + "H" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth);
497
- };
498
-
499
- Grid.prototype.drawEvent = function(event, color) {
500
- return this.raphael.path("M" + (this.transX(event)) + "," + this.bottom + "V" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth);
501
- };
502
-
503
- Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) {
504
- return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end');
505
- };
506
-
507
- Grid.prototype.drawGridLine = function(path) {
508
- return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth);
509
- };
510
-
511
- return Grid;
512
-
513
- })(Morris.EventEmitter);
514
-
515
- Morris.parseDate = function(date) {
516
- var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs;
517
- if (typeof date === 'number') {
518
- return date;
519
- }
520
- m = date.match(/^(\d+) Q(\d)$/);
521
- n = date.match(/^(\d+)-(\d+)$/);
522
- o = date.match(/^(\d+)-(\d+)-(\d+)$/);
523
- p = date.match(/^(\d+) W(\d+)$/);
524
- q = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/);
525
- r = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/);
526
- if (m) {
527
- return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime();
528
- } else if (n) {
529
- return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime();
530
- } else if (o) {
531
- return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime();
532
- } else if (p) {
533
- ret = new Date(parseInt(p[1], 10), 0, 1);
534
- if (ret.getDay() !== 4) {
535
- ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7);
536
- }
537
- return ret.getTime() + parseInt(p[2], 10) * 604800000;
538
- } else if (q) {
539
- if (!q[6]) {
540
- return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime();
541
- } else {
542
- offsetmins = 0;
543
- if (q[6] !== 'Z') {
544
- offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10);
545
- if (q[7] === '+') {
546
- offsetmins = 0 - offsetmins;
547
- }
548
- }
549
- return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins);
550
- }
551
- } else if (r) {
552
- secs = parseFloat(r[6]);
553
- isecs = Math.floor(secs);
554
- msecs = Math.round((secs - isecs) * 1000);
555
- if (!r[8]) {
556
- return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime();
557
- } else {
558
- offsetmins = 0;
559
- if (r[8] !== 'Z') {
560
- offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10);
561
- if (r[9] === '+') {
562
- offsetmins = 0 - offsetmins;
563
- }
564
- }
565
- return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs);
566
- }
567
- } else {
568
- return new Date(parseInt(date, 10), 0, 1).getTime();
569
- }
570
- };
571
-
572
- Morris.Hover = (function() {
573
-
574
- Hover.defaults = {
575
- "class": 'morris-hover morris-default-style'
576
- };
577
-
578
- function Hover(options) {
579
- if (options == null) {
580
- options = {};
581
- }
582
- this.options = $.extend({}, Morris.Hover.defaults, options);
583
- this.el = $("<div class='" + this.options["class"] + "'></div>");
584
- this.el.hide();
585
- this.options.parent.append(this.el);
586
- }
587
-
588
- Hover.prototype.update = function(html, x, y) {
589
- this.html(html);
590
- this.show();
591
- return this.moveTo(x, y);
592
- };
593
-
594
- Hover.prototype.html = function(content) {
595
- return this.el.html(content);
596
- };
597
-
598
- Hover.prototype.moveTo = function(x, y) {
599
- var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top;
600
- parentWidth = this.options.parent.innerWidth();
601
- parentHeight = this.options.parent.innerHeight();
602
- hoverWidth = this.el.outerWidth();
603
- hoverHeight = this.el.outerHeight();
604
- left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth);
605
- if (y != null) {
606
- top = y - hoverHeight - 10;
607
- if (top < 0) {
608
- top = y + 10;
609
- if (top + hoverHeight > parentHeight) {
610
- top = parentHeight / 2 - hoverHeight / 2;
611
- }
612
- }
613
- } else {
614
- top = parentHeight / 2 - hoverHeight / 2;
615
- }
616
- return this.el.css({
617
- left: left + "px",
618
- top: parseInt(top) + "px"
619
- });
620
- };
621
-
622
- Hover.prototype.show = function() {
623
- return this.el.show();
624
- };
625
-
626
- Hover.prototype.hide = function() {
627
- return this.el.hide();
628
- };
629
-
630
- return Hover;
631
-
632
- })();
633
-
634
- Morris.Line = (function(_super) {
635
-
636
- __extends(Line, _super);
637
-
638
- function Line(options) {
639
- this.hilight = __bind(this.hilight, this);
640
-
641
- this.onHoverOut = __bind(this.onHoverOut, this);
642
-
643
- this.onHoverMove = __bind(this.onHoverMove, this);
644
-
645
- this.onGridClick = __bind(this.onGridClick, this);
646
- if (!(this instanceof Morris.Line)) {
647
- return new Morris.Line(options);
648
- }
649
- Line.__super__.constructor.call(this, options);
650
- }
651
-
652
- Line.prototype.init = function() {
653
- this.pointGrow = Raphael.animation({
654
- r: this.options.pointSize + 3
655
- }, 25, 'linear');
656
- this.pointShrink = Raphael.animation({
657
- r: this.options.pointSize
658
- }, 25, 'linear');
659
- if (this.options.hideHover !== 'always') {
660
- this.hover = new Morris.Hover({
661
- parent: this.el
662
- });
663
- this.on('hovermove', this.onHoverMove);
664
- this.on('hoverout', this.onHoverOut);
665
- return this.on('gridclick', this.onGridClick);
666
- }
667
- };
668
-
669
- Line.prototype.defaults = {
670
- lineWidth: 3,
671
- pointSize: 4,
672
- lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],
673
- pointWidths: [1],
674
- pointStrokeColors: ['#ffffff'],
675
- pointFillColors: [],
676
- smooth: true,
677
- xLabels: 'auto',
678
- xLabelFormat: null,
679
- xLabelMargin: 24,
680
- continuousLine: true,
681
- hideHover: false
682
- };
683
-
684
- Line.prototype.calc = function() {
685
- this.calcPoints();
686
- return this.generatePaths();
687
- };
688
-
689
- Line.prototype.calcPoints = function() {
690
- var row, y, _i, _len, _ref, _results;
691
- _ref = this.data;
692
- _results = [];
693
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
694
- row = _ref[_i];
695
- row._x = this.transX(row.x);
696
- row._y = (function() {
697
- var _j, _len1, _ref1, _results1;
698
- _ref1 = row.y;
699
- _results1 = [];
700
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
701
- y = _ref1[_j];
702
- if (y != null) {
703
- _results1.push(this.transY(y));
704
- } else {
705
- _results1.push(y);
706
- }
707
- }
708
- return _results1;
709
- }).call(this);
710
- _results.push(row._ymax = Math.min.apply(null, [this.bottom].concat((function() {
711
- var _j, _len1, _ref1, _results1;
712
- _ref1 = row._y;
713
- _results1 = [];
714
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
715
- y = _ref1[_j];
716
- if (y != null) {
717
- _results1.push(y);
718
- }
719
- }
720
- return _results1;
721
- })())));
722
- }
723
- return _results;
724
- };
725
-
726
- Line.prototype.hitTest = function(x, y) {
727
- var index, r, _i, _len, _ref;
728
- if (this.data.length === 0) {
729
- return null;
730
- }
731
- _ref = this.data.slice(1);
732
- for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {
733
- r = _ref[index];
734
- if (x < (r._x + this.data[index]._x) / 2) {
735
- break;
736
- }
737
- }
738
- return index;
739
- };
740
-
741
- Line.prototype.onGridClick = function(x, y) {
742
- var index;
743
- index = this.hitTest(x, y);
744
- return this.fire('click', index, this.options.data[index], x, y);
745
- };
746
-
747
- Line.prototype.onHoverMove = function(x, y) {
748
- var index;
749
- index = this.hitTest(x, y);
750
- return this.displayHoverForRow(index);
751
- };
752
-
753
- Line.prototype.onHoverOut = function() {
754
- if (this.options.hideHover !== false) {
755
- return this.displayHoverForRow(null);
756
- }
757
- };
758
-
759
- Line.prototype.displayHoverForRow = function(index) {
760
- var _ref;
761
- if (index != null) {
762
- (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));
763
- return this.hilight(index);
764
- } else {
765
- this.hover.hide();
766
- return this.hilight();
767
- }
768
- };
769
-
770
- Line.prototype.hoverContentForRow = function(index) {
771
- var content, j, row, y, _i, _len, _ref;
772
- row = this.data[index];
773
- content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
774
- _ref = row.y;
775
- for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
776
- y = _ref[j];
777
- content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
778
- }
779
- if (typeof this.options.hoverCallback === 'function') {
780
- content = this.options.hoverCallback(index, this.options, content);
781
- }
782
- return [content, row._x, row._ymax];
783
- };
784
-
785
- Line.prototype.generatePaths = function() {
786
- var c, coords, i, r, smooth;
787
- return this.paths = (function() {
788
- var _i, _ref, _ref1, _results;
789
- _results = [];
790
- for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
791
- smooth = this.options.smooth === true || (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0);
792
- coords = (function() {
793
- var _j, _len, _ref2, _results1;
794
- _ref2 = this.data;
795
- _results1 = [];
796
- for (_j = 0, _len = _ref2.length; _j < _len; _j++) {
797
- r = _ref2[_j];
798
- if (r._y[i] !== void 0) {
799
- _results1.push({
800
- x: r._x,
801
- y: r._y[i]
802
- });
803
- }
804
- }
805
- return _results1;
806
- }).call(this);
807
- if (this.options.continuousLine) {
808
- coords = (function() {
809
- var _j, _len, _results1;
810
- _results1 = [];
811
- for (_j = 0, _len = coords.length; _j < _len; _j++) {
812
- c = coords[_j];
813
- if (c.y !== null) {
814
- _results1.push(c);
815
- }
816
- }
817
- return _results1;
818
- })();
819
- }
820
- if (coords.length > 1) {
821
- _results.push(Morris.Line.createPath(coords, smooth, this.bottom));
822
- } else {
823
- _results.push(null);
824
- }
825
- }
826
- return _results;
827
- }).call(this);
828
- };
829
-
830
- Line.prototype.draw = function() {
831
- if (this.options.axes) {
832
- this.drawXAxis();
833
- }
834
- this.drawSeries();
835
- if (this.options.hideHover === false) {
836
- return this.displayHoverForRow(this.data.length - 1);
837
- }
838
- };
839
-
840
- Line.prototype.drawXAxis = function() {
841
- var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results,
842
- _this = this;
843
- ypos = this.bottom + this.options.padding / 2;
844
- prevLabelMargin = null;
845
- prevAngleMargin = null;
846
- drawLabel = function(labelText, xpos) {
847
- var label, labelBox, margin, offset, textBox;
848
- label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText);
849
- textBox = label.getBBox();
850
- label.transform("r" + (-_this.options.xLabelAngle));
851
- labelBox = label.getBBox();
852
- label.transform("t0," + (labelBox.height / 2) + "...");
853
- if (_this.options.xLabelAngle !== 0) {
854
- offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0);
855
- label.transform("t" + offset + ",0...");
856
- }
857
- labelBox = label.getBBox();
858
- if ((!(prevLabelMargin != null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) {
859
- if (_this.options.xLabelAngle !== 0) {
860
- margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0);
861
- prevAngleMargin = labelBox.x - margin;
862
- }
863
- return prevLabelMargin = labelBox.x - _this.options.xLabelMargin;
864
- } else {
865
- return label.remove();
866
- }
867
- };
868
- if (this.options.parseTime) {
869
- if (this.data.length === 1 && this.options.xLabels === 'auto') {
870
- labels = [[this.data[0].label, this.data[0].x]];
871
- } else {
872
- labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat);
873
- }
874
- } else {
875
- labels = (function() {
876
- var _i, _len, _ref, _results;
877
- _ref = this.data;
878
- _results = [];
879
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
880
- row = _ref[_i];
881
- _results.push([row.label, row.x]);
882
- }
883
- return _results;
884
- }).call(this);
885
- }
886
- labels.reverse();
887
- _results = [];
888
- for (_i = 0, _len = labels.length; _i < _len; _i++) {
889
- l = labels[_i];
890
- _results.push(drawLabel(l[0], l[1]));
891
- }
892
- return _results;
893
- };
894
-
895
- Line.prototype.drawSeries = function() {
896
- var i, _i, _j, _ref, _ref1, _results;
897
- this.seriesPoints = [];
898
- for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {
899
- this._drawLineFor(i);
900
- }
901
- _results = [];
902
- for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) {
903
- _results.push(this._drawPointFor(i));
904
- }
905
- return _results;
906
- };
907
-
908
- Line.prototype._drawPointFor = function(index) {
909
- var circle, row, _i, _len, _ref, _results;
910
- this.seriesPoints[index] = [];
911
- _ref = this.data;
912
- _results = [];
913
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
914
- row = _ref[_i];
915
- circle = null;
916
- if (row._y[index] != null) {
917
- circle = this.drawLinePoint(row._x, row._y[index], this.options.pointSize, this.colorFor(row, index, 'point'), index);
918
- }
919
- _results.push(this.seriesPoints[index].push(circle));
920
- }
921
- return _results;
922
- };
923
-
924
- Line.prototype._drawLineFor = function(index) {
925
- var path;
926
- path = this.paths[index];
927
- if (path !== null) {
928
- return this.drawLinePath(path, this.colorFor(null, index, 'line'));
929
- }
930
- };
931
-
932
- Line.createPath = function(coords, smooth, bottom) {
933
- var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len;
934
- path = "";
935
- if (smooth) {
936
- grads = Morris.Line.gradients(coords);
937
- }
938
- prevCoord = {
939
- y: null
940
- };
941
- for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {
942
- coord = coords[i];
943
- if (coord.y != null) {
944
- if (prevCoord.y != null) {
945
- if (smooth) {
946
- g = grads[i];
947
- lg = grads[i - 1];
948
- ix = (coord.x - prevCoord.x) / 4;
949
- x1 = prevCoord.x + ix;
950
- y1 = Math.min(bottom, prevCoord.y + ix * lg);
951
- x2 = coord.x - ix;
952
- y2 = Math.min(bottom, coord.y - ix * g);
953
- path += "C" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + coord.x + "," + coord.y;
954
- } else {
955
- path += "L" + coord.x + "," + coord.y;
956
- }
957
- } else {
958
- if (!smooth || (grads[i] != null)) {
959
- path += "M" + coord.x + "," + coord.y;
960
- }
961
- }
962
- }
963
- prevCoord = coord;
964
- }
965
- return path;
966
- };
967
-
968
- Line.gradients = function(coords) {
969
- var coord, grad, i, nextCoord, prevCoord, _i, _len, _results;
970
- grad = function(a, b) {
971
- return (a.y - b.y) / (a.x - b.x);
972
- };
973
- _results = [];
974
- for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {
975
- coord = coords[i];
976
- if (coord.y != null) {
977
- nextCoord = coords[i + 1] || {
978
- y: null
979
- };
980
- prevCoord = coords[i - 1] || {
981
- y: null
982
- };
983
- if ((prevCoord.y != null) && (nextCoord.y != null)) {
984
- _results.push(grad(prevCoord, nextCoord));
985
- } else if (prevCoord.y != null) {
986
- _results.push(grad(prevCoord, coord));
987
- } else if (nextCoord.y != null) {
988
- _results.push(grad(coord, nextCoord));
989
- } else {
990
- _results.push(null);
991
- }
992
- } else {
993
- _results.push(null);
994
- }
995
- }
996
- return _results;
997
- };
998
-
999
- Line.prototype.hilight = function(index) {
1000
- var i, _i, _j, _ref, _ref1;
1001
- if (this.prevHilight !== null && this.prevHilight !== index) {
1002
- for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
1003
- if (this.seriesPoints[i][this.prevHilight]) {
1004
- this.seriesPoints[i][this.prevHilight].animate(this.pointShrink);
1005
- }
1006
- }
1007
- }
1008
- if (index !== null && this.prevHilight !== index) {
1009
- for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
1010
- if (this.seriesPoints[i][index]) {
1011
- this.seriesPoints[i][index].animate(this.pointGrow);
1012
- }
1013
- }
1014
- }
1015
- return this.prevHilight = index;
1016
- };
1017
-
1018
- Line.prototype.colorFor = function(row, sidx, type) {
1019
- if (typeof this.options.lineColors === 'function') {
1020
- return this.options.lineColors.call(this, row, sidx, type);
1021
- } else if (type === 'point') {
1022
- return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length];
1023
- } else {
1024
- return this.options.lineColors[sidx % this.options.lineColors.length];
1025
- }
1026
- };
1027
-
1028
- Line.prototype.drawXAxisLabel = function(xPos, yPos, text) {
1029
- return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);
1030
- };
1031
-
1032
- Line.prototype.drawLinePath = function(path, lineColor) {
1033
- return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.options.lineWidth);
1034
- };
1035
-
1036
- Line.prototype.drawLinePoint = function(xPos, yPos, size, pointColor, lineIndex) {
1037
- return this.raphael.circle(xPos, yPos, size).attr('fill', pointColor).attr('stroke-width', this.strokeWidthForSeries(lineIndex)).attr('stroke', this.strokeForSeries(lineIndex));
1038
- };
1039
-
1040
- Line.prototype.strokeWidthForSeries = function(index) {
1041
- return this.options.pointWidths[index % this.options.pointWidths.length];
1042
- };
1043
-
1044
- Line.prototype.strokeForSeries = function(index) {
1045
- return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length];
1046
- };
1047
-
1048
- return Line;
1049
-
1050
- })(Morris.Grid);
1051
-
1052
- Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) {
1053
- var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref;
1054
- ddensity = 200 * (dmax - dmin) / pxwidth;
1055
- d0 = new Date(dmin);
1056
- spec = Morris.LABEL_SPECS[specName];
1057
- if (spec === void 0) {
1058
- _ref = Morris.AUTO_LABEL_ORDER;
1059
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1060
- name = _ref[_i];
1061
- s = Morris.LABEL_SPECS[name];
1062
- if (ddensity >= s.span) {
1063
- spec = s;
1064
- break;
1065
- }
1066
- }
1067
- }
1068
- if (spec === void 0) {
1069
- spec = Morris.LABEL_SPECS["second"];
1070
- }
1071
- if (xLabelFormat) {
1072
- spec = $.extend({}, spec, {
1073
- fmt: xLabelFormat
1074
- });
1075
- }
1076
- d = spec.start(d0);
1077
- ret = [];
1078
- while ((t = d.getTime()) <= dmax) {
1079
- if (t >= dmin) {
1080
- ret.push([spec.fmt(d), t]);
1081
- }
1082
- spec.incr(d);
1083
- }
1084
- return ret;
1085
- };
1086
-
1087
- minutesSpecHelper = function(interval) {
1088
- return {
1089
- span: interval * 60 * 1000,
1090
- start: function(d) {
1091
- return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours());
1092
- },
1093
- fmt: function(d) {
1094
- return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes()));
1095
- },
1096
- incr: function(d) {
1097
- return d.setUTCMinutes(d.getUTCMinutes() + interval);
1098
- }
1099
- };
1100
- };
1101
-
1102
- secondsSpecHelper = function(interval) {
1103
- return {
1104
- span: interval * 1000,
1105
- start: function(d) {
1106
- return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());
1107
- },
1108
- fmt: function(d) {
1109
- return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds()));
1110
- },
1111
- incr: function(d) {
1112
- return d.setUTCSeconds(d.getUTCSeconds() + interval);
1113
- }
1114
- };
1115
- };
1116
-
1117
- Morris.LABEL_SPECS = {
1118
- "decade": {
1119
- span: 172800000000,
1120
- start: function(d) {
1121
- return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1);
1122
- },
1123
- fmt: function(d) {
1124
- return "" + (d.getFullYear());
1125
- },
1126
- incr: function(d) {
1127
- return d.setFullYear(d.getFullYear() + 10);
1128
- }
1129
- },
1130
- "year": {
1131
- span: 17280000000,
1132
- start: function(d) {
1133
- return new Date(d.getFullYear(), 0, 1);
1134
- },
1135
- fmt: function(d) {
1136
- return "" + (d.getFullYear());
1137
- },
1138
- incr: function(d) {
1139
- return d.setFullYear(d.getFullYear() + 1);
1140
- }
1141
- },
1142
- "month": {
1143
- span: 2419200000,
1144
- start: function(d) {
1145
- return new Date(d.getFullYear(), d.getMonth(), 1);
1146
- },
1147
- fmt: function(d) {
1148
- return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1));
1149
- },
1150
- incr: function(d) {
1151
- return d.setMonth(d.getMonth() + 1);
1152
- }
1153
- },
1154
- "day": {
1155
- span: 86400000,
1156
- start: function(d) {
1157
- return new Date(d.getFullYear(), d.getMonth(), d.getDate());
1158
- },
1159
- fmt: function(d) {
1160
- return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate()));
1161
- },
1162
- incr: function(d) {
1163
- return d.setDate(d.getDate() + 1);
1164
- }
1165
- },
1166
- "hour": minutesSpecHelper(60),
1167
- "30min": minutesSpecHelper(30),
1168
- "15min": minutesSpecHelper(15),
1169
- "10min": minutesSpecHelper(10),
1170
- "5min": minutesSpecHelper(5),
1171
- "minute": minutesSpecHelper(1),
1172
- "30sec": secondsSpecHelper(30),
1173
- "15sec": secondsSpecHelper(15),
1174
- "10sec": secondsSpecHelper(10),
1175
- "5sec": secondsSpecHelper(5),
1176
- "second": secondsSpecHelper(1)
1177
- };
1178
-
1179
- Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"];
1180
-
1181
- Morris.Area = (function(_super) {
1182
- var areaDefaults;
1183
-
1184
- __extends(Area, _super);
1185
-
1186
- areaDefaults = {
1187
- fillOpacity: 'auto',
1188
- behaveLikeLine: false
1189
- };
1190
-
1191
- function Area(options) {
1192
- var areaOptions;
1193
- if (!(this instanceof Morris.Area)) {
1194
- return new Morris.Area(options);
1195
- }
1196
- areaOptions = $.extend({}, areaDefaults, options);
1197
- this.cumulative = !areaOptions.behaveLikeLine;
1198
- if (areaOptions.fillOpacity === 'auto') {
1199
- areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1;
1200
- }
1201
- Area.__super__.constructor.call(this, areaOptions);
1202
- }
1203
-
1204
- Area.prototype.calcPoints = function() {
1205
- var row, total, y, _i, _len, _ref, _results;
1206
- _ref = this.data;
1207
- _results = [];
1208
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1209
- row = _ref[_i];
1210
- row._x = this.transX(row.x);
1211
- total = 0;
1212
- row._y = (function() {
1213
- var _j, _len1, _ref1, _results1;
1214
- _ref1 = row.y;
1215
- _results1 = [];
1216
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
1217
- y = _ref1[_j];
1218
- if (this.options.behaveLikeLine) {
1219
- _results1.push(this.transY(y));
1220
- } else {
1221
- total += y || 0;
1222
- _results1.push(this.transY(total));
1223
- }
1224
- }
1225
- return _results1;
1226
- }).call(this);
1227
- _results.push(row._ymax = Math.max.apply(Math, row._y));
1228
- }
1229
- return _results;
1230
- };
1231
-
1232
- Area.prototype.drawSeries = function() {
1233
- var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2;
1234
- this.seriesPoints = [];
1235
- if (this.options.behaveLikeLine) {
1236
- range = (function() {
1237
- _results = [];
1238
- for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
1239
- return _results;
1240
- }).apply(this);
1241
- } else {
1242
- range = (function() {
1243
- _results1 = [];
1244
- for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); }
1245
- return _results1;
1246
- }).apply(this);
1247
- }
1248
- _results2 = [];
1249
- for (_k = 0, _len = range.length; _k < _len; _k++) {
1250
- i = range[_k];
1251
- this._drawFillFor(i);
1252
- this._drawLineFor(i);
1253
- _results2.push(this._drawPointFor(i));
1254
- }
1255
- return _results2;
1256
- };
1257
-
1258
- Area.prototype._drawFillFor = function(index) {
1259
- var path;
1260
- path = this.paths[index];
1261
- if (path !== null) {
1262
- path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z");
1263
- return this.drawFilledPath(path, this.fillForSeries(index));
1264
- }
1265
- };
1266
-
1267
- Area.prototype.fillForSeries = function(i) {
1268
- var color;
1269
- color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line'));
1270
- return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25));
1271
- };
1272
-
1273
- Area.prototype.drawFilledPath = function(path, fill) {
1274
- return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke-width', 0);
1275
- };
1276
-
1277
- return Area;
1278
-
1279
- })(Morris.Line);
1280
-
1281
- Morris.Bar = (function(_super) {
1282
-
1283
- __extends(Bar, _super);
1284
-
1285
- function Bar(options) {
1286
- this.onHoverOut = __bind(this.onHoverOut, this);
1287
-
1288
- this.onHoverMove = __bind(this.onHoverMove, this);
1289
-
1290
- this.onGridClick = __bind(this.onGridClick, this);
1291
- if (!(this instanceof Morris.Bar)) {
1292
- return new Morris.Bar(options);
1293
- }
1294
- Bar.__super__.constructor.call(this, $.extend({}, options, {
1295
- parseTime: false
1296
- }));
1297
- }
1298
-
1299
- Bar.prototype.init = function() {
1300
- this.cumulative = this.options.stacked;
1301
- if (this.options.hideHover !== 'always') {
1302
- this.hover = new Morris.Hover({
1303
- parent: this.el
1304
- });
1305
- this.on('hovermove', this.onHoverMove);
1306
- this.on('hoverout', this.onHoverOut);
1307
- return this.on('gridclick', this.onGridClick);
1308
- }
1309
- };
1310
-
1311
- Bar.prototype.defaults = {
1312
- barSizeRatio: 0.75,
1313
- barGap: 3,
1314
- barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],
1315
- xLabelMargin: 50
1316
- };
1317
-
1318
- Bar.prototype.calc = function() {
1319
- var _ref;
1320
- this.calcBars();
1321
- if (this.options.hideHover === false) {
1322
- return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1));
1323
- }
1324
- };
1325
-
1326
- Bar.prototype.calcBars = function() {
1327
- var idx, row, y, _i, _len, _ref, _results;
1328
- _ref = this.data;
1329
- _results = [];
1330
- for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {
1331
- row = _ref[idx];
1332
- row._x = this.left + this.width * (idx + 0.5) / this.data.length;
1333
- _results.push(row._y = (function() {
1334
- var _j, _len1, _ref1, _results1;
1335
- _ref1 = row.y;
1336
- _results1 = [];
1337
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
1338
- y = _ref1[_j];
1339
- if (y != null) {
1340
- _results1.push(this.transY(y));
1341
- } else {
1342
- _results1.push(null);
1343
- }
1344
- }
1345
- return _results1;
1346
- }).call(this));
1347
- }
1348
- return _results;
1349
- };
1350
-
1351
- Bar.prototype.draw = function() {
1352
- if (this.options.axes) {
1353
- this.drawXAxis();
1354
- }
1355
- return this.drawSeries();
1356
- };
1357
-
1358
- Bar.prototype.drawXAxis = function() {
1359
- var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results;
1360
- ypos = this.bottom + this.options.padding / 2;
1361
- prevLabelMargin = null;
1362
- prevAngleMargin = null;
1363
- _results = [];
1364
- for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
1365
- row = this.data[this.data.length - 1 - i];
1366
- label = this.drawXAxisLabel(row._x, ypos, row.label);
1367
- textBox = label.getBBox();
1368
- label.transform("r" + (-this.options.xLabelAngle));
1369
- labelBox = label.getBBox();
1370
- label.transform("t0," + (labelBox.height / 2) + "...");
1371
- if (this.options.xLabelAngle !== 0) {
1372
- offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0);
1373
- label.transform("t" + offset + ",0...");
1374
- }
1375
- if ((!(prevLabelMargin != null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) {
1376
- if (this.options.xLabelAngle !== 0) {
1377
- margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0);
1378
- prevAngleMargin = labelBox.x - margin;
1379
- }
1380
- _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin);
1381
- } else {
1382
- _results.push(label.remove());
1383
- }
1384
- }
1385
- return _results;
1386
- };
1387
-
1388
- Bar.prototype.drawSeries = function() {
1389
- var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, top, ypos, zeroPos;
1390
- groupWidth = this.width / this.options.data.length;
1391
- numBars = this.options.stacked != null ? 1 : this.options.ykeys.length;
1392
- barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars;
1393
- leftPadding = groupWidth * (1 - this.options.barSizeRatio) / 2;
1394
- zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null;
1395
- return this.bars = (function() {
1396
- var _i, _len, _ref, _results;
1397
- _ref = this.data;
1398
- _results = [];
1399
- for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {
1400
- row = _ref[idx];
1401
- lastTop = 0;
1402
- _results.push((function() {
1403
- var _j, _len1, _ref1, _results1;
1404
- _ref1 = row._y;
1405
- _results1 = [];
1406
- for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) {
1407
- ypos = _ref1[sidx];
1408
- if (ypos !== null) {
1409
- if (zeroPos) {
1410
- top = Math.min(ypos, zeroPos);
1411
- bottom = Math.max(ypos, zeroPos);
1412
- } else {
1413
- top = ypos;
1414
- bottom = this.bottom;
1415
- }
1416
- left = this.left + idx * groupWidth + leftPadding;
1417
- if (!this.options.stacked) {
1418
- left += sidx * (barWidth + this.options.barGap);
1419
- }
1420
- size = bottom - top;
1421
- if (this.options.stacked) {
1422
- top -= lastTop;
1423
- }
1424
- this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'));
1425
- _results1.push(lastTop += size);
1426
- } else {
1427
- _results1.push(null);
1428
- }
1429
- }
1430
- return _results1;
1431
- }).call(this));
1432
- }
1433
- return _results;
1434
- }).call(this);
1435
- };
1436
-
1437
- Bar.prototype.colorFor = function(row, sidx, type) {
1438
- var r, s;
1439
- if (typeof this.options.barColors === 'function') {
1440
- r = {
1441
- x: row.x,
1442
- y: row.y[sidx],
1443
- label: row.label
1444
- };
1445
- s = {
1446
- index: sidx,
1447
- key: this.options.ykeys[sidx],
1448
- label: this.options.labels[sidx]
1449
- };
1450
- return this.options.barColors.call(this, r, s, type);
1451
- } else {
1452
- return this.options.barColors[sidx % this.options.barColors.length];
1453
- }
1454
- };
1455
-
1456
- Bar.prototype.hitTest = function(x, y) {
1457
- if (this.data.length === 0) {
1458
- return null;
1459
- }
1460
- x = Math.max(Math.min(x, this.right), this.left);
1461
- return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length)));
1462
- };
1463
-
1464
- Bar.prototype.onGridClick = function(x, y) {
1465
- var index;
1466
- index = this.hitTest(x, y);
1467
- return this.fire('click', index, this.options.data[index], x, y);
1468
- };
1469
-
1470
- Bar.prototype.onHoverMove = function(x, y) {
1471
- var index, _ref;
1472
- index = this.hitTest(x, y);
1473
- return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));
1474
- };
1475
-
1476
- Bar.prototype.onHoverOut = function() {
1477
- if (this.options.hideHover !== false) {
1478
- return this.hover.hide();
1479
- }
1480
- };
1481
-
1482
- Bar.prototype.hoverContentForRow = function(index) {
1483
- var content, j, row, x, y, _i, _len, _ref;
1484
- row = this.data[index];
1485
- content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
1486
- _ref = row.y;
1487
- for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
1488
- y = _ref[j];
1489
- content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
1490
- }
1491
- if (typeof this.options.hoverCallback === 'function') {
1492
- content = this.options.hoverCallback(index, this.options, content);
1493
- }
1494
- x = this.left + (index + 0.5) * this.width / this.data.length;
1495
- return [content, x];
1496
- };
1497
-
1498
- Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) {
1499
- var label;
1500
- return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);
1501
- };
1502
-
1503
- Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor) {
1504
- return this.raphael.rect(xPos, yPos, width, height).attr('fill', barColor).attr('stroke-width', 0);
1505
- };
1506
-
1507
- return Bar;
1508
-
1509
- })(Morris.Grid);
1510
-
1511
- Morris.Donut = (function(_super) {
1512
-
1513
- __extends(Donut, _super);
1514
-
1515
- Donut.prototype.defaults = {
1516
- colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'],
1517
- backgroundColor: '#FFFFFF',
1518
- labelColor: '#000000',
1519
- formatter: Morris.commas
1520
- };
1521
-
1522
- function Donut(options) {
1523
- this.select = __bind(this.select, this);
1524
-
1525
- this.click = __bind(this.click, this);
1526
-
1527
- var row;
1528
- if (!(this instanceof Morris.Donut)) {
1529
- return new Morris.Donut(options);
1530
- }
1531
- if (typeof options.element === 'string') {
1532
- this.el = $(document.getElementById(options.element));
1533
- } else {
1534
- this.el = $(options.element);
1535
- }
1536
- this.options = $.extend({}, this.defaults, options);
1537
- if (this.el === null || this.el.length === 0) {
1538
- throw new Error("Graph placeholder not found.");
1539
- }
1540
- if (options.data === void 0 || options.data.length === 0) {
1541
- return;
1542
- }
1543
- this.data = options.data;
1544
- this.values = (function() {
1545
- var _i, _len, _ref, _results;
1546
- _ref = this.data;
1547
- _results = [];
1548
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1549
- row = _ref[_i];
1550
- _results.push(parseFloat(row.value));
1551
- }
1552
- return _results;
1553
- }).call(this);
1554
- this.redraw();
1555
- }
1556
-
1557
- Donut.prototype.redraw = function() {
1558
- var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;
1559
- this.el.empty();
1560
- this.raphael = new Raphael(this.el[0]);
1561
- cx = this.el.width() / 2;
1562
- cy = this.el.height() / 2;
1563
- w = (Math.min(cx, cy) - 10) / 3;
1564
- total = 0;
1565
- _ref = this.values;
1566
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1567
- value = _ref[_i];
1568
- total += value;
1569
- }
1570
- min = 5 / (2 * w);
1571
- C = 1.9999 * Math.PI - min * this.data.length;
1572
- last = 0;
1573
- idx = 0;
1574
- this.segments = [];
1575
- _ref1 = this.values;
1576
- for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) {
1577
- value = _ref1[i];
1578
- next = last + min + C * (value / total);
1579
- seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael);
1580
- seg.render();
1581
- this.segments.push(seg);
1582
- seg.on('hover', this.select);
1583
- seg.on('click', this.click);
1584
- last = next;
1585
- idx += 1;
1586
- }
1587
- this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800);
1588
- this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14);
1589
- max_value = Math.max.apply(null, (function() {
1590
- var _k, _len2, _ref2, _results;
1591
- _ref2 = this.values;
1592
- _results = [];
1593
- for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
1594
- value = _ref2[_k];
1595
- _results.push(value);
1596
- }
1597
- return _results;
1598
- }).call(this));
1599
- idx = 0;
1600
- _ref2 = this.values;
1601
- _results = [];
1602
- for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
1603
- value = _ref2[_k];
1604
- if (value === max_value) {
1605
- this.select(idx);
1606
- break;
1607
- }
1608
- _results.push(idx += 1);
1609
- }
1610
- return _results;
1611
- };
1612
-
1613
- Donut.prototype.click = function(idx) {
1614
- return this.fire('click', idx, this.data[idx]);
1615
- };
1616
-
1617
- Donut.prototype.select = function(idx) {
1618
- var row, s, segment, _i, _len, _ref;
1619
- _ref = this.segments;
1620
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1621
- s = _ref[_i];
1622
- s.deselect();
1623
- }
1624
- segment = this.segments[idx];
1625
- segment.select();
1626
- row = this.data[idx];
1627
- return this.setLabels(row.label, this.options.formatter(row.value, row));
1628
- };
1629
-
1630
- Donut.prototype.setLabels = function(label1, label2) {
1631
- var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale;
1632
- inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3;
1633
- maxWidth = 1.8 * inner;
1634
- maxHeightTop = inner / 2;
1635
- maxHeightBottom = inner / 3;
1636
- this.text1.attr({
1637
- text: label1,
1638
- transform: ''
1639
- });
1640
- text1bbox = this.text1.getBBox();
1641
- text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height);
1642
- this.text1.attr({
1643
- transform: "S" + text1scale + "," + text1scale + "," + (text1bbox.x + text1bbox.width / 2) + "," + (text1bbox.y + text1bbox.height)
1644
- });
1645
- this.text2.attr({
1646
- text: label2,
1647
- transform: ''
1648
- });
1649
- text2bbox = this.text2.getBBox();
1650
- text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height);
1651
- return this.text2.attr({
1652
- transform: "S" + text2scale + "," + text2scale + "," + (text2bbox.x + text2bbox.width / 2) + "," + text2bbox.y
1653
- });
1654
- };
1655
-
1656
- Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) {
1657
- var text;
1658
- text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color);
1659
- if (fontWeight != null) {
1660
- text.attr('font-weight', fontWeight);
1661
- }
1662
- return text;
1663
- };
1664
-
1665
- return Donut;
1666
-
1667
- })(Morris.EventEmitter);
1668
-
1669
- Morris.DonutSegment = (function(_super) {
1670
-
1671
- __extends(DonutSegment, _super);
1672
-
1673
- function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) {
1674
- this.cx = cx;
1675
- this.cy = cy;
1676
- this.inner = inner;
1677
- this.outer = outer;
1678
- this.color = color;
1679
- this.backgroundColor = backgroundColor;
1680
- this.index = index;
1681
- this.raphael = raphael;
1682
- this.deselect = __bind(this.deselect, this);
1683
-
1684
- this.select = __bind(this.select, this);
1685
-
1686
- this.sin_p0 = Math.sin(p0);
1687
- this.cos_p0 = Math.cos(p0);
1688
- this.sin_p1 = Math.sin(p1);
1689
- this.cos_p1 = Math.cos(p1);
1690
- this.is_long = (p1 - p0) > Math.PI ? 1 : 0;
1691
- this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5);
1692
- this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer);
1693
- this.hilight = this.calcArc(this.inner);
1694
- }
1695
-
1696
- DonutSegment.prototype.calcArcPoints = function(r) {
1697
- return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1];
1698
- };
1699
-
1700
- DonutSegment.prototype.calcSegment = function(r1, r2) {
1701
- var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1;
1702
- _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];
1703
- _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3];
1704
- return ("M" + ix0 + "," + iy0) + ("A" + r1 + "," + r1 + ",0," + this.is_long + ",0," + ix1 + "," + iy1) + ("L" + ox1 + "," + oy1) + ("A" + r2 + "," + r2 + ",0," + this.is_long + ",1," + ox0 + "," + oy0) + "Z";
1705
- };
1706
-
1707
- DonutSegment.prototype.calcArc = function(r) {
1708
- var ix0, ix1, iy0, iy1, _ref;
1709
- _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];
1710
- return ("M" + ix0 + "," + iy0) + ("A" + r + "," + r + ",0," + this.is_long + ",0," + ix1 + "," + iy1);
1711
- };
1712
-
1713
- DonutSegment.prototype.render = function() {
1714
- var _this = this;
1715
- this.arc = this.drawDonutArc(this.hilight, this.color);
1716
- return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() {
1717
- return _this.fire('hover', _this.index);
1718
- }, function() {
1719
- return _this.fire('click', _this.index);
1720
- });
1721
- };
1722
-
1723
- DonutSegment.prototype.drawDonutArc = function(path, color) {
1724
- return this.raphael.path(path).attr({
1725
- stroke: color,
1726
- 'stroke-width': 2,
1727
- opacity: 0
1728
- });
1729
- };
1730
-
1731
- DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) {
1732
- return this.raphael.path(path).attr({
1733
- fill: fillColor,
1734
- stroke: strokeColor,
1735
- 'stroke-width': 3
1736
- }).hover(hoverFunction).click(clickFunction);
1737
- };
1738
-
1739
- DonutSegment.prototype.select = function() {
1740
- if (!this.selected) {
1741
- this.seg.animate({
1742
- path: this.selectedPath
1743
- }, 150, '<>');
1744
- this.arc.animate({
1745
- opacity: 1
1746
- }, 150, '<>');
1747
- return this.selected = true;
1748
- }
1749
- };
1750
-
1751
- DonutSegment.prototype.deselect = function() {
1752
- if (this.selected) {
1753
- this.seg.animate({
1754
- path: this.path
1755
- }, 150, '<>');
1756
- this.arc.animate({
1757
- opacity: 0
1758
- }, 150, '<>');
1759
- return this.selected = false;
1760
- }
1761
- };
1762
-
1763
- return DonutSegment;
1764
-
1765
- })(Morris.EventEmitter);
1766
-
1767
- }).call(this);