| | |
| | | /** |
| | | * @license Highcharts JS v3.0.6 (2013-10-04) |
| | | * MooTools adapter |
| | | * |
| | | * (c) 2010-2013 Torstein Hønsi |
| | | * |
| | | * License: www.highcharts.com/license |
| | | */ |
| | | |
| | | // JSLint options: |
| | | /*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */ |
| | | |
| | | (function () { |
| | | |
| | | var win = window, |
| | | doc = document, |
| | | mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number |
| | | legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not. |
| | | legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent. |
| | | $extend = win.$extend || function () { |
| | | return Object.append.apply(Object, arguments); |
| | | }; |
| | | |
| | | win.HighchartsAdapter = { |
| | | /** |
| | | * Initialize the adapter. This is run once as Highcharts is first run. |
| | | * @param {Object} pathAnim The helper object to do animations across adapters. |
| | | */ |
| | | init: function (pathAnim) { |
| | | var fxProto = Fx.prototype, |
| | | fxStart = fxProto.start, |
| | | morphProto = Fx.Morph.prototype, |
| | | morphCompute = morphProto.compute; |
| | | |
| | | // override Fx.start to allow animation of SVG element wrappers |
| | | /*jslint unparam: true*//* allow unused parameters in fx functions */ |
| | | fxProto.start = function (from, to) { |
| | | var fx = this, |
| | | elem = fx.element; |
| | | |
| | | // special for animating paths |
| | | if (from.d) { |
| | | //this.fromD = this.element.d.split(' '); |
| | | fx.paths = pathAnim.init( |
| | | elem, |
| | | elem.d, |
| | | fx.toD |
| | | ); |
| | | } |
| | | fxStart.apply(fx, arguments); |
| | | |
| | | return this; // chainable |
| | | }; |
| | | |
| | | // override Fx.step to allow animation of SVG element wrappers |
| | | morphProto.compute = function (from, to, delta) { |
| | | var fx = this, |
| | | paths = fx.paths; |
| | | |
| | | if (paths) { |
| | | fx.element.attr( |
| | | 'd', |
| | | pathAnim.step(paths[0], paths[1], delta, fx.toD) |
| | | ); |
| | | } else { |
| | | return morphCompute.apply(fx, arguments); |
| | | } |
| | | }; |
| | | /*jslint unparam: false*/ |
| | | }, |
| | | |
| | | /** |
| | | * Run a general method on the framework, following jQuery syntax |
| | | * @param {Object} el The HTML element |
| | | * @param {String} method Which method to run on the wrapped element |
| | | */ |
| | | adapterRun: function (el, method) { |
| | | |
| | | // This currently works for getting inner width and height. If adding |
| | | // more methods later, we need a conditional implementation for each. |
| | | if (method === 'width' || method === 'height') { |
| | | return parseInt($(el).getStyle(method), 10); |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * Downloads a script and executes a callback when done. |
| | | * @param {String} scriptLocation |
| | | * @param {Function} callback |
| | | */ |
| | | getScript: function (scriptLocation, callback) { |
| | | // We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script. |
| | | var head = doc.getElementsByTagName('head')[0]; |
| | | var script = doc.createElement('script'); |
| | | |
| | | script.type = 'text/javascript'; |
| | | script.src = scriptLocation; |
| | | script.onload = callback; |
| | | |
| | | head.appendChild(script); |
| | | }, |
| | | |
| | | /** |
| | | * Animate a HTML element or SVG element wrapper |
| | | * @param {Object} el |
| | | * @param {Object} params |
| | | * @param {Object} options jQuery-like animation options: duration, easing, callback |
| | | */ |
| | | animate: function (el, params, options) { |
| | | var isSVGElement = el.attr, |
| | | effect, |
| | | complete = options && options.complete; |
| | | |
| | | if (isSVGElement && !el.setStyle) { |
| | | // add setStyle and getStyle methods for internal use in Moo |
| | | el.getStyle = el.attr; |
| | | el.setStyle = function () { // property value is given as array in Moo - break it down |
| | | var args = arguments; |
| | | this.attr.call(this, args[0], args[1][0]); |
| | | }; |
| | | // dirty hack to trick Moo into handling el as an element wrapper |
| | | el.$family = function () { return true; }; |
| | | } |
| | | |
| | | // stop running animations |
| | | win.HighchartsAdapter.stop(el); |
| | | |
| | | // define and run the effect |
| | | effect = new Fx.Morph( |
| | | isSVGElement ? el : $(el), |
| | | $extend({ |
| | | transition: Fx.Transitions.Quad.easeInOut |
| | | }, options) |
| | | ); |
| | | |
| | | // Make sure that the element reference is set when animating svg elements |
| | | if (isSVGElement) { |
| | | effect.element = el; |
| | | } |
| | | |
| | | // special treatment for paths |
| | | if (params.d) { |
| | | effect.toD = params.d; |
| | | } |
| | | |
| | | // jQuery-like events |
| | | if (complete) { |
| | | effect.addEvent('complete', complete); |
| | | } |
| | | |
| | | // run |
| | | effect.start(params); |
| | | |
| | | // record for use in stop method |
| | | el.fx = effect; |
| | | }, |
| | | |
| | | /** |
| | | * MooTool's each function |
| | | * |
| | | */ |
| | | each: function (arr, fn) { |
| | | return legacy ? |
| | | $each(arr, fn) : |
| | | Array.each(arr, fn); |
| | | }, |
| | | |
| | | /** |
| | | * Map an array |
| | | * @param {Array} arr |
| | | * @param {Function} fn |
| | | */ |
| | | map: function (arr, fn) { |
| | | return arr.map(fn); |
| | | }, |
| | | |
| | | /** |
| | | * Grep or filter an array |
| | | * @param {Array} arr |
| | | * @param {Function} fn |
| | | */ |
| | | grep: function (arr, fn) { |
| | | return arr.filter(fn); |
| | | }, |
| | | |
| | | /** |
| | | * Return the index of an item in an array, or -1 if not matched |
| | | */ |
| | | inArray: function (item, arr, from) { |
| | | return arr ? arr.indexOf(item, from) : -1; |
| | | }, |
| | | |
| | | /** |
| | | * Get the offset of an element relative to the top left corner of the web page |
| | | */ |
| | | offset: function (el) { |
| | | var offsets = el.getPosition(); // #1496 |
| | | return { |
| | | left: offsets.x, |
| | | top: offsets.y |
| | | }; |
| | | }, |
| | | |
| | | /** |
| | | * Extends an object with Events, if its not done |
| | | */ |
| | | extendWithEvents: function (el) { |
| | | // if the addEvent method is not defined, el is a custom Highcharts object |
| | | // like series or point |
| | | if (!el.addEvent) { |
| | | if (el.nodeName) { |
| | | el = $(el); // a dynamically generated node |
| | | } else { |
| | | $extend(el, new Events()); // a custom object |
| | | } |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * Add an event listener |
| | | * @param {Object} el HTML element or custom object |
| | | * @param {String} type Event type |
| | | * @param {Function} fn Event handler |
| | | */ |
| | | addEvent: function (el, type, fn) { |
| | | if (typeof type === 'string') { // chart broke due to el being string, type function |
| | | |
| | | if (type === 'unload') { // Moo self destructs before custom unload events |
| | | type = 'beforeunload'; |
| | | } |
| | | |
| | | win.HighchartsAdapter.extendWithEvents(el); |
| | | |
| | | el.addEvent(type, fn); |
| | | } |
| | | }, |
| | | |
| | | removeEvent: function (el, type, fn) { |
| | | if (typeof el === 'string') { |
| | | // el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out. |
| | | return; |
| | | } |
| | | |
| | | if (el.addEvent) { // If el doesn't have an addEvent method, there are no events to remove |
| | | if (type) { |
| | | if (type === 'unload') { // Moo self destructs before custom unload events |
| | | type = 'beforeunload'; |
| | | } |
| | | |
| | | if (fn) { |
| | | el.removeEvent(type, fn); |
| | | } else if (el.removeEvents) { // #958 |
| | | el.removeEvents(type); |
| | | } |
| | | } else { |
| | | el.removeEvents(); |
| | | } |
| | | } |
| | | }, |
| | | |
| | | fireEvent: function (el, event, eventArguments, defaultFunction) { |
| | | var eventArgs = { |
| | | type: event, |
| | | target: el |
| | | }; |
| | | // create an event object that keeps all functions |
| | | event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs); |
| | | event = $extend(event, eventArguments); |
| | | |
| | | // When running an event on the Chart.prototype, MooTools nests the target in event.event |
| | | if (!event.target && event.event) { |
| | | event.target = event.event.target; |
| | | } |
| | | |
| | | // override the preventDefault function to be able to use |
| | | // this for custom events |
| | | event.preventDefault = function () { |
| | | defaultFunction = null; |
| | | }; |
| | | // if fireEvent is not available on the object, there hasn't been added |
| | | // any events to it above |
| | | if (el.fireEvent) { |
| | | el.fireEvent(event.type, event); |
| | | } |
| | | |
| | | // fire the default if it is passed and it is not prevented above |
| | | if (defaultFunction) { |
| | | defaultFunction(event); |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * Set back e.pageX and e.pageY that MooTools has abstracted away. #1165, #1346. |
| | | */ |
| | | washMouseEvent: function (e) { |
| | | if (e.page) { |
| | | e.pageX = e.page.x; |
| | | e.pageY = e.page.y; |
| | | } |
| | | return e; |
| | | }, |
| | | |
| | | /** |
| | | * Stop running animations on the object |
| | | */ |
| | | stop: function (el) { |
| | | if (el.fx) { |
| | | el.fx.cancel(); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | }()); |
| | | /**
|
| | | * @license Highcharts JS v3.0.6 (2013-10-04)
|
| | | * MooTools adapter
|
| | | *
|
| | | * (c) 2010-2013 Torstein Hønsi
|
| | | *
|
| | | * License: www.highcharts.com/license
|
| | | */
|
| | |
|
| | | // JSLint options:
|
| | | /*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */
|
| | |
|
| | | (function () {
|
| | |
|
| | | var win = window,
|
| | | doc = document,
|
| | | mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number
|
| | | legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not.
|
| | | legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent.
|
| | | $extend = win.$extend || function () {
|
| | | return Object.append.apply(Object, arguments);
|
| | | };
|
| | |
|
| | | win.HighchartsAdapter = {
|
| | | /**
|
| | | * Initialize the adapter. This is run once as Highcharts is first run.
|
| | | * @param {Object} pathAnim The helper object to do animations across adapters.
|
| | | */
|
| | | init: function (pathAnim) {
|
| | | var fxProto = Fx.prototype,
|
| | | fxStart = fxProto.start,
|
| | | morphProto = Fx.Morph.prototype,
|
| | | morphCompute = morphProto.compute;
|
| | |
|
| | | // override Fx.start to allow animation of SVG element wrappers
|
| | | /*jslint unparam: true*//* allow unused parameters in fx functions */
|
| | | fxProto.start = function (from, to) {
|
| | | var fx = this,
|
| | | elem = fx.element;
|
| | |
|
| | | // special for animating paths
|
| | | if (from.d) {
|
| | | //this.fromD = this.element.d.split(' ');
|
| | | fx.paths = pathAnim.init(
|
| | | elem,
|
| | | elem.d,
|
| | | fx.toD
|
| | | );
|
| | | }
|
| | | fxStart.apply(fx, arguments);
|
| | |
|
| | | return this; // chainable
|
| | | };
|
| | |
|
| | | // override Fx.step to allow animation of SVG element wrappers
|
| | | morphProto.compute = function (from, to, delta) {
|
| | | var fx = this,
|
| | | paths = fx.paths;
|
| | |
|
| | | if (paths) {
|
| | | fx.element.attr(
|
| | | 'd',
|
| | | pathAnim.step(paths[0], paths[1], delta, fx.toD)
|
| | | );
|
| | | } else {
|
| | | return morphCompute.apply(fx, arguments);
|
| | | }
|
| | | };
|
| | | /*jslint unparam: false*/
|
| | | },
|
| | | |
| | | /**
|
| | | * Run a general method on the framework, following jQuery syntax
|
| | | * @param {Object} el The HTML element
|
| | | * @param {String} method Which method to run on the wrapped element
|
| | | */
|
| | | adapterRun: function (el, method) {
|
| | | |
| | | // This currently works for getting inner width and height. If adding
|
| | | // more methods later, we need a conditional implementation for each.
|
| | | if (method === 'width' || method === 'height') {
|
| | | return parseInt($(el).getStyle(method), 10);
|
| | | }
|
| | | },
|
| | |
|
| | | /**
|
| | | * Downloads a script and executes a callback when done.
|
| | | * @param {String} scriptLocation
|
| | | * @param {Function} callback
|
| | | */
|
| | | getScript: function (scriptLocation, callback) {
|
| | | // We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
|
| | | var head = doc.getElementsByTagName('head')[0];
|
| | | var script = doc.createElement('script');
|
| | |
|
| | | script.type = 'text/javascript';
|
| | | script.src = scriptLocation;
|
| | | script.onload = callback;
|
| | |
|
| | | head.appendChild(script);
|
| | | },
|
| | |
|
| | | /**
|
| | | * Animate a HTML element or SVG element wrapper
|
| | | * @param {Object} el
|
| | | * @param {Object} params
|
| | | * @param {Object} options jQuery-like animation options: duration, easing, callback
|
| | | */
|
| | | animate: function (el, params, options) {
|
| | | var isSVGElement = el.attr,
|
| | | effect,
|
| | | complete = options && options.complete;
|
| | |
|
| | | if (isSVGElement && !el.setStyle) {
|
| | | // add setStyle and getStyle methods for internal use in Moo
|
| | | el.getStyle = el.attr;
|
| | | el.setStyle = function () { // property value is given as array in Moo - break it down
|
| | | var args = arguments;
|
| | | this.attr.call(this, args[0], args[1][0]);
|
| | | };
|
| | | // dirty hack to trick Moo into handling el as an element wrapper
|
| | | el.$family = function () { return true; };
|
| | | }
|
| | |
|
| | | // stop running animations
|
| | | win.HighchartsAdapter.stop(el);
|
| | |
|
| | | // define and run the effect
|
| | | effect = new Fx.Morph(
|
| | | isSVGElement ? el : $(el),
|
| | | $extend({
|
| | | transition: Fx.Transitions.Quad.easeInOut
|
| | | }, options)
|
| | | );
|
| | |
|
| | | // Make sure that the element reference is set when animating svg elements
|
| | | if (isSVGElement) {
|
| | | effect.element = el;
|
| | | }
|
| | |
|
| | | // special treatment for paths
|
| | | if (params.d) {
|
| | | effect.toD = params.d;
|
| | | }
|
| | |
|
| | | // jQuery-like events
|
| | | if (complete) {
|
| | | effect.addEvent('complete', complete);
|
| | | }
|
| | |
|
| | | // run
|
| | | effect.start(params);
|
| | |
|
| | | // record for use in stop method
|
| | | el.fx = effect;
|
| | | },
|
| | |
|
| | | /**
|
| | | * MooTool's each function
|
| | | *
|
| | | */
|
| | | each: function (arr, fn) {
|
| | | return legacy ?
|
| | | $each(arr, fn) :
|
| | | Array.each(arr, fn);
|
| | | },
|
| | |
|
| | | /**
|
| | | * Map an array
|
| | | * @param {Array} arr
|
| | | * @param {Function} fn
|
| | | */
|
| | | map: function (arr, fn) {
|
| | | return arr.map(fn);
|
| | | },
|
| | |
|
| | | /**
|
| | | * Grep or filter an array
|
| | | * @param {Array} arr
|
| | | * @param {Function} fn
|
| | | */
|
| | | grep: function (arr, fn) {
|
| | | return arr.filter(fn);
|
| | | },
|
| | | |
| | | /**
|
| | | * Return the index of an item in an array, or -1 if not matched
|
| | | */
|
| | | inArray: function (item, arr, from) {
|
| | | return arr ? arr.indexOf(item, from) : -1;
|
| | | },
|
| | |
|
| | | /**
|
| | | * Get the offset of an element relative to the top left corner of the web page
|
| | | */
|
| | | offset: function (el) {
|
| | | var offsets = el.getPosition(); // #1496
|
| | | return {
|
| | | left: offsets.x,
|
| | | top: offsets.y
|
| | | };
|
| | | },
|
| | |
|
| | | /**
|
| | | * Extends an object with Events, if its not done
|
| | | */
|
| | | extendWithEvents: function (el) {
|
| | | // if the addEvent method is not defined, el is a custom Highcharts object
|
| | | // like series or point
|
| | | if (!el.addEvent) {
|
| | | if (el.nodeName) {
|
| | | el = $(el); // a dynamically generated node
|
| | | } else {
|
| | | $extend(el, new Events()); // a custom object
|
| | | }
|
| | | }
|
| | | },
|
| | |
|
| | | /**
|
| | | * Add an event listener
|
| | | * @param {Object} el HTML element or custom object
|
| | | * @param {String} type Event type
|
| | | * @param {Function} fn Event handler
|
| | | */
|
| | | addEvent: function (el, type, fn) {
|
| | | if (typeof type === 'string') { // chart broke due to el being string, type function
|
| | |
|
| | | if (type === 'unload') { // Moo self destructs before custom unload events
|
| | | type = 'beforeunload';
|
| | | }
|
| | |
|
| | | win.HighchartsAdapter.extendWithEvents(el);
|
| | |
|
| | | el.addEvent(type, fn);
|
| | | }
|
| | | },
|
| | |
|
| | | removeEvent: function (el, type, fn) {
|
| | | if (typeof el === 'string') {
|
| | | // el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out.
|
| | | return;
|
| | | }
|
| | | |
| | | if (el.addEvent) { // If el doesn't have an addEvent method, there are no events to remove
|
| | | if (type) {
|
| | | if (type === 'unload') { // Moo self destructs before custom unload events
|
| | | type = 'beforeunload';
|
| | | }
|
| | | |
| | | if (fn) {
|
| | | el.removeEvent(type, fn);
|
| | | } else if (el.removeEvents) { // #958
|
| | | el.removeEvents(type);
|
| | | }
|
| | | } else {
|
| | | el.removeEvents();
|
| | | }
|
| | | }
|
| | | },
|
| | |
|
| | | fireEvent: function (el, event, eventArguments, defaultFunction) {
|
| | | var eventArgs = {
|
| | | type: event,
|
| | | target: el
|
| | | };
|
| | | // create an event object that keeps all functions
|
| | | event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs);
|
| | | event = $extend(event, eventArguments);
|
| | |
|
| | | // When running an event on the Chart.prototype, MooTools nests the target in event.event
|
| | | if (!event.target && event.event) {
|
| | | event.target = event.event.target;
|
| | | }
|
| | |
|
| | | // override the preventDefault function to be able to use
|
| | | // this for custom events
|
| | | event.preventDefault = function () {
|
| | | defaultFunction = null;
|
| | | };
|
| | | // if fireEvent is not available on the object, there hasn't been added
|
| | | // any events to it above
|
| | | if (el.fireEvent) {
|
| | | el.fireEvent(event.type, event);
|
| | | }
|
| | |
|
| | | // fire the default if it is passed and it is not prevented above
|
| | | if (defaultFunction) {
|
| | | defaultFunction(event);
|
| | | }
|
| | | },
|
| | | |
| | | /**
|
| | | * Set back e.pageX and e.pageY that MooTools has abstracted away. #1165, #1346.
|
| | | */
|
| | | washMouseEvent: function (e) {
|
| | | if (e.page) {
|
| | | e.pageX = e.page.x;
|
| | | e.pageY = e.page.y;
|
| | | }
|
| | | return e;
|
| | | },
|
| | |
|
| | | /**
|
| | | * Stop running animations on the object
|
| | | */
|
| | | stop: function (el) {
|
| | | if (el.fx) {
|
| | | el.fx.cancel();
|
| | | }
|
| | | }
|
| | | };
|
| | |
|
| | | }());
|