highcharts-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,243 @@
1
+ /**
2
+ * @license Highcharts JS v2.1.6 (2011-07-08)
3
+ * MooTools adapter
4
+ *
5
+ * (c) 2010-2011 Torstein Hønsi
6
+ *
7
+ * License: www.highcharts.com/license
8
+ */
9
+
10
+ // JSLint options:
11
+ /*global Highcharts, Fx, $, $extend, $each, $merge, Events, Event */
12
+
13
+ (function() {
14
+
15
+ var win = window,
16
+ legacy = !!win.$merge,
17
+ $extend = win.$extend || function() {
18
+ return Object.append.apply(Object, arguments)
19
+ };
20
+
21
+ win.HighchartsAdapter = {
22
+ /**
23
+ * Initialize the adapter. This is run once as Highcharts is first run.
24
+ */
25
+ init: function() {
26
+ var fxProto = Fx.prototype,
27
+ fxStart = fxProto.start,
28
+ morphProto = Fx.Morph.prototype,
29
+ morphCompute = morphProto.compute;
30
+
31
+ // override Fx.start to allow animation of SVG element wrappers
32
+ fxProto.start = function(from, to) {
33
+ var fx = this,
34
+ elem = fx.element;
35
+
36
+ // special for animating paths
37
+ if (from.d) {
38
+ //this.fromD = this.element.d.split(' ');
39
+ fx.paths = Highcharts.pathAnim.init(
40
+ elem,
41
+ elem.d,
42
+ fx.toD
43
+ );
44
+ }
45
+ fxStart.apply(fx, arguments);
46
+
47
+ return this; // chainable
48
+ };
49
+
50
+ // override Fx.step to allow animation of SVG element wrappers
51
+ morphProto.compute = function(from, to, delta) {
52
+ var fx = this,
53
+ paths = fx.paths;
54
+
55
+ if (paths) {
56
+ fx.element.attr(
57
+ 'd',
58
+ Highcharts.pathAnim.step(paths[0], paths[1], delta, fx.toD)
59
+ );
60
+ } else {
61
+ return morphCompute.apply(fx, arguments);
62
+ }
63
+ };
64
+
65
+ },
66
+
67
+ /**
68
+ * Animate a HTML element or SVG element wrapper
69
+ * @param {Object} el
70
+ * @param {Object} params
71
+ * @param {Object} options jQuery-like animation options: duration, easing, callback
72
+ */
73
+ animate: function (el, params, options) {
74
+ var isSVGElement = el.attr,
75
+ effect,
76
+ complete = options && options.complete;
77
+
78
+ if (isSVGElement && !el.setStyle) {
79
+ // add setStyle and getStyle methods for internal use in Moo
80
+ el.getStyle = el.attr;
81
+ el.setStyle = function() { // property value is given as array in Moo - break it down
82
+ var args = arguments;
83
+ el.attr.call(el, args[0], args[1][0]);
84
+ }
85
+ // dirty hack to trick Moo into handling el as an element wrapper
86
+ el.$family = el.uid = true;
87
+ }
88
+
89
+ // stop running animations
90
+ HighchartsAdapter.stop(el);
91
+
92
+ // define and run the effect
93
+ effect = new Fx.Morph(
94
+ isSVGElement ? el : $(el),
95
+ $extend({
96
+ transition: Fx.Transitions.Quad.easeInOut
97
+ }, options)
98
+ );
99
+
100
+ // special treatment for paths
101
+ if (params.d) {
102
+ effect.toD = params.d;
103
+ }
104
+
105
+ // jQuery-like events
106
+ if (complete) {
107
+ effect.addEvent('complete', complete);
108
+ }
109
+
110
+ // run
111
+ effect.start(params);
112
+
113
+ // record for use in stop method
114
+ el.fx = effect;
115
+ },
116
+
117
+ /**
118
+ * MooTool's each function
119
+ *
120
+ */
121
+ each: function(arr, fn) {
122
+ return legacy ?
123
+ $each(arr, fn) :
124
+ arr.each(fn);
125
+ },
126
+
127
+ /**
128
+ * Map an array
129
+ * @param {Array} arr
130
+ * @param {Function} fn
131
+ */
132
+ map: function (arr, fn){
133
+ return arr.map(fn);
134
+ },
135
+
136
+ /**
137
+ * Grep or filter an array
138
+ * @param {Array} arr
139
+ * @param {Function} fn
140
+ */
141
+ grep: function(arr, fn) {
142
+ return arr.filter(fn);
143
+ },
144
+
145
+ /**
146
+ * Deep merge two objects and return a third
147
+ */
148
+ merge: function() {
149
+ var args = arguments,
150
+ args13 = [{}], // MooTools 1.3+
151
+ i = args.length,
152
+ ret;
153
+
154
+ if (legacy) {
155
+ ret = $merge.apply(null, args);
156
+ } else {
157
+ while (i--) {
158
+ args13[i + 1] = args[i];
159
+ }
160
+ ret = Object.merge.apply(Object, args13);
161
+ }
162
+
163
+ return ret;
164
+ },
165
+
166
+ /**
167
+ * Add an event listener
168
+ * @param {Object} el HTML element or custom object
169
+ * @param {String} type Event type
170
+ * @param {Function} fn Event handler
171
+ */
172
+ addEvent: function (el, type, fn) {
173
+ if (typeof type == 'string') { // chart broke due to el being string, type function
174
+
175
+ if (type == 'unload') { // Moo self destructs before custom unload events
176
+ type = 'beforeunload';
177
+ }
178
+
179
+ // if the addEvent method is not defined, el is a custom Highcharts object
180
+ // like series or point
181
+ if (!el.addEvent) {
182
+ if (el.nodeName) {
183
+ el = $(el); // a dynamically generated node
184
+ } else {
185
+ $extend(el, new Events()); // a custom object
186
+ }
187
+ }
188
+
189
+ el.addEvent(type, fn);
190
+ }
191
+ },
192
+
193
+ removeEvent: function(el, type, fn) {
194
+ if (type) {
195
+ if (type == 'unload') { // Moo self destructs before custom unload events
196
+ type = 'beforeunload';
197
+ }
198
+
199
+ if (defined(fn)) {
200
+ el.removeEvent(type, fn);
201
+ } else {
202
+ el.removeEvents(type);
203
+ }
204
+ } else {
205
+ el.removeEvents();
206
+ }
207
+ },
208
+
209
+ fireEvent: function(el, event, eventArguments, defaultFunction) {
210
+ // create an event object that keeps all functions
211
+ event = new Event({
212
+ type: event,
213
+ target: el
214
+ });
215
+ event = $extend(event, eventArguments);
216
+ // override the preventDefault function to be able to use
217
+ // this for custom events
218
+ event.preventDefault = function() {
219
+ defaultFunction = null;
220
+ };
221
+ // if fireEvent is not available on the object, there hasn't been added
222
+ // any events to it above
223
+ if (el.fireEvent) {
224
+ el.fireEvent(event.type, event);
225
+ }
226
+
227
+ // fire the default if it is passed and it is not prevented above
228
+ if (defaultFunction) {
229
+ defaultFunction(event);
230
+ }
231
+ },
232
+
233
+ /**
234
+ * Stop running animations on the object
235
+ */
236
+ stop: function (el) {
237
+ if (el.fx) {
238
+ el.fx.cancel();
239
+ }
240
+ }
241
+ }
242
+
243
+ })();
@@ -0,0 +1,284 @@
1
+ /**
2
+ * @license Highcharts JS v2.1.6 (2011-07-08)
3
+ * Prototype adapter
4
+ *
5
+ * @author Michael Nelson, Torstein Hønsi.
6
+ *
7
+ * Feel free to use and modify this script.
8
+ * Highcharts license: www.highcharts.com/license.
9
+ */
10
+
11
+ /*
12
+ * Known issues:
13
+ * - Some grid lines land in wrong position - http://jsfiddle.net/highcharts/jaRhY/28
14
+ */
15
+
16
+ // JSLint options:
17
+ /*jslint forin: true */
18
+ /*global Effect, Class, Highcharts, Event, $, $A */
19
+
20
+ // Adapter interface between prototype and the Highcarts charting library
21
+ var HighchartsAdapter = (function() {
22
+
23
+ var hasEffect = typeof Effect != 'undefined';
24
+
25
+ return {
26
+
27
+ init: function() {
28
+
29
+ if (hasEffect) {
30
+ /**
31
+ * Animation for Highcharts SVG element wrappers only
32
+ * @param {Object} element
33
+ * @param {Object} attribute
34
+ * @param {Object} to
35
+ * @param {Object} options
36
+ */
37
+ Effect.HighchartsTransition = Class.create(Effect.Base, {
38
+ initialize: function(element, attr, to, options){
39
+ var from,
40
+ opts;
41
+
42
+ this.element = element;
43
+
44
+ from = element.attr(attr);
45
+
46
+ // special treatment for paths
47
+ if (attr == 'd') {
48
+ this.paths = Highcharts.pathAnim.init(
49
+ element,
50
+ element.d,
51
+ to
52
+ );
53
+ this.toD = to;
54
+
55
+
56
+ // fake values in order to read relative position as a float in update
57
+ from = 0;
58
+ to = 1;
59
+ }
60
+
61
+ opts = Object.extend((options || {}), {
62
+ from: from,
63
+ to: to,
64
+ attribute: attr
65
+ });
66
+ this.start(opts);
67
+ },
68
+ setup: function(){
69
+ HighchartsAdapter._extend(this.element);
70
+ this.element._highchart_animation = this;
71
+ },
72
+ update: function(position) {
73
+ var paths = this.paths;
74
+
75
+ if (paths) {
76
+ position = Highcharts.pathAnim.step(paths[0], paths[1], position, this.toD);
77
+ }
78
+
79
+ this.element.attr(this.options.attribute, position);
80
+ },
81
+ finish: function(){
82
+ this.element._highchart_animation = null;
83
+ }
84
+ });
85
+ }
86
+ },
87
+
88
+ // el needs an event to be attached. el is not necessarily a dom element
89
+ addEvent: function(el, event, fn) {
90
+ if (el.addEventListener || el.attachEvent) {
91
+ Event.observe($(el), event, fn);
92
+
93
+ } else {
94
+ HighchartsAdapter._extend(el);
95
+ el._highcharts_observe(event, fn);
96
+ }
97
+ },
98
+
99
+ // motion makes things pretty. use it if effects is loaded, if not... still get to the end result.
100
+ animate: function(el, params, options) {
101
+ var key,
102
+ fx;
103
+
104
+ // default options
105
+ options = options || {};
106
+ options.delay = 0;
107
+ options.duration = (options.duration || 500) / 1000;
108
+
109
+ // animate wrappers and DOM elements
110
+ if (hasEffect) {
111
+ for (key in params) {
112
+ fx = new Effect.HighchartsTransition($(el), key, params[key], options);
113
+ }
114
+ } else {
115
+ for (key in params) {
116
+ el.attr(key, params[key]);
117
+ }
118
+ }
119
+
120
+ if (!el.attr) {
121
+ throw 'Todo: implement animate DOM objects';
122
+ }
123
+ },
124
+
125
+ // this only occurs in higcharts 2.0+
126
+ stop: function(el){
127
+ if (el._highcharts_extended && el._highchart_animation) {
128
+ el._highchart_animation.cancel();
129
+ }
130
+ },
131
+
132
+ // um.. each
133
+ each: function(arr, fn){
134
+ $A(arr).each(fn);
135
+ },
136
+
137
+ // fire an event based on an event name (event) and an object (el).
138
+ // again, el may not be a dom element
139
+ fireEvent: function(el, event, eventArguments, defaultFunction){
140
+ if (event.preventDefault) {
141
+ defaultFunction = null;
142
+ }
143
+
144
+ if (el.fire) {
145
+ el.fire(event, eventArguments);
146
+ } else if (el._highcharts_extended) {
147
+ el._highcharts_fire(event, eventArguments);
148
+ }
149
+
150
+ if (defaultFunction) {
151
+ defaultFunction(eventArguments);
152
+ }
153
+ },
154
+
155
+ removeEvent: function(el, event, handler){
156
+ if ($(el).stopObserving) {
157
+ $(el).stopObserving(event, handler);
158
+ } else {
159
+ HighchartsAdapter._extend(el);
160
+ el._highcharts_stop_observing(event, handler);
161
+ }
162
+ },
163
+
164
+ // um, grep
165
+ grep: function(arr, fn){
166
+ return arr.findAll(fn);
167
+ },
168
+
169
+ // um, map
170
+ map: function(arr, fn){
171
+ return arr.map(fn);
172
+ },
173
+
174
+ // deep merge. merge({a : 'a', b : {b1 : 'b1', b2 : 'b2'}}, {b : {b2 : 'b2_prime'}, c : 'c'}) => {a : 'a', b : {b1 : 'b1', b2 : 'b2_prime'}, c : 'c'}
175
+ /*merge: function(){
176
+ function doCopy(copy, original) {
177
+ var value,
178
+ key,
179
+ undef,
180
+ nil,
181
+ same,
182
+ obj,
183
+ arr,
184
+ node;
185
+
186
+ for (key in original) {
187
+ value = original[key];
188
+ undef = typeof(value) === 'undefined';
189
+ nil = value === null;
190
+ same = original === copy[key];
191
+
192
+ if (undef || nil || same) {
193
+ continue;
194
+ }
195
+
196
+ obj = typeof(value) === 'object';
197
+ arr = value && obj && value.constructor == Array;
198
+ node = !!value.nodeType;
199
+
200
+ if (obj && !arr && !node) {
201
+ copy[key] = doCopy(typeof copy[key] == 'object' ? copy[key] : {}, value);
202
+ }
203
+ else {
204
+ copy[key] = original[key];
205
+ }
206
+ }
207
+ return copy;
208
+ }
209
+
210
+ var args = arguments, retVal = {};
211
+
212
+ for (var i = 0; i < args.length; i++) {
213
+ retVal = doCopy(retVal, args[i]);
214
+ }
215
+
216
+ return retVal;
217
+ },*/
218
+ merge: function() { // the built-in prototype merge function doesn't do deep copy
219
+ function doCopy(copy, original) {
220
+ var value;
221
+
222
+ for (var key in original) {
223
+ value = original[key];
224
+ if (value && typeof value == 'object' && value.constructor != Array &&
225
+ typeof value.nodeType !== 'number') {
226
+ copy[key] = doCopy(copy[key] || {}, value); // copy
227
+
228
+ } else {
229
+ copy[key] = original[key];
230
+ }
231
+ }
232
+ return copy;
233
+ }
234
+
235
+ function merge() {
236
+ var args = arguments,
237
+ retVal = {};
238
+
239
+ for (var i = 0; i < args.length; i++) {
240
+ retVal = doCopy(retVal, args[i])
241
+
242
+ }
243
+ return retVal;
244
+ }
245
+
246
+ return merge.apply(this, arguments);
247
+ },
248
+
249
+ // extend an object to handle highchart events (highchart objects, not svg elements).
250
+ // this is a very simple way of handling events but whatever, it works (i think)
251
+ _extend: function(object){
252
+ if (!object._highcharts_extended) {
253
+ Object.extend(object, {
254
+ _highchart_events: {},
255
+ _highchart_animation: null,
256
+ _highcharts_extended: true,
257
+ _highcharts_observe: function(name, fn){
258
+ this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten();
259
+ },
260
+ _highcharts_stop_observing: function(name, fn){
261
+ if (name) {
262
+ if (fn) {
263
+ this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn);
264
+ } else {
265
+ delete this._highchart_events[name];
266
+ }
267
+ } else {
268
+ this._highchart_events = {};
269
+ }
270
+ },
271
+ _highcharts_fire: function(name, args){
272
+ (this._highchart_events[name] || []).each(function(fn){
273
+ if (args && args.stopped) {
274
+ return; // "throw $break" wasn't working. i think because of the scope of 'this'.
275
+ }
276
+ fn.bind(this)(args);
277
+ }
278
+ .bind(this));
279
+ }
280
+ });
281
+ }
282
+ }
283
+ };
284
+ })();