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