| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 | /** * @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();		}	}};}());
 |