UNPKG

scriptbox

Version:

Script box is a full VAS application

530 lines (528 loc) 40.5 kB
/** * 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"};