| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583 | /** * @license Highcharts JS v3.0.6 (2013-10-04) * * Standalone Highcharts Framework * * License: MIT License *//*global Highcharts */var HighchartsAdapter = (function () {var UNDEFINED,	doc = document,	emptyArray = [],	timers = [],	timerId,	Fx;Math.easeInOutSine = function (t, b, c, d) {	return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;};/** * Extend given object with custom events */function augment(obj) {	function removeOneEvent(el, type, fn) {		el.removeEventListener(type, fn, false);	}	function IERemoveOneEvent(el, type, fn) {		fn = el.HCProxiedMethods[fn.toString()];		el.detachEvent('on' + type, fn);	}	function removeAllEvents(el, type) {		var events = el.HCEvents,			remove,			types,			len,			n;		if (el.removeEventListener) {			remove = removeOneEvent;		} else if (el.attachEvent) {			remove = IERemoveOneEvent;		} else {			return; // break on non-DOM events		}		if (type) {			types = {};			types[type] = true;		} else {			types = events;		}		for (n in types) {			if (events[n]) {				len = events[n].length;				while (len--) {					remove(el, n, events[n][len]);				}			}		}	}	if (!obj.HCExtended) {		Highcharts.extend(obj, {			HCExtended: true,			HCEvents: {},			bind: function (name, fn) {				var el = this,					events = this.HCEvents,					wrappedFn;				// handle DOM events in modern browsers				if (el.addEventListener) {					el.addEventListener(name, fn, false);				// handle old IE implementation				} else if (el.attachEvent) {										wrappedFn = function (e) {						fn.call(el, e);					};					if (!el.HCProxiedMethods) {						el.HCProxiedMethods = {};					}					// link wrapped fn with original fn, so we can get this in removeEvent					el.HCProxiedMethods[fn.toString()] = wrappedFn;					el.attachEvent('on' + name, wrappedFn);				}				if (events[name] === UNDEFINED) {					events[name] = [];				}				events[name].push(fn);			},			unbind: function (name, fn) {				var events,					index;				if (name) {					events = this.HCEvents[name] || [];					if (fn) {						index = HighchartsAdapter.inArray(fn, events);						if (index > -1) {							events.splice(index, 1);							this.HCEvents[name] = events;						}						if (this.removeEventListener) {							removeOneEvent(this, name, fn);						} else if (this.attachEvent) {							IERemoveOneEvent(this, name, fn);						}					} else {						removeAllEvents(this, name);						this.HCEvents[name] = [];					}				} else {					removeAllEvents(this);					this.HCEvents = {};				}			},			trigger: function (name, args) {				var events = this.HCEvents[name] || [],					target = this,					len = events.length,					i,					preventDefault,					fn;				// Attach a simple preventDefault function to skip default handler if called				preventDefault = function () {					args.defaultPrevented = true;				};								for (i = 0; i < len; i++) {					fn = events[i];					// args is never null here					if (args.stopped) {						return;					}					args.preventDefault = preventDefault;					args.target = target;					args.type = name; // #2297											// If the event handler return false, prevent the default handler from executing					if (fn.call(this, args) === false) {						args.preventDefault();					}				}			}		});	}	return obj;}return {	/**	 * Initialize the adapter. This is run once as Highcharts is first run.	 */	init: function (pathAnim) {		/**		 * Compatibility section to add support for legacy IE. This can be removed if old IE 		 * support is not needed.		 */		if (!doc.defaultView) {			this._getStyle = function (el, prop) {				var val;				if (el.style[prop]) {					return el.style[prop];				} else {					if (prop === 'opacity') {						prop = 'filter';					}					/*jslint unparam: true*/					val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b) { return b.toUpperCase(); })];					if (prop === 'filter') {						val = val.replace(							/alpha\(opacity=([0-9]+)\)/, 							function (a, b) { 								return b / 100; 							}						);					}					/*jslint unparam: false*/					return val === '' ? 1 : val;				} 			};			this.adapterRun = function (elem, method) {				var alias = { width: 'clientWidth', height: 'clientHeight' }[method];				if (alias) {					elem.style.zoom = 1;					return elem[alias] - 2 * parseInt(HighchartsAdapter._getStyle(elem, 'padding'), 10);				}			};		}		if (!Array.prototype.forEach) {			this.each = function (arr, fn) { // legacy				var i = 0, 					len = arr.length;				for (; i < len; i++) {					if (fn.call(arr[i], arr[i], i, arr) === false) {						return i;					}				}			};		}		if (!Array.prototype.indexOf) {			this.inArray = function (item, arr) {				var len, 					i = 0;				if (arr) {					len = arr.length;										for (; i < len; i++) {						if (arr[i] === item) {							return i;						}					}				}				return -1;			};		}		if (!Array.prototype.filter) {			this.grep = function (elements, callback) {				var ret = [],					i = 0,					length = elements.length;				for (; i < length; i++) {					if (!!callback(elements[i], i)) {						ret.push(elements[i]);					}				}				return ret;			};		}		//--- End compatibility section ---		/**		 * Start of animation specific code		 */		Fx = function (elem, options, prop) {			this.options = options;			this.elem = elem;			this.prop = prop;		};		Fx.prototype = {						update: function () {				var styles,					paths = this.paths,					elem = this.elem,					elemelem = elem.element; // if destroyed, it is null				// Animating a path definition on SVGElement				if (paths && elemelem) {					elem.attr('d', pathAnim.step(paths[0], paths[1], this.now, this.toD));								// Other animations on SVGElement				} else if (elem.attr) {					if (elemelem) {						elem.attr(this.prop, this.now);					}				// HTML styles				} else {					styles = {};					styles[elem] = this.now + this.unit;					Highcharts.css(elem, styles);				}								if (this.options.step) {					this.options.step.call(this.elem, this.now, this);				}			},			custom: function (from, to, unit) {				var self = this,					t = function (gotoEnd) {						return self.step(gotoEnd);					},					i;				this.startTime = +new Date();				this.start = from;				this.end = to;				this.unit = unit;				this.now = this.start;				this.pos = this.state = 0;				t.elem = this.elem;				if (t() && timers.push(t) === 1) {					timerId = setInterval(function () {												for (i = 0; i < timers.length; i++) {							if (!timers[i]()) {								timers.splice(i--, 1);							}						}						if (!timers.length) {							clearInterval(timerId);						}					}, 13);				}			},						step: function (gotoEnd) {				var t = +new Date(),					ret,					done,					options = this.options,					i;				if (this.elem.stopAnimation) {					ret = false;				} else if (gotoEnd || t >= options.duration + this.startTime) {					this.now = this.end;					this.pos = this.state = 1;					this.update();					this.options.curAnim[this.prop] = true;					done = true;					for (i in options.curAnim) {						if (options.curAnim[i] !== true) {							done = false;						}					}					if (done) {						if (options.complete) {							options.complete.call(this.elem);						}					}					ret = false;				} else {					var n = t - this.startTime;					this.state = n / options.duration;					this.pos = options.easing(n, 0, 1, options.duration);					this.now = this.start + ((this.end - this.start) * this.pos);					this.update();					ret = true;				}				return ret;			}		};		/**		 * The adapter animate method		 */		this.animate = function (el, prop, opt) {			var start,				unit = '',				end,				fx,				args,				name;			el.stopAnimation = false; // ready for new			if (typeof opt !== 'object' || opt === null) {				args = arguments;				opt = {					duration: args[2],					easing: args[3],					complete: args[4]				};			}			if (typeof opt.duration !== 'number') {				opt.duration = 400;			}			opt.easing = Math[opt.easing] || Math.easeInOutSine;			opt.curAnim = Highcharts.extend({}, prop);						for (name in prop) {				fx = new Fx(el, opt, name);				end = null;								if (name === 'd') {					fx.paths = pathAnim.init(						el,						el.d,						prop.d					);					fx.toD = prop.d;					start = 0;					end = 1;				} else if (el.attr) {					start = el.attr(name);				} else {					start = parseFloat(HighchartsAdapter._getStyle(el, name)) || 0;					if (name !== 'opacity') {						unit = 'px';					}				}					if (!end) {					end = parseFloat(prop[name]);				}				fx.custom(start, end, unit);			}			};	},	/**	 * Internal method to return CSS value for given element and property	 */	_getStyle: function (el, prop) {		return window.getComputedStyle(el).getPropertyValue(prop);	},	/**	 * 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],			script = doc.createElement('script');		script.type = 'text/javascript';		script.src = scriptLocation;		script.onload = callback;		head.appendChild(script);	},	/**	 * Return the index of an item in an array, or -1 if not found	 */	inArray: function (item, arr) {		return arr.indexOf ? arr.indexOf(item) : emptyArray.indexOf.call(arr, item);	},	/**	 * A direct link to adapter methods	 */	adapterRun: function (elem, method) {		return parseInt(HighchartsAdapter._getStyle(elem, method), 10);	},	/**	 * Filter an array	 */	grep: function (elements, callback) {		return emptyArray.filter.call(elements, callback);	},	/**	 * Map an array	 */	map: function (arr, fn) {		var results = [], i = 0, len = arr.length;		for (; i < len; i++) {			results[i] = fn.call(arr[i], arr[i], i, arr);		}		return results;	},	offset: function (el) {		var left = 0,			top = 0;		while (el) {			left += el.offsetLeft;			top += el.offsetTop;			el = el.offsetParent;		}		return {			left: left,			top: top		};	},	/**	 * Add an event listener	 */	addEvent: function (el, type, fn) {		augment(el).bind(type, fn);	},	/**	 * Remove event added with addEvent	 */	removeEvent: function (el, type, fn) {		augment(el).unbind(type, fn);	},	/**	 * Fire an event on a custom object	 */	fireEvent: function (el, type, eventArguments, defaultFunction) {		var e;		if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {			e = doc.createEvent('Events');			e.initEvent(type, true, true);			e.target = el;			Highcharts.extend(e, eventArguments);			if (el.dispatchEvent) {				el.dispatchEvent(e);			} else {				el.fireEvent(type, e);			}		} else if (el.HCExtended === true) {			eventArguments = eventArguments || {};			el.trigger(type, eventArguments);		}		if (eventArguments && eventArguments.defaultPrevented) {			defaultFunction = null;		}		if (defaultFunction) {			defaultFunction(eventArguments);		}	},	washMouseEvent: function (e) {		return e;	},	/**	 * Stop running animation	 */	stop: function (el) {		el.stopAnimation = true;	},	/**	 * Utility for iterating over an array. Parameters are reversed compared to jQuery.	 * @param {Array} arr	 * @param {Function} fn	 */	each: function (arr, fn) { // modern browsers		return Array.prototype.forEach.call(arr, fn);	}};}());
 |