+++ /dev/null
-/** \r
- * @license Highcharts JS v2.1.6 (2011-07-08)\r
- * Prototype adapter\r
- * \r
- * @author Michael Nelson, Torstein Hønsi.\r
- * \r
- * Feel free to use and modify this script.\r
- * Highcharts license: www.highcharts.com/license.\r
- */\r
-\r
-/* \r
- * Known issues: \r
- * - Some grid lines land in wrong position - http://jsfiddle.net/highcharts/jaRhY/28\r
- */\r
-\r
-// JSLint options:\r
-/*jslint forin: true */\r
-/*global Effect, Class, Highcharts, Event, $, $A */\r
-\r
-// Adapter interface between prototype and the Highcarts charting library\r
-var HighchartsAdapter = (function() {\r
-\r
-var hasEffect = typeof Effect != 'undefined';\r
-\r
-return { \r
- \r
- init: function() {\r
- \r
- if (hasEffect) {\r
- /**\r
- * Animation for Highcharts SVG element wrappers only\r
- * @param {Object} element\r
- * @param {Object} attribute\r
- * @param {Object} to\r
- * @param {Object} options\r
- */\r
- Effect.HighchartsTransition = Class.create(Effect.Base, {\r
- initialize: function(element, attr, to, options){\r
- var from,\r
- opts;\r
- \r
- this.element = element;\r
- \r
- from = element.attr(attr);\r
- \r
- // special treatment for paths\r
- if (attr == 'd') {\r
- this.paths = Highcharts.pathAnim.init(\r
- element, \r
- element.d,\r
- to\r
- );\r
- this.toD = to;\r
- \r
- \r
- // fake values in order to read relative position as a float in update\r
- from = 0; \r
- to = 1; \r
- }\r
- \r
- opts = Object.extend((options || {}), {\r
- from: from,\r
- to: to,\r
- attribute: attr\r
- });\r
- this.start(opts);\r
- },\r
- setup: function(){\r
- HighchartsAdapter._extend(this.element);\r
- this.element._highchart_animation = this;\r
- },\r
- update: function(position) {\r
- var paths = this.paths;\r
- \r
- if (paths) {\r
- position = Highcharts.pathAnim.step(paths[0], paths[1], position, this.toD);\r
- }\r
- \r
- this.element.attr(this.options.attribute, position);\r
- },\r
- finish: function(){\r
- this.element._highchart_animation = null;\r
- }\r
- });\r
- }\r
- },\r
- \r
- // el needs an event to be attached. el is not necessarily a dom element\r
- addEvent: function(el, event, fn) {\r
- if (el.addEventListener || el.attachEvent) {\r
- Event.observe($(el), event, fn);\r
- \r
- } else {\r
- HighchartsAdapter._extend(el);\r
- el._highcharts_observe(event, fn);\r
- }\r
- },\r
- \r
- // motion makes things pretty. use it if effects is loaded, if not... still get to the end result.\r
- animate: function(el, params, options) { \r
- var key,\r
- fx;\r
- \r
- // default options\r
- options = options || {};\r
- options.delay = 0;\r
- options.duration = (options.duration || 500) / 1000;\r
- \r
- // animate wrappers and DOM elements\r
- if (hasEffect) { \r
- for (key in params) {\r
- fx = new Effect.HighchartsTransition($(el), key, params[key], options);\r
- }\r
- } else { \r
- for (key in params) {\r
- el.attr(key, params[key]);\r
- }\r
- }\r
- \r
- if (!el.attr) {\r
- throw 'Todo: implement animate DOM objects';\r
- }\r
- },\r
- \r
- // this only occurs in higcharts 2.0+\r
- stop: function(el){\r
- if (el._highcharts_extended && el._highchart_animation) {\r
- el._highchart_animation.cancel();\r
- }\r
- },\r
- \r
- // um.. each\r
- each: function(arr, fn){\r
- $A(arr).each(fn);\r
- },\r
- \r
- // fire an event based on an event name (event) and an object (el).\r
- // again, el may not be a dom element\r
- fireEvent: function(el, event, eventArguments, defaultFunction){\r
- if (event.preventDefault) {\r
- defaultFunction = null;\r
- }\r
- \r
- if (el.fire) {\r
- el.fire(event, eventArguments);\r
- } else if (el._highcharts_extended) {\r
- el._highcharts_fire(event, eventArguments);\r
- }\r
- \r
- if (defaultFunction) { \r
- defaultFunction(eventArguments);\r
- }\r
- },\r
- \r
- removeEvent: function(el, event, handler){\r
- if ($(el).stopObserving) {\r
- $(el).stopObserving(event, handler);\r
- } else {\r
- HighchartsAdapter._extend(el);\r
- el._highcharts_stop_observing(event, handler);\r
- }\r
- },\r
- \r
- // um, grep\r
- grep: function(arr, fn){\r
- return arr.findAll(fn);\r
- },\r
- \r
- // um, map\r
- map: function(arr, fn){\r
- return arr.map(fn);\r
- },\r
- \r
- // 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'}\r
- /*merge: function(){\r
- function doCopy(copy, original) {\r
- var value,\r
- key,\r
- undef,\r
- nil,\r
- same,\r
- obj,\r
- arr,\r
- node;\r
- \r
- for (key in original) {\r
- value = original[key];\r
- undef = typeof(value) === 'undefined';\r
- nil = value === null;\r
- same = original === copy[key];\r
- \r
- if (undef || nil || same) { \r
- continue;\r
- }\r
- \r
- obj = typeof(value) === 'object';\r
- arr = value && obj && value.constructor == Array;\r
- node = !!value.nodeType;\r
- \r
- if (obj && !arr && !node) {\r
- copy[key] = doCopy(typeof copy[key] == 'object' ? copy[key] : {}, value);\r
- }\r
- else {\r
- copy[key] = original[key];\r
- }\r
- }\r
- return copy;\r
- }\r
- \r
- var args = arguments, retVal = {};\r
- \r
- for (var i = 0; i < args.length; i++) {\r
- retVal = doCopy(retVal, args[i]); \r
- }\r
- \r
- return retVal;\r
- },*/\r
- merge: function() { // the built-in prototype merge function doesn't do deep copy\r
- function doCopy(copy, original) {\r
- var value;\r
- \r
- for (var key in original) {\r
- value = original[key];\r
- if (value && typeof value == 'object' && value.constructor != Array && \r
- typeof value.nodeType !== 'number') { \r
- copy[key] = doCopy(copy[key] || {}, value); // copy\r
- \r
- } else {\r
- copy[key] = original[key];\r
- }\r
- }\r
- return copy;\r
- }\r
- \r
- function merge() {\r
- var args = arguments,\r
- retVal = {};\r
- \r
- for (var i = 0; i < args.length; i++) {\r
- retVal = doCopy(retVal, args[i])\r
- \r
- }\r
- return retVal;\r
- }\r
- \r
- return merge.apply(this, arguments);\r
- },\r
- \r
- // extend an object to handle highchart events (highchart objects, not svg elements). \r
- // this is a very simple way of handling events but whatever, it works (i think)\r
- _extend: function(object){\r
- if (!object._highcharts_extended) {\r
- Object.extend(object, {\r
- _highchart_events: {},\r
- _highchart_animation: null,\r
- _highcharts_extended: true,\r
- _highcharts_observe: function(name, fn){\r
- this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten();\r
- },\r
- _highcharts_stop_observing: function(name, fn){\r
- if (name) {\r
- if (fn) {\r
- this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn);\r
- } else {\r
- delete this._highchart_events[name];\r
- }\r
- } else {\r
- this._highchart_events = {};\r
- }\r
- },\r
- _highcharts_fire: function(name, args){\r
- (this._highchart_events[name] || []).each(function(fn){\r
- if (args && args.stopped) {\r
- return; // "throw $break" wasn't working. i think because of the scope of 'this'.\r
- }\r
- fn.bind(this)(args);\r
- }\r
-.bind(this));\r
- }\r
- });\r
- }\r
- }\r
-};\r
-})();\r