/**
 * jVectorMap version 1.2.2
 *
 * Copyright 2011-2013, Kirill Lebedev
 * Licensed under the MIT license.
 *
 */
(function(e) {
    var t = {
        set: {
            colors: 1,
            values: 1,
            backgroundColor: 1,
            scaleColors: 1,
            normalizeFunction: 1,
            focus: 1
        },
        get: {
            selectedRegions: 1,
            selectedMarkers: 1,
            mapObject: 1,
            regionName: 1
        }
    };
    e.fn.vectorMap = function(e) {
        var n, r, i, n = this.children(".jvectormap-container").data("mapObject");
        if (e === "addMap") jvm.WorldMap.maps[arguments[1]] = arguments[2];
        else {
            if (!(e !== "set" && e !== "get" || !t[e][arguments[1]])) return r = arguments[1].charAt(0).toUpperCase() + arguments[1].substr(1), n[e + r].apply(n, Array.prototype.slice.call(arguments, 2));
            e = e || {}, e.container = this, n = new jvm.WorldMap(e)
        }
        return this
    }
})(jQuery),
function(e) {
    function r(t) {
        var n = t || window.event,
            r = [].slice.call(arguments, 1),
            i = 0,
            s = !0,
            o = 0,
            u = 0;
        return t = e.event.fix(n), t.type = "mousewheel", n.wheelDelta && (i = n.wheelDelta / 120), n.detail && (i = -n.detail / 3), u = i, n.axis !== undefined && n.axis === n.HORIZONTAL_AXIS && (u = 0, o = -1 * i), n.wheelDeltaY !== undefined && (u = n.wheelDeltaY / 120), n.wheelDeltaX !== undefined && (o = -1 * n.wheelDeltaX / 120), r.unshift(t, i, o, u), (e.event.dispatch || e.event.handle).apply(this, r)
    }
    var t = ["DOMMouseScroll", "mousewheel"];
    if (e.event.fixHooks)
        for (var n = t.length; n;) e.event.fixHooks[t[--n]] = e.event.mouseHooks;
    e.event.special.mousewheel = {
        setup: function() {
            if (this.addEventListener)
                for (var e = t.length; e;) this.addEventListener(t[--e], r, !1);
            else this.onmousewheel = r
        },
        teardown: function() {
            if (this.removeEventListener)
                for (var e = t.length; e;) this.removeEventListener(t[--e], r, !1);
            else this.onmousewheel = null
        }
    }, e.fn.extend({
        mousewheel: function(e) {
            return e ? this.bind("mousewheel", e) : this.trigger("mousewheel")
        },
        unmousewheel: function(e) {
            return this.unbind("mousewheel", e)
        }
    })
}(jQuery);
var jvm = {
    inherits: function(e, t) {
        function n() {}
        n.prototype = t.prototype, e.prototype = new n, e.prototype.constructor = e, e.parentClass = t
    },
    mixin: function(e, t) {
        var n;
        for (n in t.prototype) t.prototype.hasOwnProperty(n) && (e.prototype[n] = t.prototype[n])
    },
    min: function(e) {
        var t = Number.MAX_VALUE,
            n;
        if (e instanceof Array)
            for (n = 0; n < e.length; n++) e[n] < t && (t = e[n]);
        else
            for (n in e) e[n] < t && (t = e[n]);
        return t
    },
    max: function(e) {
        var t = Number.MIN_VALUE,
            n;
        if (e instanceof Array)
            for (n = 0; n < e.length; n++) e[n] > t && (t = e[n]);
        else
            for (n in e) e[n] > t && (t = e[n]);
        return t
    },
    keys: function(e) {
        var t = [],
            n;
        for (n in e) t.push(n);
        return t
    },
    values: function(e) {
        var t = [],
            n, r;
        for (r = 0; r < arguments.length; r++) {
            e = arguments[r];
            for (n in e) t.push(e[n])
        }
        return t
    }
};
jvm.$ = jQuery, jvm.AbstractElement = function(e, t) {
    this.node = this.createElement(e), this.name = e, this.properties = {}, t && this.set(t)
}, jvm.AbstractElement.prototype.set = function(e, t) {
    var n;
    if (typeof e == "object")
        for (n in e) this.properties[n] = e[n], this.applyAttr(n, e[n]);
    else this.properties[e] = t, this.applyAttr(e, t)
}, jvm.AbstractElement.prototype.get = function(e) {
    return this.properties[e]
}, jvm.AbstractElement.prototype.applyAttr = function(e, t) {
    this.node.setAttribute(e, t)
}, jvm.AbstractElement.prototype.remove = function() {
    jvm.$(this.node).remove()
}, jvm.AbstractCanvasElement = function(e, t, n) {
    this.container = e, this.setSize(t, n), this.rootElement = new jvm[this.classPrefix + "GroupElement"], this.node.appendChild(this.rootElement.node), this.container.appendChild(this.node)
}, jvm.AbstractCanvasElement.prototype.add = function(e, t) {
    t = t || this.rootElement, t.add(e), e.canvas = this
}, jvm.AbstractCanvasElement.prototype.addPath = function(e, t, n) {
    var r = new jvm[this.classPrefix + "PathElement"](e, t);
    return this.add(r, n), r
}, jvm.AbstractCanvasElement.prototype.addCircle = function(e, t, n) {
    var r = new jvm[this.classPrefix + "CircleElement"](e, t);
    return this.add(r, n), r
}, jvm.AbstractCanvasElement.prototype.addGroup = function(e) {
    var t = new jvm[this.classPrefix + "GroupElement"];
    return e ? e.node.appendChild(t.node) : this.node.appendChild(t.node), t.canvas = this, t
}, jvm.AbstractShapeElement = function(e, t, n) {
    this.style = n || {}, this.style.current = {}, this.isHovered = !1, this.isSelected = !1, this.updateStyle()
}, jvm.AbstractShapeElement.prototype.setHovered = function(e) {
    this.isHovered !== e && (this.isHovered = e, this.updateStyle())
}, jvm.AbstractShapeElement.prototype.setSelected = function(e) {
    this.isSelected !== e && (this.isSelected = e, this.updateStyle(), jvm.$(this.node).trigger("selected", [e]))
}, jvm.AbstractShapeElement.prototype.setStyle = function(e, t) {
    var n = {};
    typeof e == "object" ? n = e : n[e] = t, jvm.$.extend(this.style.current, n), this.updateStyle()
}, jvm.AbstractShapeElement.prototype.updateStyle = function() {
    var e = {};
    jvm.AbstractShapeElement.mergeStyles(e, this.style.initial), jvm.AbstractShapeElement.mergeStyles(e, this.style.current), this.isHovered && jvm.AbstractShapeElement.mergeStyles(e, this.style.hover), this.isSelected && (jvm.AbstractShapeElement.mergeStyles(e, this.style.selected), this.isHovered && jvm.AbstractShapeElement.mergeStyles(e, this.style.selectedHover)), this.set(e)
}, jvm.AbstractShapeElement.mergeStyles = function(e, t) {
    var n;
    t = t || {};
    for (n in t) t[n] === null ? delete e[n] : e[n] = t[n]
}, jvm.SVGElement = function(e, t) {
    jvm.SVGElement.parentClass.apply(this, arguments)
}, jvm.inherits(jvm.SVGElement, jvm.AbstractElement), jvm.SVGElement.svgns = "http://www.w3.org/2000/svg", jvm.SVGElement.prototype.createElement = function(e) {
    return document.createElementNS(jvm.SVGElement.svgns, e)
}, jvm.SVGElement.prototype.addClass = function(e) {
    this.node.setAttribute("class", e)
}, jvm.SVGElement.prototype.getElementCtr = function(e) {
    return jvm["SVG" + e]
}, jvm.SVGElement.prototype.getBBox = function() {
    return this.node.getBBox()
}, jvm.SVGGroupElement = function() {
    jvm.SVGGroupElement.parentClass.call(this, "g")
}, jvm.inherits(jvm.SVGGroupElement, jvm.SVGElement), jvm.SVGGroupElement.prototype.add = function(e) {
    this.node.appendChild(e.node)
}, jvm.SVGCanvasElement = function(e, t, n) {
    this.classPrefix = "SVG", jvm.SVGCanvasElement.parentClass.call(this, "svg"), jvm.AbstractCanvasElement.apply(this, arguments)
}, jvm.inherits(jvm.SVGCanvasElement, jvm.SVGElement), jvm.mixin(jvm.SVGCanvasElement, jvm.AbstractCanvasElement), jvm.SVGCanvasElement.prototype.setSize = function(e, t) {
    this.width = e, this.height = t, this.node.setAttribute("width", e), this.node.setAttribute("height", t)
}, jvm.SVGCanvasElement.prototype.applyTransformParams = function(e, t, n) {
    this.scale = e, this.transX = t, this.transY = n, this.rootElement.node.setAttribute("transform", "scale(" + e + ") translate(" + t + ", " + n + ")")
}, jvm.SVGShapeElement = function(e, t, n) {
    jvm.SVGShapeElement.parentClass.call(this, e, t), jvm.AbstractShapeElement.apply(this, arguments)
}, jvm.inherits(jvm.SVGShapeElement, jvm.SVGElement), jvm.mixin(jvm.SVGShapeElement, jvm.AbstractShapeElement), jvm.SVGPathElement = function(e, t) {
    jvm.SVGPathElement.parentClass.call(this, "path", e, t), this.node.setAttribute("fill-rule", "evenodd")
}, jvm.inherits(jvm.SVGPathElement, jvm.SVGShapeElement), jvm.SVGCircleElement = function(e, t) {
    jvm.SVGCircleElement.parentClass.call(this, "circle", e, t)
}, jvm.inherits(jvm.SVGCircleElement, jvm.SVGShapeElement), jvm.VMLElement = function(e, t) {
    jvm.VMLElement.VMLInitialized || jvm.VMLElement.initializeVML(), jvm.VMLElement.parentClass.apply(this, arguments)
}, jvm.inherits(jvm.VMLElement, jvm.AbstractElement), jvm.VMLElement.VMLInitialized = !1, jvm.VMLElement.initializeVML = function() {
    try {
        document.namespaces.rvml || document.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"), jvm.VMLElement.prototype.createElement = function(e) {
            return document.createElement("<rvml:" + e + ' class="rvml">')
        }
    } catch (e) {
        jvm.VMLElement.prototype.createElement = function(e) {
            return document.createElement("<" + e + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')
        }
    }
    document.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"), jvm.VMLElement.VMLInitialized = !0
}, jvm.VMLElement.prototype.getElementCtr = function(e) {
    return jvm["VML" + e]
}, jvm.VMLElement.prototype.addClass = function(e) {
    jvm.$(this.node).addClass(e)
}, jvm.VMLElement.prototype.applyAttr = function(e, t) {
    this.node[e] = t
}, jvm.VMLElement.prototype.getBBox = function() {
    var e = jvm.$(this.node);
    return {
        x: e.position().left / this.canvas.scale,
        y: e.position().top / this.canvas.scale,
        width: e.width() / this.canvas.scale,
        height: e.height() / this.canvas.scale
    }
}, jvm.VMLGroupElement = function() {
    jvm.VMLGroupElement.parentClass.call(this, "group"), this.node.style.left = "0px", this.node.style.top = "0px", this.node.coordorigin = "0 0"
}, jvm.inherits(jvm.VMLGroupElement, jvm.VMLElement), jvm.VMLGroupElement.prototype.add = function(e) {
    this.node.appendChild(e.node)
}, jvm.VMLCanvasElement = function(e, t, n) {
    this.classPrefix = "VML", jvm.VMLCanvasElement.parentClass.call(this, "group"), jvm.AbstractCanvasElement.apply(this, arguments), this.node.style.position = "absolute"
}, jvm.inherits(jvm.VMLCanvasElement, jvm.VMLElement), jvm.mixin(jvm.VMLCanvasElement, jvm.AbstractCanvasElement), jvm.VMLCanvasElement.prototype.setSize = function(e, t) {
    var n, r, i, s;
    this.width = e, this.height = t, this.node.style.width = e + "px", this.node.style.height = t + "px", this.node.coordsize = e + " " + t, this.node.coordorigin = "0 0";
    if (this.rootElement) {
        n = this.rootElement.node.getElementsByTagName("shape");
        for (i = 0, s = n.length; i < s; i++) n[i].coordsize = e + " " + t, n[i].style.width = e + "px", n[i].style.height = t + "px";
        r = this.node.getElementsByTagName("group");
        for (i = 0, s = r.length; i < s; i++) r[i].coordsize = e + " " + t, r[i].style.width = e + "px", r[i].style.height = t + "px"
    }
}, jvm.VMLCanvasElement.prototype.applyTransformParams = function(e, t, n) {
    this.scale = e, this.transX = t, this.transY = n, this.rootElement.node.coordorigin = this.width - t - this.width / 100 + "," + (this.height - n - this.height / 100), this.rootElement.node.coordsize = this.width / e + "," + this.height / e
}, jvm.VMLShapeElement = function(e, t) {
    jvm.VMLShapeElement.parentClass.call(this, e, t), this.fillElement = new jvm.VMLElement("fill"), this.strokeElement = new jvm.VMLElement("stroke"), this.node.appendChild(this.fillElement.node), this.node.appendChild(this.strokeElement.node), this.node.stroked = !1, jvm.AbstractShapeElement.apply(this, arguments)
}, jvm.inherits(jvm.VMLShapeElement, jvm.VMLElement), jvm.mixin(jvm.VMLShapeElement, jvm.AbstractShapeElement), jvm.VMLShapeElement.prototype.applyAttr = function(e, t) {
    switch (e) {
        case "fill":
            this.node.fillcolor = t;
            break;
        case "fill-opacity":
            this.fillElement.node.opacity = Math.round(t * 100) + "%";
            break;
        case "stroke":
            t === "none" ? this.node.stroked = !1 : this.node.stroked = !0, this.node.strokecolor = t;
            break;
        case "stroke-opacity":
            this.strokeElement.node.opacity = Math.round(t * 100) + "%";
            break;
        case "stroke-width":
            parseInt(t, 10) === 0 ? this.node.stroked = !1 : this.node.stroked = !0, this.node.strokeweight = t;
            break;
        case "d":
            this.node.path = jvm.VMLPathElement.pathSvgToVml(t);
            break;
        default:
            jvm.VMLShapeElement.parentClass.prototype.applyAttr.apply(this, arguments)
    }
}, jvm.VMLPathElement = function(e, t) {
    var n = new jvm.VMLElement("skew");
    jvm.VMLPathElement.parentClass.call(this, "shape", e, t), this.node.coordorigin = "0 0", n.node.on = !0, n.node.matrix = "0.01,0,0,0.01,0,0", n.node.offset = "0,0", this.node.appendChild(n.node)
}, jvm.inherits(jvm.VMLPathElement, jvm.VMLShapeElement), jvm.VMLPathElement.prototype.applyAttr = function(e, t) {
    e === "d" ? this.node.path = jvm.VMLPathElement.pathSvgToVml(t) : jvm.VMLShapeElement.prototype.applyAttr.call(this, e, t)
}, jvm.VMLPathElement.pathSvgToVml = function(e) {
    var t = "",
        n = 0,
        r = 0,
        i, s;
    return e = e.replace(/(-?\d+)e(-?\d+)/g, "0"), e.replace(/([MmLlHhVvCcSs])\s*((?:-?\d*(?:\.\d+)?\s*,?\s*)+)/g, function(e, t, o, u) {
        o = o.replace(/(\d)-/g, "$1,-").replace(/^\s+/g, "").replace(/\s+$/g, "").replace(/\s+/g, ",").split(","), o[0] || o.shift();
        for (var a = 0, f = o.length; a < f; a++) o[a] = Math.round(100 * o[a]);
        switch (t) {
            case "m":
                return n += o[0], r += o[1], "t" + o.join(",");
            case "M":
                return n = o[0], r = o[1], "m" + o.join(",");
            case "l":
                return n += o[0], r += o[1], "r" + o.join(",");
            case "L":
                return n = o[0], r = o[1], "l" + o.join(",");
            case "h":
                return n += o[0], "r" + o[0] + ",0";
            case "H":
                return n = o[0], "l" + n + "," + r;
            case "v":
                return r += o[0], "r0," + o[0];
            case "V":
                return r = o[0], "l" + n + "," + r;
            case "c":
                return i = n + o[o.length - 4], s = r + o[o.length - 3], n += o[o.length - 2], r += o[o.length - 1], "v" + o.join(",");
            case "C":
                return i = o[o.length - 4], s = o[o.length - 3], n = o[o.length - 2], r = o[o.length - 1], "c" + o.join(",");
            case "s":
                return o.unshift(r - s), o.unshift(n - i), i = n + o[o.length - 4], s = r + o[o.length - 3], n += o[o.length - 2], r += o[o.length - 1], "v" + o.join(",");
            case "S":
                return o.unshift(r + r - s), o.unshift(n + n - i), i = o[o.length - 4], s = o[o.length - 3], n = o[o.length - 2], r = o[o.length - 1], "c" + o.join(",")
        }
        return ""
    }).replace(/z/g, "e")
}, jvm.VMLCircleElement = function(e, t) {
    jvm.VMLCircleElement.parentClass.call(this, "oval", e, t)
}, jvm.inherits(jvm.VMLCircleElement, jvm.VMLShapeElement), jvm.VMLCircleElement.prototype.applyAttr = function(e, t) {
    switch (e) {
        case "r":
            this.node.style.width = t * 2 + "px", this.node.style.height = t * 2 + "px", this.applyAttr("cx", this.get("cx") || 0), this.applyAttr("cy", this.get("cy") || 0);
            break;
        case "cx":
            if (!t) return;
            this.node.style.left = t - (this.get("r") || 0) + "px";
            break;
        case "cy":
            if (!t) return;
            this.node.style.top = t - (this.get("r") || 0) + "px";
            break;
        default:
            jvm.VMLCircleElement.parentClass.prototype.applyAttr.call(this, e, t)
    }
}, jvm.VectorCanvas = function(e, t, n) {
    return this.mode = window.SVGAngle ? "svg" : "vml", this.mode == "svg" ? this.impl = new jvm.SVGCanvasElement(e, t, n) : this.impl = new jvm.VMLCanvasElement(e, t, n), this.impl
}, jvm.SimpleScale = function(e) {
    this.scale = e
}, jvm.SimpleScale.prototype.getValue = function(e) {
    return e
}, jvm.OrdinalScale = function(e) {
    this.scale = e
}, jvm.OrdinalScale.prototype.getValue = function(e) {
    return this.scale[e]
}, jvm.NumericScale = function(e, t, n, r) {
    this.scale = [], t = t || "linear", e && this.setScale(e), t && this.setNormalizeFunction(t), n && this.setMin(n), r && this.setMax(r)
}, jvm.NumericScale.prototype = {
    setMin: function(e) {
        this.clearMinValue = e, typeof this.normalize == "function" ? this.minValue = this.normalize(e) : this.minValue = e
    },
    setMax: function(e) {
        this.clearMaxValue = e, typeof this.normalize == "function" ? this.maxValue = this.normalize(e) : this.maxValue = e
    },
    setScale: function(e) {
        var t;
        for (t = 0; t < e.length; t++) this.scale[t] = [e[t]]
    },
    setNormalizeFunction: function(e) {
        e === "polynomial" ? this.normalize = function(e) {
            return Math.pow(e, .2)
        } : e === "linear" ? delete this.normalize : this.normalize = e, this.setMin(this.clearMinValue), this.setMax(this.clearMaxValue)
    },
    getValue: function(e) {
        var t = [],
            n = 0,
            r, i = 0,
            s;
        typeof this.normalize == "function" && (e = this.normalize(e));
        for (i = 0; i < this.scale.length - 1; i++) r = this.vectorLength(this.vectorSubtract(this.scale[i + 1], this.scale[i])), t.push(r), n += r;
        s = (this.maxValue - this.minValue) / n;
        for (i = 0; i < t.length; i++) t[i] *= s;
        i = 0, e -= this.minValue;
        while (e - t[i] >= 0) e -= t[i], i++;
        return i == this.scale.length - 1 ? e = this.vectorToNum(this.scale[i]) : e = this.vectorToNum(this.vectorAdd(this.scale[i], this.vectorMult(this.vectorSubtract(this.scale[i + 1], this.scale[i]), e / t[i]))), e
    },
    vectorToNum: function(e) {
        var t = 0,
            n;
        for (n = 0; n < e.length; n++) t += Math.round(e[n]) * Math.pow(256, e.length - n - 1);
        return t
    },
    vectorSubtract: function(e, t) {
        var n = [],
            r;
        for (r = 0; r < e.length; r++) n[r] = e[r] - t[r];
        return n
    },
    vectorAdd: function(e, t) {
        var n = [],
            r;
        for (r = 0; r < e.length; r++) n[r] = e[r] + t[r];
        return n
    },
    vectorMult: function(e, t) {
        var n = [],
            r;
        for (r = 0; r < e.length; r++) n[r] = e[r] * t;
        return n
    },
    vectorLength: function(e) {
        var t = 0,
            n;
        for (n = 0; n < e.length; n++) t += e[n] * e[n];
        return Math.sqrt(t)
    }
}, jvm.ColorScale = function(e, t, n, r) {
    jvm.ColorScale.parentClass.apply(this, arguments)
}, jvm.inherits(jvm.ColorScale, jvm.NumericScale), jvm.ColorScale.prototype.setScale = function(e) {
    var t;
    for (t = 0; t < e.length; t++) this.scale[t] = jvm.ColorScale.rgbToArray(e[t])
}, jvm.ColorScale.prototype.getValue = function(e) {
    return jvm.ColorScale.numToRgb(jvm.ColorScale.parentClass.prototype.getValue.call(this, e))
}, jvm.ColorScale.arrayToRgb = function(e) {
    var t = "#",
        n, r;
    for (r = 0; r < e.length; r++) n = e[r].toString(16), t += n.length == 1 ? "0" + n : n;
    return t
}, jvm.ColorScale.numToRgb = function(e) {
    e = e.toString(16);
    while (e.length < 6) e = "0" + e;
    return "#" + e
}, jvm.ColorScale.rgbToArray = function(e) {
    return e = e.substr(1), [parseInt(e.substr(0, 2), 16), parseInt(e.substr(2, 2), 16), parseInt(e.substr(4, 2), 16)]
}, jvm.DataSeries = function(e, t) {
    var n;
    e = e || {}, e.attribute = e.attribute || "fill", this.elements = t, this.params = e, e.attributes && this.setAttributes(e.attributes), jvm.$.isArray(e.scale) ? (n = e.attribute === "fill" || e.attribute === "stroke" ? jvm.ColorScale : jvm.NumericScale, this.scale = new n(e.scale, e.normalizeFunction, e.min, e.max)) : e.scale ? this.scale = new jvm.OrdinalScale(e.scale) : this.scale = new jvm.SimpleScale(e.scale), this.values = e.values || {}, this.setValues(this.values)
}, jvm.DataSeries.prototype = {
    setAttributes: function(e, t) {
        var n = e,
            r;
        if (typeof e == "string") this.elements[e] && this.elements[e].setStyle(this.params.attribute, t);
        else
            for (r in n) this.elements[r] && this.elements[r].element.setStyle(this.params.attribute, n[r])
    },
    setValues: function(e) {
        var t = Number.MIN_VALUE,
            n = Number.MAX_VALUE,
            r, i, s = {};
        if (this.scale instanceof jvm.OrdinalScale || this.scale instanceof jvm.SimpleScale)
            for (i in e) e[i] ? s[i] = this.scale.getValue(e[i]) : s[i] = this.elements[i].element.style.initial[this.params.attribute];
        else {
            if (!this.params.min || !this.params.max) {
                for (i in e) r = parseFloat(e[i]), r > t && (t = e[i]), r < n && (n = r);
                this.params.min || this.scale.setMin(n), this.params.max || this.scale.setMax(t), this.params.min = n, this.params.max = t
            }
            for (i in e) r = parseFloat(e[i]), isNaN(r) ? s[i] = this.elements[i].element.style.initial[this.params.attribute] : s[i] = this.scale.getValue(r)
        }
        this.setAttributes(s), jvm.$.extend(this.values, e)
    },
    clear: function() {
        var e, t = {};
        for (e in this.values) this.elements[e] && (t[e] = this.elements[e].element.style.initial[this.params.attribute]);
        this.setAttributes(t), this.values = {}
    },
    setScale: function(e) {
        this.scale.setScale(e), this.values && this.setValues(this.values)
    },
    setNormalizeFunction: function(e) {
        this.scale.setNormalizeFunction(e), this.values && this.setValues(this.values)
    }
}, jvm.Proj = {
    degRad: 180 / Math.PI,
    radDeg: Math.PI / 180,
    radius: 6381372,
    sgn: function(e) {
        return e > 0 ? 1 : e < 0 ? -1 : e
    },
    mill: function(e, t, n) {
        return {
            x: this.radius * (t - n) * this.radDeg,
            y: -this.radius * Math.log(Math.tan((45 + .4 * e) * this.radDeg)) / .8
        }
    },
    mill_inv: function(e, t, n) {
        return {
            lat: (2.5 * Math.atan(Math.exp(.8 * t / this.radius)) - 5 * Math.PI / 8) * this.degRad,
            lng: (n * this.radDeg + e / this.radius) * this.degRad
        }
    },
    merc: function(e, t, n) {
        return {
            x: this.radius * (t - n) * this.radDeg,
            y: -this.radius * Math.log(Math.tan(Math.PI / 4 + e * Math.PI / 360))
        }
    },
    merc_inv: function(e, t, n) {
        return {
            lat: (2 * Math.atan(Math.exp(t / this.radius)) - Math.PI / 2) * this.degRad,
            lng: (n * this.radDeg + e / this.radius) * this.degRad
        }
    },
    aea: function(e, t, n) {
        var r = 0,
            i = n * this.radDeg,
            s = 29.5 * this.radDeg,
            o = 45.5 * this.radDeg,
            u = e * this.radDeg,
            a = t * this.radDeg,
            f = (Math.sin(s) + Math.sin(o)) / 2,
            l = Math.cos(s) * Math.cos(s) + 2 * f * Math.sin(s),
            c = f * (a - i),
            h = Math.sqrt(l - 2 * f * Math.sin(u)) / f,
            p = Math.sqrt(l - 2 * f * Math.sin(r)) / f;
        return {
            x: h * Math.sin(c) * this.radius,
            y: -(p - h * Math.cos(c)) * this.radius
        }
    },
    aea_inv: function(e, t, n) {
        var r = e / this.radius,
            i = t / this.radius,
            s = 0,
            o = n * this.radDeg,
            u = 29.5 * this.radDeg,
            a = 45.5 * this.radDeg,
            f = (Math.sin(u) + Math.sin(a)) / 2,
            l = Math.cos(u) * Math.cos(u) + 2 * f * Math.sin(u),
            c = Math.sqrt(l - 2 * f * Math.sin(s)) / f,
            h = Math.sqrt(r * r + (c - i) * (c - i)),
            p = Math.atan(r / (c - i));
        return {
            lat: Math.asin((l - h * h * f * f) / (2 * f)) * this.degRad,
            lng: (o + p / f) * this.degRad
        }
    },
    lcc: function(e, t, n) {
        var r = 0,
            i = n * this.radDeg,
            s = t * this.radDeg,
            o = 33 * this.radDeg,
            u = 45 * this.radDeg,
            a = e * this.radDeg,
            f = Math.log(Math.cos(o) * (1 / Math.cos(u))) / Math.log(Math.tan(Math.PI / 4 + u / 2) * (1 / Math.tan(Math.PI / 4 + o / 2))),
            l = Math.cos(o) * Math.pow(Math.tan(Math.PI / 4 + o / 2), f) / f,
            c = l * Math.pow(1 / Math.tan(Math.PI / 4 + a / 2), f),
            h = l * Math.pow(1 / Math.tan(Math.PI / 4 + r / 2), f);
        return {
            x: c * Math.sin(f * (s - i)) * this.radius,
            y: -(h - c * Math.cos(f * (s - i))) * this.radius
        }
    },
    lcc_inv: function(e, t, n) {
        var r = e / this.radius,
            i = t / this.radius,
            s = 0,
            o = n * this.radDeg,
            u = 33 * this.radDeg,
            a = 45 * this.radDeg,
            f = Math.log(Math.cos(u) * (1 / Math.cos(a))) / Math.log(Math.tan(Math.PI / 4 + a / 2) * (1 / Math.tan(Math.PI / 4 + u / 2))),
            l = Math.cos(u) * Math.pow(Math.tan(Math.PI / 4 + u / 2), f) / f,
            c = l * Math.pow(1 / Math.tan(Math.PI / 4 + s / 2), f),
            h = this.sgn(f) * Math.sqrt(r * r + (c - i) * (c - i)),
            p = Math.atan(r / (c - i));
        return {
            lat: (2 * Math.atan(Math.pow(l / h, 1 / f)) - Math.PI / 2) * this.degRad,
            lng: (o + p / f) * this.degRad
        }
    }
}, jvm.WorldMap = function(e) {
    var t = this,
        n;
    this.params = jvm.$.extend(!0, {}, jvm.WorldMap.defaultParams, e);
    if (!jvm.WorldMap.maps[this.params.map]) throw new Error("Attempt to use map which was not loaded: " + this.params.map);
    this.mapData = jvm.WorldMap.maps[this.params.map], this.markers = {}, this.regions = {}, this.regionsColors = {}, this.regionsData = {}, this.container = jvm.$("<div>").css({
        width: "100%",
        height: "100%"
    }).addClass("jvectormap-container"), this.params.container.append(this.container), this.container.data("mapObject", this), this.container.css({
        position: "relative",
        overflow: "hidden"
    }), this.defaultWidth = this.mapData.width, this.defaultHeight = this.mapData.height, this.setBackgroundColor(this.params.backgroundColor), this.onResize = function() {
        t.setSize()
    }, jvm.$(window).resize(this.onResize);
    for (n in jvm.WorldMap.apiEvents) this.params[n] && this.container.bind(jvm.WorldMap.apiEvents[n] + ".jvectormap", this.params[n]);
    this.canvas = new jvm.VectorCanvas(this.container[0], this.width, this.height), "ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch ? this.params.bindTouchEvents && this.bindContainerTouchEvents() : this.bindContainerEvents(), this.bindElementEvents(), this.createLabel(), this.params.zoomButtons && this.bindZoomButtons(), this.createRegions(), this.createMarkers(this.params.markers || {}), this.setSize(), this.params.focusOn && (typeof this.params.focusOn == "object" ? this.setFocus.call(this, this.params.focusOn.scale, this.params.focusOn.x, this.params.focusOn.y) : this.setFocus.call(this, this.params.focusOn)), this.params.selectedRegions && this.setSelectedRegions(this.params.selectedRegions), this.params.selectedMarkers && this.setSelectedMarkers(this.params.selectedMarkers), this.params.series && this.createSeries()
}, jvm.WorldMap.prototype = {
    transX: 0,
    transY: 0,
    scale: 1,
    baseTransX: 0,
    baseTransY: 0,
    baseScale: 1,
    width: 0,
    height: 0,
    setBackgroundColor: function(e) {
        this.container.css("background-color", e)
    },
    resize: function() {
        var e = this.baseScale;
        this.width / this.height > this.defaultWidth / this.defaultHeight ? (this.baseScale = this.height / this.defaultHeight, this.baseTransX = Math.abs(this.width - this.defaultWidth * this.baseScale) / (2 * this.baseScale)) : (this.baseScale = this.width / this.defaultWidth, this.baseTransY = Math.abs(this.height - this.defaultHeight * this.baseScale) / (2 * this.baseScale)), this.scale *= this.baseScale / e, this.transX *= this.baseScale / e, this.transY *= this.baseScale / e
    },
    setSize: function() {
        this.width = this.container.width(), this.height = this.container.height(), this.resize(), this.canvas.setSize(this.width, this.height), this.applyTransform()
    },
    reset: function() {
        var e, t;
        for (e in this.series)
            for (t = 0; t < this.series[e].length; t++) this.series[e][t].clear();
        this.scale = this.baseScale, this.transX = this.baseTransX, this.transY = this.baseTransY, this.applyTransform()
    },
    applyTransform: function() {
        var e, t, n, r;
        this.defaultWidth * this.scale <= this.width ? (e = (this.width - this.defaultWidth * this.scale) / (2 * this.scale), n = (this.width - this.defaultWidth * this.scale) / (2 * this.scale)) : (e = 0, n = (this.width - this.defaultWidth * this.scale) / this.scale), this.defaultHeight * this.scale <= this.height ? (t = (this.height - this.defaultHeight * this.scale) / (2 * this.scale), r = (this.height - this.defaultHeight * this.scale) / (2 * this.scale)) : (t = 0, r = (this.height - this.defaultHeight * this.scale) / this.scale), this.transY > t ? this.transY = t : this.transY < r && (this.transY = r), this.transX > e ? this.transX = e : this.transX < n && (this.transX = n), this.canvas.applyTransformParams(this.scale, this.transX, this.transY), this.markers && this.repositionMarkers(), this.container.trigger("viewportChange", [this.scale / this.baseScale, this.transX, this.transY])
    },
    bindContainerEvents: function() {
        var e = !1,
            t, n, r = this;
        this.container.mousemove(function(i) {
            return e && (r.transX -= (t - i.pageX) / r.scale, r.transY -= (n - i.pageY) / r.scale, r.applyTransform(), t = i.pageX, n = i.pageY), !1
        }).mousedown(function(r) {
            return e = !0, t = r.pageX, n = r.pageY, !1
        }), jvm.$("body").mouseup(function() {
            e = !1
        }), this.params.zoomOnScroll && this.container.mousewheel(function(e, t, n, i) {
            var s = jvm.$(r.container).offset(),
                o = e.pageX - s.left,
                u = e.pageY - s.top,
                a = Math.pow(1.3, i);
            r.label.hide(), r.setScale(r.scale * a, o, u), e.preventDefault()
        })
    },
    bindContainerTouchEvents: function() {
        var e, t, n = this,
            r, i, s, o, u, a = function(a) {
                var f = a.originalEvent.touches,
                    l, c, h, p;
                a.type == "touchstart" && (u = 0), f.length == 1 ? (u == 1 && (h = n.transX, p = n.transY, n.transX -= (r - f[0].pageX) / n.scale, n.transY -= (i - f[0].pageY) / n.scale, n.applyTransform(), n.label.hide(), (h != n.transX || p != n.transY) && a.preventDefault()), r = f[0].pageX, i = f[0].pageY) : f.length == 2 && (u == 2 ? (c = Math.sqrt(Math.pow(f[0].pageX - f[1].pageX, 2) + Math.pow(f[0].pageY - f[1].pageY, 2)) / t, n.setScale(e * c, s, o), n.label.hide(), a.preventDefault()) : (l = jvm.$(n.container).offset(), f[0].pageX > f[1].pageX ? s = f[1].pageX + (f[0].pageX - f[1].pageX) / 2 : s = f[0].pageX + (f[1].pageX - f[0].pageX) / 2, f[0].pageY > f[1].pageY ? o = f[1].pageY + (f[0].pageY - f[1].pageY) / 2 : o = f[0].pageY + (f[1].pageY - f[0].pageY) / 2, s -= l.left, o -= l.top, e = n.scale, t = Math.sqrt(Math.pow(f[0].pageX - f[1].pageX, 2) + Math.pow(f[0].pageY - f[1].pageY, 2)))), u = f.length
            };
        jvm.$(this.container).bind("touchstart", a), jvm.$(this.container).bind("touchmove", a)
    },
    bindElementEvents: function() {
        var e = this,
            t;
        this.container.mousemove(function() {
            t = !0
        }), this.container.delegate("[class~='jvectormap-element']", "mouseover mouseout", function(t) {
            var n = this,
                r = jvm.$(this).attr("class").baseVal ? jvm.$(this).attr("class").baseVal : jvm.$(this).attr("class"),
                i = r.indexOf("jvectormap-region") === -1 ? "marker" : "region",
                s = i == "region" ? jvm.$(this).attr("data-code") : jvm.$(this).attr("data-index"),
                o = i == "region" ? e.regions[s].element : e.markers[s].element,
                u = i == "region" ? e.mapData.paths[s].name : e.markers[s].config.name || "",
                a = jvm.$.Event(i + "LabelShow.jvectormap"),
                f = jvm.$.Event(i + "Over.jvectormap");
            t.type == "mouseover" ? (e.container.trigger(f, [s]), f.isDefaultPrevented() || o.setHovered(!0), e.label.text(u), e.container.trigger(a, [e.label, s]), a.isDefaultPrevented() || (e.label.show(), e.labelWidth = e.label.width(), e.labelHeight = e.label.height())) : (o.setHovered(!1), e.label.hide(), e.container.trigger(i + "Out.jvectormap", [s]))
        }), this.container.delegate("[class~='jvectormap-element']", "mousedown", function(e) {
            t = !1
        }), this.container.delegate("[class~='jvectormap-element']", "mouseup", function(n) {
            var r = this,
                i = jvm.$(this).attr("class").baseVal ? jvm.$(this).attr("class").baseVal : jvm.$(this).attr("class"),
                s = i.indexOf("jvectormap-region") === -1 ? "marker" : "region",
                o = s == "region" ? jvm.$(this).attr("data-code") : jvm.$(this).attr("data-index"),
                u = jvm.$.Event(s + "Click.jvectormap"),
                a = s == "region" ? e.regions[o].element : e.markers[o].element;
            if (!t) {
                e.container.trigger(u, [o]);
                if (s === "region" && e.params.regionsSelectable || s === "marker" && e.params.markersSelectable) u.isDefaultPrevented() || (e.params[s + "sSelectableOne"] && e.clearSelected(s + "s"), a.setSelected(!a.isSelected))
            }
        })
    },
    bindZoomButtons: function() {
        var e = this;
        jvm.$("<div/>").addClass("jvectormap-zoomin").text("+").appendTo(this.container), jvm.$("<div/>").addClass("jvectormap-zoomout").html("&#x2212;").appendTo(this.container), this.container.find(".jvectormap-zoomin").click(function() {
            e.setScale(e.scale * e.params.zoomStep, e.width / 2, e.height / 2)
        }), this.container.find(".jvectormap-zoomout").click(function() {
            e.setScale(e.scale / e.params.zoomStep, e.width / 2, e.height / 2)
        })
    },
    createLabel: function() {
        var e = this;
        this.label = jvm.$("<div/>").addClass("jvectormap-label").appendTo(jvm.$("body")), this.container.mousemove(function(t) {
            var n = t.pageX - 15 - e.labelWidth,
                r = t.pageY - 15 - e.labelHeight;
            n < 5 && (n = t.pageX + 15), r < 5 && (r = t.pageY + 15), e.label.is(":visible") && e.label.css({
                left: n,
                top: r
            })
        })
    },
    setScale: function(e, t, n, r) {
        var i, s = jvm.$.Event("zoom.jvectormap");
        e > this.params.zoomMax * this.baseScale ? e = this.params.zoomMax * this.baseScale : e < this.params.zoomMin * this.baseScale && (e = this.params.zoomMin * this.baseScale), typeof t != "undefined" && typeof n != "undefined" && (i = e / this.scale, r ? (this.transX = t + this.defaultWidth * (this.width / (this.defaultWidth * e)) / 2, this.transY = n + this.defaultHeight * (this.height / (this.defaultHeight * e)) / 2) : (this.transX -= (i - 1) / e * t, this.transY -= (i - 1) / e * n)), this.scale = e, this.applyTransform(), this.container.trigger(s, [e / this.baseScale])
    },
    setFocus: function(e, t, n) {
        var r, i, s, o, u;
        if (jvm.$.isArray(e) || this.regions[e]) {
            jvm.$.isArray(e) ? o = e : o = [e];
            for (u = 0; u < o.length; u++) this.regions[o[u]] && (i = this.regions[o[u]].element.getBBox(), i && (typeof r == "undefined" ? r = i : (s = {
                x: Math.min(r.x, i.x),
                y: Math.min(r.y, i.y),
                width: Math.max(r.x + r.width, i.x + i.width) - Math.min(r.x, i.x),
                height: Math.max(r.y + r.height, i.y + i.height) - Math.min(r.y, i.y)
            }, r = s)));
            this.setScale(Math.min(this.width / r.width, this.height / r.height), -(r.x + r.width / 2), -(r.y + r.height / 2), !0)
        } else e *= this.baseScale, this.setScale(e, -t * this.defaultWidth, -n * this.defaultHeight, !0)
    },
    getSelected: function(e) {
        var t, n = [];
        for (t in this[e]) this[e][t].element.isSelected && n.push(t);
        return n
    },
    getSelectedRegions: function() {
        return this.getSelected("regions")
    },
    getSelectedMarkers: function() {
        return this.getSelected("markers")
    },
    setSelected: function(e, t) {
        var n;
        typeof t != "object" && (t = [t]);
        if (jvm.$.isArray(t))
            for (n = 0; n < t.length; n++) this[e][t[n]].element.setSelected(!0);
        else
            for (n in t) this[e][n].element.setSelected(!!t[n])
    },
    setSelectedRegions: function(e) {
        this.setSelected("regions", e)
    },
    setSelectedMarkers: function(e) {
        this.setSelected("markers", e)
    },
    clearSelected: function(e) {
        var t = {},
            n = this.getSelected(e),
            r;
        for (r = 0; r < n.length; r++) t[n[r]] = !1;
        this.setSelected(e, t)
    },
    clearSelectedRegions: function() {
        this.clearSelected("regions")
    },
    clearSelectedMarkers: function() {
        this.clearSelected("markers")
    },
    getMapObject: function() {
        return this
    },
    getRegionName: function(e) {
        return this.mapData.paths[e].name
    },
    createRegions: function() {
        var e, t, n = this;
        for (e in this.mapData.paths) t = this.canvas.addPath({
            d: this.mapData.paths[e].path,
            "data-code": e
        }, jvm.$.extend(!0, {}, this.params.regionStyle)), jvm.$(t.node).bind("selected", function(e, t) {
            n.container.trigger("regionSelected.jvectormap", [jvm.$(this).attr("data-code"), t, n.getSelectedRegions()])
        }), t.addClass("jvectormap-region jvectormap-element"), this.regions[e] = {
            element: t,
            config: this.mapData.paths[e]
        }
    },
    createMarkers: function(e) {
        var t, n, r, i, s, o = this;
        this.markersGroup = this.markersGroup || this.canvas.addGroup();
        if (jvm.$.isArray(e)) {
            s = e.slice(), e = {};
            for (t = 0; t < s.length; t++) e[t] = s[t]
        }
        for (t in e) i = e[t] instanceof Array ? {
            latLng: e[t]
        } : e[t], r = this.getMarkerPosition(i), r !== !1 && (n = this.canvas.addCircle({
            "data-index": t,
            cx: r.x,
            cy: r.y
        }, jvm.$.extend(!0, {}, this.params.markerStyle, {
            initial: i.style || {}
        }), this.markersGroup), n.addClass("jvectormap-marker jvectormap-element"), jvm.$(n.node).bind("selected", function(e, t) {
            o.container.trigger("markerSelected.jvectormap", [jvm.$(this).attr("data-index"), t, o.getSelectedMarkers()])
        }), this.markers[t] && this.removeMarkers([t]), this.markers[t] = {
            element: n,
            config: i
        })
    },
    repositionMarkers: function() {
        var e, t;
        for (e in this.markers) t = this.getMarkerPosition(this.markers[e].config), t !== !1 && this.markers[e].element.setStyle({
            cx: t.x,
            cy: t.y
        })
    },
    getMarkerPosition: function(e) {
        return jvm.WorldMap.maps[this.params.map].projection ? this.latLngToPoint.apply(this, e.latLng || [0, 0]) : {
            x: e.coords[0] * this.scale + this.transX * this.scale,
            y: e.coords[1] * this.scale + this.transY * this.scale
        }
    },
    addMarker: function(e, t, n) {
        var r = {},
            i = [],
            s, o, n = n || [];
        r[e] = t;
        for (o = 0; o < n.length; o++) s = {}, s[e] = n[o], i.push(s);
        this.addMarkers(r, i)
    },
    addMarkers: function(e, t) {
        var n;
        t = t || [], this.createMarkers(e);
        for (n = 0; n < t.length; n++) this.series.markers[n].setValues(t[n] || {})
    },
    removeMarkers: function(e) {
        var t;
        for (t = 0; t < e.length; t++) this.markers[e[t]].element.remove(), delete this.markers[e[t]]
    },
    removeAllMarkers: function() {
        var e, t = [];
        for (e in this.markers) t.push(e);
        this.removeMarkers(t)
    },
    latLngToPoint: function(e, t) {
        var n, r = jvm.WorldMap.maps[this.params.map].projection,
            i = r.centralMeridian,
            s = this.width - this.baseTransX * 2 * this.baseScale,
            o = this.height - this.baseTransY * 2 * this.baseScale,
            u, a, f = this.scale / this.baseScale;
        return t < -180 + i && (t += 360), n = jvm.Proj[r.type](e, t, i), u = this.getInsetForPoint(n.x, n.y), u ? (a = u.bbox, n.x = (n.x - a[0].x) / (a[1].x - a[0].x) * u.width * this.scale, n.y = (n.y - a[0].y) / (a[1].y - a[0].y) * u.height * this.scale, {
            x: n.x + this.transX * this.scale + u.left * this.scale,
            y: n.y + this.transY * this.scale + u.top * this.scale
        }) : !1
    },
    pointToLatLng: function(e, t) {
        var n = jvm.WorldMap.maps[this.params.map].projection,
            r = n.centralMeridian,
            i = jvm.WorldMap.maps[this.params.map].insets,
            s, o, u, a, f;
        for (s = 0; s < i.length; s++) {
            o = i[s], u = o.bbox, a = e - (this.transX * this.scale + o.left * this.scale), f = t - (this.transY * this.scale + o.top * this.scale), a = a / (o.width * this.scale) * (u[1].x - u[0].x) + u[0].x, f = f / (o.height * this.scale) * (u[1].y - u[0].y) + u[0].y;
            if (a > u[0].x && a < u[1].x && f > u[0].y && f < u[1].y) return jvm.Proj[n.type + "_inv"](a, -f, r)
        }
        return !1
    },
    getInsetForPoint: function(e, t) {
        var n = jvm.WorldMap.maps[this.params.map].insets,
            r, i;
        for (r = 0; r < n.length; r++) {
            i = n[r].bbox;
            if (e > i[0].x && e < i[1].x && t > i[0].y && t < i[1].y) return n[r]
        }
    },
    createSeries: function() {
        var e, t;
        this.series = {
            markers: [],
            regions: []
        };
        for (t in this.params.series)
            for (e = 0; e < this.params.series[t].length; e++) this.series[t][e] = new jvm.DataSeries(this.params.series[t][e], this[t])
    },
    remove: function() {
        this.label.remove(), this.container.remove(), jvm.$(window).unbind("resize", this.onResize)
    }
}, jvm.WorldMap.maps = {}, jvm.WorldMap.defaultParams = {
    map: "world_mill_en",
    backgroundColor: "#505050",
    zoomButtons: !0,
    zoomOnScroll: !0,
    zoomMax: 8,
    zoomMin: 1,
    zoomStep: 1.6,
    regionsSelectable: !1,
    markersSelectable: !1,
    bindTouchEvents: !0,
    regionStyle: {
        initial: {
            fill: "white",
            "fill-opacity": 1,
            stroke: "none",
            "stroke-width": 0,
            "stroke-opacity": 1
        },
        hover: {
            "fill-opacity": .8
        },
        selected: {
            fill: "yellow"
        },
        selectedHover: {}
    },
    markerStyle: {
        initial: {
            fill: "grey",
            stroke: "#505050",
            "fill-opacity": 1,
            "stroke-width": 1,
            "stroke-opacity": 1,
            r: 5
        },
        hover: {
            stroke: "black",
            "stroke-width": 2
        },
        selected: {
            fill: "blue"
        },
        selectedHover: {}
    }
}, jvm.WorldMap.apiEvents = {
    onRegionLabelShow: "regionLabelShow",
    onRegionOver: "regionOver",
    onRegionOut: "regionOut",
    onRegionClick: "regionClick",
    onRegionSelected: "regionSelected",
    onMarkerLabelShow: "markerLabelShow",
    onMarkerOver: "markerOver",
    onMarkerOut: "markerOut",
    onMarkerClick: "markerClick",
    onMarkerSelected: "markerSelected",
    onViewportChange: "viewportChange"
};